首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >GET请求时ASP.NET MVC的自定义模型绑定器

GET请求时ASP.NET MVC的自定义模型绑定器
EN

Stack Overflow用户
提问于 2015-09-03 18:54:36
回答 1查看 15.6K关注 0票数 20

我已经创建了一个自定义的MVC Model Binder,每个进入服务器的HttpPost都会调用它。但是对于HttpGet请求不会被调用。

  • Should我的自定义模型绑定器在GET**?期间被调用如果是这样的话,我miss?**
  • If没有做什么,我如何编写从QueryString GET Request?

处理的自定义代码

这是我的实现..。

代码语言:javascript
复制
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

代码语言:javascript
复制
protected void Application_Start()
{
   ModelBinders.Binders.DefaultBinder = new CustomModelBinder();
   //...
}

我已经研究了这些解决方案,但它们并不能完全满足我的需求:

通过构建复杂类型的缺省绑定器TempData

  • Using保存复杂类型(?Name=John&Surname=Doe)

对答案进行备注

感谢@Felipe的帮助。为了防止有人为同样的问题而苦苦挣扎,我学会了:

  • 自定义模型绑定器CAN be be GET Requests
  • CAN use DefaultModelBinder
  • 我的问题是操作方法必须有一个参数(否则,GET请求将跳过模型绑定器,这是有道理的)
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-09-03 19:36:30

让我们假设你有你自己想要绑定的类型。

代码语言:javascript
复制
public class Person
{
    public int Id { get; set; }
    public string Name { get; set; }
    public int Age { get; set; }
    // other properties you need
}

您可以为此特定类型创建自定义模型绑定,继承自DefaultModelBinder,用于示例:

代码语言:javascript
复制
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中,您可以注册此模型绑定,例如:

代码语言:javascript
复制
// for Person type, bind with the PersonModelBinder
ModelBinders.Binders.Add(typeof(Person), new PersonModelBinder());

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

由于您有此操作方法:

代码语言:javascript
复制
public ActionResult Test(Person person)
{
  // process...
}

您可以使用类似如下的url来访问此操作:

代码语言:javascript
复制
Test?id=7&name=Niels&age=25
票数 21
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32373662

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档