根据 GET 请求为 ASP.NET MVC 自定义模型绑定器
Custom Model Binder for ASP.NET MVC on GET request
我已经创建了一个自定义的 MVC 模型绑定器,它会为进入服务器的每个 HttpPost
调用。但不会被要求 HttpGet
请求。
- 是否应该在
GET
期间调用我的自定义模型活页夹?如果是这样,我错过了什么?
- 如果没有,我如何编写自定义代码来处理来自
GET
请求的 QueryString
?
这是我的实现...
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
个请求
- 你可以使用
DefaultModelBinder
class
- 我的问题是 action 方法必须有一个参数(否则模型绑定器会被
GET
请求跳过,当你考虑它时这是有道理的)
假设您有自己想要绑定的类型。
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 };
}
}
在Global.asax中的Application_Start
事件中,可以注册这个模型绑定,例如:
// 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
我已经创建了一个自定义的 MVC 模型绑定器,它会为进入服务器的每个 HttpPost
调用。但不会被要求 HttpGet
请求。
- 是否应该在
GET
期间调用我的自定义模型活页夹?如果是这样,我错过了什么? - 如果没有,我如何编写自定义代码来处理来自
GET
请求的QueryString
?
这是我的实现...
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
个请求 - 你可以使用
DefaultModelBinder
class - 我的问题是 action 方法必须有一个参数(否则模型绑定器会被
GET
请求跳过,当你考虑它时这是有道理的)
假设您有自己想要绑定的类型。
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 };
}
}
在Global.asax中的Application_Start
事件中,可以注册这个模型绑定,例如:
// 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