我已经创建了一个自定义的MVC Model Binder,每个进入服务器的HttpPost
都会调用它。但是对于HttpGet
请求不会被调用。
GET
**?期间被调用如果是这样的话,我miss?**QueryString
GET
Request?处理的自定义代码
这是我的实现..。
public class CustomModelBinder : DefaultModelBinder
{
public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
{
// This only gets called for POST requests. But I need this code for GET requests.
}
}
Global.asax
protected void Application_Start()
{
ModelBinders.Binders.DefaultBinder = new CustomModelBinder();
//...
}
我已经研究了这些解决方案,但它们并不能完全满足我的需求:
通过构建复杂类型的缺省绑定器TempData
?Name=John&Surname=Doe
)的
对答案进行备注
感谢@Felipe的帮助。为了防止有人为同样的问题而苦苦挣扎,我学会了:
GET
Requests DefaultModelBinder
类GET
请求将跳过模型绑定器,这是有道理的)发布于 2015-09-03 19:36:30
让我们假设你有你自己想要绑定的类型。
public class Person
{
public int Id { get; set; }
public string Name { get; set; }
public int Age { get; set; }
// other properties you need
}
您可以为此特定类型创建自定义模型绑定,继承自DefaultModelBinder
,用于示例:
public class PersonModelBinder : DefaultModelBinder
{
public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
{
var request = controllerContext.HttpContext.Request;
int id = Convert.ToInt32(request.QueryString["id"]);
string name = request.QueryString["name"];
int age = Convert.ToInt32(request.QueryString["age"]);
// other properties
return new Person { Id = id, Name = name, Age = age };
}
}
在Application_Start
事件的Global.asax中,您可以注册此模型绑定,例如:
// for Person type, bind with the PersonModelBinder
ModelBinders.Binders.Add(typeof(Person), new PersonModelBinder());
在PersonModelBinder
的BindModel
方法中,确保查询字符串中包含所有参数,并对它们进行理想的处理。
由于您有此操作方法:
public ActionResult Test(Person person)
{
// process...
}
您可以使用类似如下的url来访问此操作:
Test?id=7&name=Niels&age=25
https://stackoverflow.com/questions/32373662
复制相似问题