Asp.net MVC的Model Binder工作流程以及扩展方法(2) - Binder Attribute
上篇文章中分析了Custom Binder的弊端: 由于Custom Binder是和具体的类型相关,比如指定类型A由我们的Custom Binder解析,那么导致系统运行中的所有Action的访问参数,只要是类型A, 都会使用Custom Binder. 这篇文章将会介绍Binder Attribute方式扩展MVC的Model Binder, 这种方式更加的灵活和可操控。
本篇文章参考了ModelBinder——ASP.NET MVC Model绑定的核心, 结合Artech的这篇文章,对于MVC的Model Binder一定能够理解的更加深刻。
阅读目录:
一. Asp.net MVC Model Binder的源码分析
二. Model Binder的优先顺序以及扩展点
三. 自定义Binder Attribute - SessionUserBinderAttribute
四. 应用SessionUserBinderAttribute
五. 总结
一,Asp.net MVC Model Binder的源码分析
在实际使用Binder Attribute之前,我们先来看看Model Binder在MVC中是如何工作的。
1.1 首先, 在MVC中, 当一个请求发送到服务器,先是要经过Route匹配, 找到对应的Controller和Action, 然后才是构建Action中的参数,也就是Model Binder的过程。这个可以从MVC的源码, ControllerActionInvoker中看出来。
在ControllerActionInvoker.cs的函数GetParameterValue函数中,调用了GetModelBinder方法来获取构建该Action参数的Binder.
1.2 GetModelBinder方法,将会优先使用ParameterDescriptor描述中指定的Binder。这是本篇文章介绍的Model Binder扩展点 -- 为Action参数指定Binder.
1.3 在ParameterDescriptor没有指定Binder的情况下,按照这个优先顺序获取Binder
a. 从BinderProvoder中获取
b. 从global table中获取. 第一篇中的Custom Model Binder就是这里的扩展,定义一个Model Binder注册到global table中
c. 从参数类型Attribute上指定的Binder获取。参数类型定义类的定义处,也可以使用Binder Attribute,指定该类的Action参数由指定的Binder处理。
d. 使用MVC默认的Default Binder
二,Model Binder的优先顺序以及扩展点
从上面MVC中Model Binder的源代码分析中,可以知道,参数如何构建取决于Binder,而获取Binder的源的优先顺序是:
1. PrameterDescriptor
2. Binder Provider
3. Global table
4. 参数类型定义的Binder Attribute
5. MVC的DefaultBinder
所以Model Binder的扩展点也是上面5处, 第一篇文章中介绍的是扩展点3, 这篇中介绍的是扩展点1, 下篇文章中,将会介绍扩展点5,也就是DefaultBinder.
三,自定义Binder Attribute - SessionUserBinderAttribute
还是以解决上篇文章中的Session依赖问题为入手。我们定义SessionUserBinderAttribute 继承自CustomModelBinderAttribute,重写方法GetBinder(),该Binder将从Session中获取值来构建Action参数。
[AttributeUsage(AttributeTargets.Parameter, AllowMultiple = false, Inherited = false)]
public class SessionUserBinderAttribute : CustomModelBinderAttribute
{
public override IModelBinder GetBinder()
{
return new UserAccountModelBinder();
}
} public class UserAccountModelBinder : IModelBinder
{
public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
{
if (controllerContext.HttpContext.Session["UserAccuont"] != null)
{
return controllerContext.HttpContext.Session["UserAccuont"];
}
return null;
}
}
四,应用SessionUserBinderAttribute
使用我们的SessionUserBinderAttribute改造Index方法
原有的Index方法是这样的:
public ActionResult Index()
{
var user = Session["UserAccuont"] as UserAccount; //从Session中获取当前登录用户的信息
//send email
var email = user.Email;
return new EmptyResult();
}
改造后的函数如下, 使用SessionUserBinder指定user参数的值,是从session中获取。
public ActionResult Index([SessionUserBinder]UserAccount user)
{
//send email
var email = user.Email;
return new EmptyResult();
}
同时, 如果在新增一个UserAccount表单提交的时候,由于没有使用SessionUserBinderAttribute, 该useraccount将会由MVC中的DefaultBinder处理,也就是从form中提取值。
[HttpPost]
public ActionResult Create(UserAccount useraccount)
{
return View();
}
五,总结
这篇文章中,介绍了MVC中的model binder流程,以及罗列了model binder中5个的扩展点:
1. PrameterDescriptor
2. Binder Provider
3. Global table
4. 参数类型定义的Binder Attribute
5. MVC的DefaultBinder
其中这篇文章涉及的是扩展点1.
扩展点2 Artech的文章ModelBinder——ASP.NET MVC Model绑定的核心中有介绍。
扩展点3在文章Asp.net MVC的Model Binder工作流程以及扩展方法(1) - Custom Model Binder中
扩展点4也是利用Binder Attribute,不同的地方是,它关联的不是参数,而是类型定义。作用和扩展点3范围一样,不在写文章展开。
扩展点5是MVC中的DefaultBinder, 下篇文章中,将会详细介绍。
Custom Model Binder是以类型指定binder, 我们比喻为全火力覆盖,这里介绍的CustomModelBinderAttribute可以达到定点清除的效果,也就是只有我指定的参数才由特定的binder处理。理解两者应用范围的不同,有助于我们选择使用哪种方式扩展。
Asp.net MVC的Model Binder工作流程以及扩展方法(2) - Binder Attribute的更多相关文章
- Asp.net MVC的Model Binder工作流程以及扩展方法(1)
Asp.net MVC的Model Binder工作流程以及扩展方法(1)2014-03-19 08:02 by JustRun, 523 阅读, 4 评论, 收藏, 编辑 在Asp.net MVC中 ...
- Asp.net MVC的Model Binder工作流程以及扩展方法(1) - Custom Model Binder
在Asp.net MVC中, Model Binder是生命周期中的一个非常重要的部分.搞清楚Model Binder的流程,能够帮助理解Model Binder的背后发生了什么.同时该系列文章会列举 ...
- Asp.net MVC的Model Binder工作流程以及扩展方法(3) - DefaultModelBinder
Default Binder是MVC中的清道夫,把守着Model Binder中的最后一道防线.如果我们没有使用Custom Model Binder等特殊处理,那么Model的绑定都是有Defaul ...
- 【ASP.NET MVC 学习笔记】- 14 HtmlHlper的扩展方法
本文参考:http://www.cnblogs.com/willick/p/3428413.html 1.在 MVC 中用于生成 Html 元素的辅助类是 System.Web.Mvc 命名空间下的 ...
- 简述C#中IO的应用 RabbitMQ安装笔记 一次线上问题引发的对于C#中相等判断的思考 ef和mysql使用(一) ASP.NET/MVC/Core的HTTP请求流程
简述C#中IO的应用 在.NET Framework 中. System.IO 命名空间主要包含基于文件(和基于内存)的输入输出(I/O)服务的相关基础类库.和其他命名空间一样. System.I ...
- ASP.NET MVC 之Model的呈现
ASP.NET MVC 之Model的呈现(仅此一文系列三) 本文目的 我们来看一个小例子,在一个ASP.NET MVC项目中创建一个控制器Home,只有一个Index: public class H ...
- ASP.NET MVC学前篇之请求流程
ASP.NET MVC学前篇之请求流程 请求流程描述 对于请求的流程,文章的重点是讲HttpApplication和HttpModule之间的关系,以及一个简单的示例实现.(HttpModule又是M ...
- [转]ASP.NET MVC 2: Model Validation
本文转自:http://weblogs.asp.net/scottgu/archive/2010/01/15/asp-net-mvc-2-model-validation.aspx?CommentPo ...
- ASP.NET MVC 3 Model【通过一简单实例一步一步的介绍】
今天主要讲Model的两个方面: 1. ASP.Net MVC 3 Model 简介 通过一简单的事例一步一步的介绍 2. ASP.Net MVC 3 Model 的一些验证 MVC 中 Model ...
随机推荐
- Vue从零开始(一)
一.什么是Vue? Vue.js(读音 /vjuː/, 类似于 view) 是一套构建用户界面的 渐进式框架.与其他重量级框架不同的是,Vue 采用自底向上增量开发的设计.Vue 的核心库只关注视图层 ...
- 初识Web 服务(即Web Service)
一.什么是Web服务 简单来说就是在Internet上提供的这种服务,我们称这种服务为Web服务. 二.Web服务的主要目标? 是支持跨平台的可互操作性. 三.Web服务的优势 四.Web服务提供了一 ...
- mybatis同时启用mapperscanner和传统DAO
在通过MapperScannerConfigurer启用了mybatis的映射器之后,默认情况下,在basePackage下的所有接口类都会被无条件的自动代理,如下所示: <!--mapper ...
- css知多少(4)——解读浏览器默认样式
上一节<css知多少(3)——样式来源与层叠规则>介绍了样式的五种来源,咱们再通过一张图回顾一下. 对于上面的三层,咱们大概都比较熟悉了.下面的两层中,用户自定义样式一般也就是改一改字号大 ...
- 未来的 Web:九个不可思议的 WebGL 应用试验
WebGL 技术允许把 JavaScript 和 OpenGL ES 2.0 结合在一起,通过增加 OpenGL ES 2.0 的一个 JavaScript 绑定,WebGL 可以为 HTML5 Ca ...
- ShareDrop – 苹果 AirDrop 服务的 HTML5 实现
ShareDrop 是苹果 AirDrop 服务的 HTML5 版本,你可以直接在设备之间传输文件,而无需先上传到任何服务器.它使用 WebRTC 来实现安全的点对点文件传输.目前 ShareDrop ...
- 如何:对 SharePoint 列表项隐藏 ECB 中的菜单项
可以通过使用功能框架向编辑控制块 (ECB) 菜单添加新的自定义操作.但是,您不能使用此方法进行相反的操作,即隐藏现有的 ECB 菜单项,因为它们是通过使用 ECMAScript(JavaScript ...
- 360和QQ大战之我见
腾讯最大的产品QQ,占有了全国6亿活跃用户.在中国互联网拥有不可多得的主导权. 360的产品想了一个办法,以安全为名,做了一个QQ保镖,那么他的步骤如下: 1.我保护你嘛.只要QQ启动,保镖就跟着启动 ...
- sqlite使用xcode编译
使用xcode去开发makefile的project(Building Makefile Projects With Xcode) 新建工程,template选择 external Build Sys ...
- 在Json解析过程中,我为什么用object1.optInt ,和 object1.optString
今天在做Json解析的时候,出现了一段代码没执行的问题,于是找了一下原因: 1.原代码是: 发现 红色的一句 没有执行,查看控制台发现了异常 2.修复bug ,正确的代码为 3.总结 ...