自定义模型绑定器ASP.NET MVC的GET请求如何实现?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (1)
  • 关注 (0)
  • 查看 (30)

我创建了一个自定义的MVC模型绑定器,可以为每一个HttpPost进入服务器的应用程序调用。但没有被HttpGet请求。

  • 我的自定义模型联编程序是否在一个GET?如果是这样,我错过了什么?
  • 如果不是,我如何编写处理QueryString来自GET请求的自定义代码?

这是我的实现...

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

我了解到:

  • 定制模型绑定CAN用于GET请求
  • CAN使用DefaultModelBinder
  • 我的障碍是行动方法必须有一个参数(否则模型联编程序会跳过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());

在该BindModel方法中PersonModelBinder,确保查询字符串中包含所有参数并给予理想的处理。

既然你有这个动作方法:

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

你可以通过这样的URL访问这个动作:

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

扫码关注云+社区