根据 GET 请求为 ASP.NET MVC 自定义模型绑定器

Custom Model Binder for ASP.NET MVC on GET request

我已经创建了一个自定义的 MVC 模型绑定器,它会为进入服务器的每个 HttpPost 调用。但不会被要求 HttpGet 请求。

这是我的实现...

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();
   //...
}

我研究了这些解决方案,但它们并不完全符合我的要求:

回答备注

感谢@Felipe 的帮助。以防万一有人遇到同样的问题,我了解到:

假设您有自己想要绑定的类型。

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());

PersonModelBinderBindModel 方法中,确保查询字符串中包含所有参数并给予它们理想的处理。

既然你有这个操作方法:

public ActionResult Test(Person person)
{
  // process...
}

您可以通过 url 类似这样的方式访问此操作:

Test?id=7&name=Niels&age=25