上篇文章中分析了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的更多相关文章

  1. Asp.net MVC的Model Binder工作流程以及扩展方法(1)

    Asp.net MVC的Model Binder工作流程以及扩展方法(1)2014-03-19 08:02 by JustRun, 523 阅读, 4 评论, 收藏, 编辑 在Asp.net MVC中 ...

  2. Asp.net MVC的Model Binder工作流程以及扩展方法(1) - Custom Model Binder

    在Asp.net MVC中, Model Binder是生命周期中的一个非常重要的部分.搞清楚Model Binder的流程,能够帮助理解Model Binder的背后发生了什么.同时该系列文章会列举 ...

  3. Asp.net MVC的Model Binder工作流程以及扩展方法(3) - DefaultModelBinder

    Default Binder是MVC中的清道夫,把守着Model Binder中的最后一道防线.如果我们没有使用Custom Model Binder等特殊处理,那么Model的绑定都是有Defaul ...

  4. 【ASP.NET MVC 学习笔记】- 14 HtmlHlper的扩展方法

    本文参考:http://www.cnblogs.com/willick/p/3428413.html 1.在 MVC 中用于生成 Html 元素的辅助类是 System.Web.Mvc 命名空间下的  ...

  5. 简述C#中IO的应用 RabbitMQ安装笔记 一次线上问题引发的对于C#中相等判断的思考 ef和mysql使用(一) ASP.NET/MVC/Core的HTTP请求流程

    简述C#中IO的应用   在.NET Framework 中. System.IO 命名空间主要包含基于文件(和基于内存)的输入输出(I/O)服务的相关基础类库.和其他命名空间一样. System.I ...

  6. ASP.NET MVC 之Model的呈现

    ASP.NET MVC 之Model的呈现(仅此一文系列三) 本文目的 我们来看一个小例子,在一个ASP.NET MVC项目中创建一个控制器Home,只有一个Index: public class H ...

  7. ASP.NET MVC学前篇之请求流程

    ASP.NET MVC学前篇之请求流程 请求流程描述 对于请求的流程,文章的重点是讲HttpApplication和HttpModule之间的关系,以及一个简单的示例实现.(HttpModule又是M ...

  8. [转]ASP.NET MVC 2: Model Validation

    本文转自:http://weblogs.asp.net/scottgu/archive/2010/01/15/asp-net-mvc-2-model-validation.aspx?CommentPo ...

  9. ASP.NET MVC 3 Model【通过一简单实例一步一步的介绍】

    今天主要讲Model的两个方面: 1. ASP.Net MVC 3 Model 简介 通过一简单的事例一步一步的介绍 2. ASP.Net MVC 3 Model 的一些验证 MVC 中 Model ...

随机推荐

  1. C# winform控件之listview学习积累

    //1.用key给ListViewItem 的 SubItems赋值 ListViewItem listViewItem= listView1.Items.Add("第一列文字") ...

  2. QT TableWidget 应用笔记

    QT TableWidget应用笔记 分类: QT2013-05-21 16:22 2561人阅读 评论(0) 收藏 举报 1.设置表头及大小 QStringList header; header&l ...

  3. css3很美的蟠桃动画

    查看效果:http://hovertree.com/texiao/css3/26/ 源码下载:http://hovertree.com/h/bjaf/ndhxgfkn.htm 效果图如下: 代码如下: ...

  4. C#的变迁史 - C# 4.0 之并行处理篇

    前面看完了Task对象,这里再看一下另一个息息相关的对象Parallel. Parallel对象 Parallel对象封装了能够利用多核并行执行的多线程操作,其内部使用Task来分装多线程的任务并试图 ...

  5. 修复 XE7 update1 发布 iOS 8.x 实机问题

      1. 开启工程目录下面的 Entitlement.TemplateiOS.xml 档案. 2. 加入二行: <key>application-identifier</key> ...

  6. IT男常用软件网站整理

    1. 猎豹免费WiFI.  属于wifi共享软件.  360免费wifi.. 2. 悟空VPN, 免费VPN.http://www.wkdaili.net/ 3. PLSQL. 4. WinSCP, ...

  7. 跨平台日志清理工具 Log-Cutter v2.0.1 RC-1 发布

    Log-Cutter 是JessMA开源组织开发的一个简单实用的日志切割清理工具.对于服务器的日常维护来说,日志清理是非常重要的事情,如果残留日志过多则严重浪费磁盘空间同时影响服务的性能.如果用手工方 ...

  8. cnodejs社区论坛1--登陆

  9. 小清新的jQuery ck-slide 图片轮播

    ck_slide 是一款小清新的jQuery 幻灯片插件,它非常小巧,压缩后仅 3KB,基本功能可以满足.它支持淡入淡出/左右滚动.箭头/圆点控制.自动播放. 在线实例 默认(淡入淡出) 左右滚动 自 ...

  10. HTML5 Canvas 高仿逼真 3D 布料图案效果

    HTML5 规范引进了很多新特性,其中最令人期待的之一就是 Canvas 元素,HTML5 Canvas 提供了通过 JavaScript 绘制图形的方法,非常强大.下面给大家分享一个 HTML5 C ...