asp.net-mvc-3 – 模型绑定器究竟做了什么?如何有效地使用它?
我正在研究一些东西,并且遇到了关于模型粘合剂的
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静态类在运行时中查看值提供程序. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- 单元测试Raven和ASP.NET成员资格
- asp.net – Linq查询返回同一行12次
- asp.net-mvc-3 – 多租户SQLMembershipProvider ASP.NET MV
- 403发布asp.net MVC后禁止
- asp.net – 继承.aspx页面?
- asp.net – 为什么我不能从Visual Studio 2005安装IE8后调试
- IIS7集成vs经典流水线 – 哪些使用更多的ASP.NET线程?
- asp.net – “连接字符串指定本地Sql Server Express实例”
- asp.net-mvc-4 – 捆绑与缩小,哪一个是最好的
- .NET Core多平台开发体验[2]: Mac OS X
- asp.net-mvc – 如何使用ASP.NET MVC,WebAPI和ME
- 休息 – OData与GraphQL GraphQL比较OData有什么
- asp.net-mvc – 在MVC控制器中复制代码
- asp.net-mvc – 后退按钮不会导致回发到MVC中的控
- asp.net – 使用Windows身份验证对MVC4站点上的H
- asp.net-mvc-4 – 使asp.net MVC 4视图编译/给出
- 剃刀 – 从另一个TagHelper调用TagHelpers?
- ASP.Net WebAPI与Ajax进行跨域数据交互时Cookies
- asp-classic – ASP经典CDO电子邮件消息在textbo
- 使用ASP.NET的成本