Pet*_*ete 4 annotations model-binding asp.net-mvc-3
我正在研究一些东西,并在buildstarted.com上看到关于模型粘合剂的博客文章.它实际上对我的目的来说非常好,但我不确定幕后会发生什么.我做的是创建一个名为的自定义ModelBinder USerModelBinder:
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;
}
}
Run Code Online (Sandbox Code Playgroud)
然后在我的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);
Run Code Online (Sandbox Code Playgroud)
我也尝试在我的User类上使用注释,而不是使用Global.asax.cs中的行:
[ModelBinder(typeof(UserModelBinder))]
public partial class User
{
}
Run Code Online (Sandbox Code Playgroud)
我不是在寻找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>
Run Code Online (Sandbox Code Playgroud)
如果您发布包含正确值的表单(假设您使用PropA和PropB发布表单),模型绑定器可以识别您已在表单中发送这些值并构建SomeClass对象.
如果你真的想要创建一个真正的工作示例,你应该使用强类型视图并使用HtmlHelper的EditorFor(或EditorForModel)来创建MVC所需的所有正确名称.
-
供参考MVC的默认绑定器是DefaultModelBinder,有些(还有更多,你可以在System.Web.Mvc命名空间中查看)默认使用的ValueProviders是FormValueProvider和QueryStringValueProvider
因此,正如我已经说过的,这基本上如何工作是默认模型绑定器读取操作正在接收的模型(例如示例中的SomeClass)读取它可以读取的值(比如PropA和PropB)并询问ValueProviders用于属性的正确值.
此外,如果我没记错,您还可以使用ValueProviderFactories静态类在运行时中查看值提供程序.