一、题外话

接续上一篇:

MVC中Action参数绑定的过程

 public IModelBinder DefaultBinder
{
get
{
if (this._defaultBinder == null)
{
this._defaultBinder = new DefaultModelBinder();
}
return this._defaultBinder;
}
set
{
this._defaultBinder = value;
}
}

二、分析DefaultModelBinder

public class DefaultModelBinder : IModelBinder
{
    public virtual object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext){}//其他方法我们暂时不分心,不止这一个方法
}
public virtual object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
{
EnsureStackHelper.EnsureStack();
if (bindingContext == null)
{
throw new ArgumentNullException("bindingContext");
}
bool flag = false;
if (!string.IsNullOrEmpty(bindingContext.ModelName) && !bindingContext.ValueProvider.ContainsPrefix(bindingContext.ModelName))
{//ValueProvider是一个IValueProvider的实例,我们下面分析一下这个东西
if (!bindingContext.FallbackToEmptyPrefix)
{
return null;
}
bindingContext = new ModelBindingContext
{
ModelMetadata = bindingContext.ModelMetadata,
ModelState = bindingContext.ModelState,
PropertyFilter = bindingContext.PropertyFilter,
ValueProvider = bindingContext.ValueProvider
};
flag = true;
}
if (!flag)
{
bool flag2 = DefaultModelBinder.ShouldPerformRequestValidation(controllerContext, bindingContext);
IUnvalidatedValueProvider arg_9B_0 = bindingContext.UnvalidatedValueProvider;
bool skipValidation = !flag2;
ValueProviderResult value = arg_9B_0.GetValue(bindingContext.ModelName, skipValidation);
if (value != null)
{
return this.BindSimpleModel(controllerContext, bindingContext, value);
}
}
if (!bindingContext.ModelMetadata.IsComplexType)
{
return null;
}
return this.BindComplexModel(controllerContext, bindingContext);
}

看看IValueProvider

    public interface IValueProvider
{
/// <summary>Determines whether the collection contains the specified prefix.</summary>
/// <returns>true if the collection contains the specified prefix; otherwise, false.</returns>
/// <param name="prefix">The prefix to search for.</param>
bool ContainsPrefix(string prefix);
/// <summary>Retrieves a value object using the specified key.</summary>
/// <returns>The value object for the specified key.</returns>
/// <param name="key">The key of the value object to retrieve.</param>
ValueProviderResult GetValue(string key);
}

可以看看这篇博文:http://www.cnblogs.com/artech/archive/2012/05/17/value-provider-01.html

MVC中的默认Model绑定者DefaultModelBinder的更多相关文章

  1. 008.Adding a model to an ASP.NET Core MVC app --【在 asp.net core mvc 中添加一个model (模型)】

    Adding a model to an ASP.NET Core MVC app在 asp.net core mvc 中添加一个model (模型)2017-3-30 8 分钟阅读时长 本文内容1. ...

  2. MVC中@Html.DisPlayFor(model=>model.newsName)和 @Model.newsName的区别

    MVC中,在Controllers查询到数据,返回一个实体给View并显示,可以用@Html.DisPlayFor(model=>model.newsName)和 @Model.newsName ...

  3. 在ASP.NET MVC中修改默认代码生成/支架模板

    到 C:\Program Files (or x86)\Microsoft Visual Studio 10.0\Common7\IDE\ItemTemplates\CSharp (or Visual ...

  4. MVC中控制器当中需要绑定SelectList,也就是所谓的DropDownList

    ViewData["moduleList"] = new SelectList(new El_Basic_ModuleInfo().Rows().AsEnumerable(), & ...

  5. ASP.NET MVC Model绑定(一)

    ASP.NET MVC Model绑定(一) 前言 ModelMetadata系列的结束了,从本篇开始就进入Model绑定部分了,这个系列阅读过后你会对Model绑定有个比较清楚的了解, 本篇对于Mo ...

  6. ASP.NET MVC Model绑定

    ASP.NET MVC Model绑定(一) 前言 ModelMetadata系列的结束了,从本篇开始就进入Model绑定部分了,这个系列阅读过后你会对Model绑定有个比较清楚的了解, 本篇对于Mo ...

  7. ASP.NET MVC Model绑定(六)

    ASP.NET MVC Model绑定(六) 前言 前面的篇幅对于IValueProvider的使用做个基础的示例讲解,但是没并没有对 IValueProvider类型的实现做详细的介绍,然而MVC框 ...

  8. ASP.NET MVC Model绑定(五)

    ASP.NET MVC Model绑定(五) 前言 前面的篇幅对于IValueProvider的获取位置和所处的生成过程做了讲解,本篇将会对IValueProvider的使用做个基础的示例讲解,读完本 ...

  9. ASP.NET MVC Model绑定(四)

    ASP.NET MVC Model绑定(四) 前言 前面的篇幅对于Model绑定器IModelBinder以及实现类型.Model绑定器提供程序都作了粗略的讲解,可以把Model绑定器想象成一个大的容 ...

随机推荐

  1. python Scrapy

    由于项目要使用新闻,大量的数据所以想到了python的scrapy 下面大致讲一讲如何安装使用,直到整个新闻采集模块完成,网址什么的自己找 这里只是示范这里的项目环境是python 2.66 cent ...

  2. Oracle expdp/impdp导出导入命令及数据库备份

    使用EXPDP和IMPDP时应该注意的事项: EXP和IMP是客户端工具程序,它们既可以在客户端使用,也可以在服务端使用. EXPDP和IMPDP是服务端的工具程序,他们只能在ORACLE服务端使用, ...

  3. DOM扩展札记

    Selector API HTML5 DOM扩展 Element Traversal规范 Selector API 众多JavaScript库中,最常用的一个功能就是根据css选择符选择与某个模式匹配 ...

  4. 目前流行的源程序版本管理软件和项目管理软件都有哪些?各有什么优缺点?以及Github的注册过程

    一.目前流行的源程序版本管理软件和项目管理软件有Microsoft TFS.GitHub.SVN.Coding等. 二.各有什么优缺点 三.在GitHub注册账户的过程 Microsoft TFS的优 ...

  5. Hibernate SQL实际sql语句监控- p6spy+hibernate+proxool 设置

    由于ORM工具的缘故,我们调试程序的时候远没有直接在程序里直接写个string的SQL简单,想当年查个sql是有多么的幸福,一行sql = "select * from ..."找 ...

  6. webservice2

    按照 当然,里面没写清楚如何配置第三方jar 结果一访问就报错:org.codehaus.xfire.transport.http.XFireConfigurableServlet 4年前就搞过ws的 ...

  7. JAVA数据类型,变量,转换,常量,运算符

    java数据类型: Java基本类型共有八种,基本类型可以分为三类: 1.字符类型char,用单引号赋值 2.布尔类型boolean 3.数值类型byte.short.int.long.float.d ...

  8. 用css3实现各种图标效果(2)

    写在前面 写的一模一样的css样式,结果却导致原来出来不一样的效果图. 用chrome的开发者工具查看,比较起来还是一模一样的css样式,可为什么会出现不一样的placeholder效果呢?一个白色粗 ...

  9. Atitti usrQBf1801 翻页控件规范  v2

    Atitti usrQBf1801 翻页控件规范  v2 1. 参考api  参考easyui ,.net系列的1 1.1. 翻页流程  初始化翻页控件,以及绑定新页面event onSelectPa ...

  10. Atitit 通过调用gui接口杀掉360杀毒 360卫士  qq保镖等难以结束的进程(javac# php )

    Atitit 通过调用gui接口杀掉360杀毒 360卫士  qq保镖等难以结束的进程(javac# php ) 1.1. 这些流氓软件使用操作系统os提供的普通api根本就杀不掉啊1 1.2. 使用 ...