一、题外话

接续上一篇:

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. .Net平台下,分布式文件存储的实现

    遇到的问题 对于Web程序,使用一台服务器的时候,客户端上传的文件一般也都是存储在这台服务器上.但在集群环境中就行不通了,如果每个服务器都存储自己接受到的文件,就乱套了,数据库中明明有这个附件的记录, ...

  2. apache httpclient CacheStorage的一个自定义实现

    import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io ...

  3. Jexus针对Asp.net core应用程序的六大不可替代的优势

    1,配置简便:在Jexus上,Asp.net core只是Jexus上的一个"站点",因此,只需在Jexus上配置这个站点就行,无需其它配置: 2,操作统一:Jexus停止这个站点 ...

  4. 今天心情好,一起探讨下《送给大家的200兆SVN代码服务器》怎么管理我们的VS代码?

    前几天给大家免费送了个200兆SVN代码服务器(今天心情好,给各位免费呈上200兆SVN代码服务器一枚,不谢!),还木有领取的速度戳链接哦! 好几位园友拿到SVN服务器都对其赞不绝口,我也用这个服务器 ...

  5. 使用Location对象查询字符串参数

    location是BOM中最有用的对象之一: 1.它提供了与当前窗口中加载的文档有关的信息: 2.他还提供了一些导航功能. location对象的属性有: hash, host, hostname, ...

  6. 每天一个linux命令(54):ping命令

    Linux系统的ping命令是常用的网络命令,它通常用来测试与目标主机的连通性,我们经常会说“ping一下某机器,看是不是开着”.不能打开网页时会说“你先ping网关地址192.168.1.1试试”. ...

  7. Redis操作命令总结

    转载于:http://www.itxuexiwang.com/a/shujukujishu/redis/2016/0216/118.html?1455860089 一.key pattern 查询相应 ...

  8. Thrift架构~从图中理解thrift,它事实上是一种远程过程调用

    thrift为我们简化了tcp通讯,它可以使用我们方便的建立各种语言的服务端与客户端,并实现客户端对服务器的远程过程调用,简单的说就是服务器通过thrift架构对外开放一些接口,并自己实现这些接口,如 ...

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

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

  10. 控制台屏蔽某console的输出

    有时候需要调试一个在线网站. 打开 chrome 控制台,其中有一些 console.log 不停的输出. 这样的话就影响了我们使用控制台调试页面. 那么怎样不让那一句(或多句)console.log ...