加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > asp.Net > 正文

asp.net-mvc-3 – 模型绑定器究竟做了什么?如何有效地使用它?

发布时间:2020-12-16 07:22:32 所属栏目:asp.Net 来源:网络整理
导读:我正在研究一些东西,并且遇到了关于模型粘合剂的 this blog post at buildstarted.com.它实际上对我的目的来说非常好,但我不确定幕后会发生什么.我做的是创建一个名为USerModelBinder的自定义ModelBinder: public class UserModelBinder : IModelBinder{ pu
我正在研究一些东西,并且遇到了关于模型粘合剂的 this blog post at buildstarted.com.它实际上对我的目的来说非常好,但我不确定幕后会发生什么.我做的是创建一个名为USerModelBinder的自定义ModelBinder:

public class UserModelBinder : IModelBinder
{
    public object BindModel(ControllerContext controllerContext,ModelBindingContext bindingContext)
    {
        ValueProviderResult value = bindingContext.ValueProvider.GetValue("id");
        MyEntities db = new MyEntities();
        User user = db.Users.SingleOrDefault(u => u.UserName == value.AttemptedValue);
        return user;
    }
}

然后在我的Global.asax.cs中我有:

ModelBinders.Binders.Add(typeof(User),new UserModelBinder());

我的理解是使用模型绑定器允许我不必在涉及“用户”的每个控制器动作中使用以下行.因此,模型绑定器不会将“id”传递给动作,而是截取id,获取正确的“item”(在我的情况下为User)并将其转发给动作进行处理.

MyEntities db = new MyEntities();
        User user = db.Users.SingleOrDefault(u => u.UserName == value.AttemptedValue);

我也尝试在我的User类上使用注释,而不是使用Global.asax.cs中的行:

[ModelBinder(typeof(UserModelBinder))]
public partial class User
{
}

我不是在寻找30页的白皮书,但我不知道模型绑定器是如何做到的.我只是想了解从发出请求到发送请求的时间会发生什么.所有这些“只是工作”的东西对我来说是不能接受的,哈哈.另外,使用注释与在Global.asax.cs中添加它有什么区别吗?它们似乎在我的测试中工作相同,但有任何陷阱吗?

解决方法

通常,Model Binder(在MVC中)会查看Action方法并查看它所需的内容(如对象类型).然后它尝试从HTTP请求中找到值(HTTP表单,QueryString,Json中的值以及可能使用ValueProviders等其他地方,如cookie等).然后,它使用它检索的参数创建一个新对象.

IMO您所做的并不是真正的“模型绑定”.从某种意义上说,您刚刚读取了ID并从数据库中获取了对象.

通常的模型绑定示例:

// class
public class SomeClass
{
    public int PropA {get;set;}
    public string PropB {get;set;}
}

// action

public ActionResult AddSomeClass(SomeClass classToBind)
{
  // implementation
}

// pseudo html

      <form action="">
       <input name="PropA" type="text" />
       <input name="PropB" type="text" />
      </form>

如果您发布包含正确值的表单(假设您使用PropA和PropB发布表单),模型绑定器可以识别您已在表单中发送这些值并构建SomeClass对象.

如果你真的想要创建一个真正的工作示例,你应该使用强类型视图并使用HtmlHelper的EditorFor(或EditorForModel)来创建MVC所需的所有正确名称.

供参考MVC的默认绑定器是DefaultModelBinder,有些(还有更多,你可以在System.Web.Mvc命名空间中查看)默认使用的ValueProviders是FormValueProvider和QueryStringValueProvider

因此,正如我已经说过的,这基本上如何工作是默认模型绑定器读取操作正在接收的模型(例如示例中的SomeClass)读取它可以读取的值(比如PropA和PropB)并询问ValueProviders用于属性的正确值.

此外,如果我没记错,您还可以使用ValueProviderFactories静态类在运行时中查看值提供程序.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读