DefaultModelBinder
Asp.net MVC的Model Binder工作流程以及扩展方法(3) - DefaultModelBinder
Default Binder是MVC中的清道夫,把守着Model Binder中的最后一道防线。如果我们没有使用Custom Model Binder等特殊处理,那么Model的绑定都是有Default Binder处理的。这篇文章,一起看看Default Binder和如何扩展Default Binder.
一,Default Binder的流程
下面的图是Default Model Binder中的关键方法BindModel的代码逻辑图。
ValueProvider是包装好的类似于字典容器,里面包含了所有request中能够获取到的值(无论是Form提交的,还是Querystring中的)
1. 假如我们绑定一个简单的int参数,那么Default Binder会在ValueProvder中直接找到对应值,然后返回。
2. 如果绑定的是复杂类型(图中的Complex Model),比如对象,则会遍历每个属性,然后绑定该属性的值。如果属性是简单类型,就走上面的1流程;如果不是,就继续进行2流程。
可以看出,Default Model Binder是一个比较复杂和巧妙的过程。在扩展Default Binder的时候,如果override BindeModel方法,不会全盘重写,而是一个”修饰“的过程。
另外,在BindeModel过程中,有对于数据的验证的,这是和我们之前介绍的Custom Model Binder和Binder Attribute不同的地方。

二,覆盖方法,改变Default Binder行为
这里应用stackoverflow上的一个例子。原文地址: http://stackoverflow.com/questions/8729139/manipulate-model-value-before-passing-it-to-defaultmodelbinder-bindmodel
问题:
input中要求用户输入百分比值,但是不过分限定用户输入值的格式,比如用户可以输入50, 50%, 后台代码希望提交绑定后的值是个decimal类型,也就是说,在用户输入50, 50%的情况下,后台代码得到的是0.5
首先看看,属性是如何定义的。下面代码中的FooPercent 就是我们用来保存百分比的属性。
[DataType("Percent")]
[Display(Name = "Percent of foo completed")]
[Range(0.0d, 1.0d, ErrorMessage="The field {0} must be between {1:P0} and {2:P0}.")]
public decimal? FooPercent { get; set; }
接下来,创建PercentModelBinder继承自DefaultModelBinder. 发现DataType是Percent的绑定对象,会先尝试绑定。

public class PercentModelBinder : DefaultModelBinder
{
public override object BindModel(ControllerContext controllerContext,
ModelBindingContext bindingContext)
{
if (bindingContext.ModelMetadata.DataTypeName == "Percent")
{
ValueProviderResult result =
bindingContext.ValueProvider.GetValue(
bindingContext.ModelName);
if (result != null)
{
string stringValue =
(string)result.ConvertTo(typeof(string));
decimal decimalValue;
if (!string.IsNullOrWhiteSpace(stringValue) &&
decimal.TryParse(
stringValue.TrimEnd(new char[] { '%', ' ' }),
out decimalValue))
{
return decimalValue / 100.0m;
}
}
}
return base.BindModel(controllerContext, bindingContext);
}
}

最后,替换MVC原有的DefaultModelBinder
protected void Application_Start()
{
ModelBinders.Binders.DefaultBinder = new PercentModelBinder ();
}
DefaultModelBinder的更多相关文章
- 你从未知道如此强大的ASP.NET MVC DefaultModelBinder
看到很多ASP.NET MVC项目还在从request.querystring或者formContext里面获取数据,这实在是非常落后的做法.也有的项目建了大量的自定义的modelbinder,以为很 ...
- MVC中的默认Model绑定者DefaultModelBinder
一.题外话 接续上一篇: MVC中Action参数绑定的过程 public IModelBinder DefaultBinder { get { if (this._defaultBinder == ...
- Asp.net MVC的Model Binder工作流程以及扩展方法(3) - DefaultModelBinder
Default Binder是MVC中的清道夫,把守着Model Binder中的最后一道防线.如果我们没有使用Custom Model Binder等特殊处理,那么Model的绑定都是有Defaul ...
- MVC重写DefaultModelBinder实现自定义模型绑定
在编写前台页面的时候为了使url传递参数的简短,比如personId="1" 我们通过url传递成pid=1 那么在后台action方法接受的模型Person类 的属性为per ...
- ASP.NET MVC DefaultModelBinder
转载自 Leo‘s Blog 看到很多ASP.NET MVC项目还在从request.querystring或者formContext里面获取数据,这实在是非常落后的做法.也有的项目建了大量的自定义的 ...
- asp.net mvc源码分析-DefaultModelBinder 自定义的普通数据类型的绑定和验证
原文:asp.net mvc源码分析-DefaultModelBinder 自定义的普通数据类型的绑定和验证 在前面的文章中我们曾经涉及到ControllerActionInvoker类GetPara ...
- 在 System.Web.Mvc.DefaultModelBinder.ConvertProviderRe
在 System.Web.Mvc.ValueProviderResult.ConvertSimpleType(CultureInfo culture, Object value, Type desti ...
- MVC扩展ModelBinder,通过继承DefaultModelBinder把表单数据封装成类作为action参数
把视图省.市.街道表单数据,封装成一个类,作为action参数.如下: action方法参数类型: namespace MvcApplication1.Models{ public class ...
- Mvc内建功能(DefaultModelBinder)自动绑定。
在做Asp.Net MVC项目中,都知道View负责页面展示数据或者提供页面收集数据,而所展示的数据或者收集的数据都是从Controller的Action中获取或提交到Controller的Actio ...
随机推荐
- 一张地图告诉你,只JavaScript不够!
这将是JavaScript语法,你真的会一JavaScript嘛.看看这个图片!超好用JavaScript一本书的摘录游.熊儿.快去学习! 版权声明:本文博客原创文章.博客,未经同意,不得转载.
- android浏览器开发小技巧集锦(转)
本人和朋友们做了一段时间浏览器,将一些小技巧分享出来,先写一部分,慢慢写,同时也为我们的浏览器打打广告 我们的浏览器将要上线,名叫沙发浏览 1.网页内的右键菜单 public boolean onLo ...
- HTTP的REST服务简介
REST简介 一说到REST,我想大家的第一反应就是“啊,就是那种前后台通信方式.”但是在要求详细讲述它所提出的各个约束,以及如何开始搭建REST服务时,却很少有人能够清晰地说出它到底是什么, ...
- 使用 CodeIgniter 创建一个简单的 Web 站点
原文:使用 CodeIgniter 创建一个简单的 Web 站点 参考源自: http://www.ibm.com/developerworks/cn/web/wa-codeigniter/index ...
- CSDN博文“待定”如何避免检测规则分析“待定”
这些天一直很郁闷.鲍文本人一直"待定", 当然,这是非常不舒服的自己.那么今晚最终成为一个非成功出版"待定"文章,这CSDN于大家的反映而放弃了.没想到我后面又 ...
- What is WCF
几个博客前,都是关于WCF零散的知识.要了解下下面的宏,什么是WCF? WCF:Windows Communication Foundation(WCF)框架. 1.WCF体系框架 2.框架分析 2. ...
- Codeforces Round #266 (Div. 2)-C,D
C - Number of Ways 直接暴力从前往后寻找.假设找到1/3sum的位置,那么标记++.找到2/3的位置,总数加上标记数. #include<stdio.h> #includ ...
- oracle_查询Oracle正在执行和执行过的SQL语句
---正在执行的select a.username, a.sid,b.SQL_TEXT, b.SQL_FULLTEXT from v$session a, v$sqlarea b where a.s ...
- POJ 1088 滑雪 (动规)
滑雪 Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 75664 Accepted: 28044 Description Mich ...
- Linux常用命令2--用户问题、文件的打包压缩
Linux常用命令 如何进行用户和群组的创建和更改 [1]groupadd:用于创建新的群组. 语法:groupadd [-option] 用户名:其常用参数有:-g groupadd -g 555 ...