MVC中的默认Model绑定者DefaultModelBinder

一、题外话

接续上一篇:

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

时间: 2024-10-29 19:08:51

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

MVC中@Html.DisPlayFor(model=&gt;model.newsName)和 @Model.newsName的区别

MVC中,在Controllers查询到数据,返回一个实体给View并显示,可以用@Html.DisPlayFor(model=>model.newsName)和 @Model.newsName这两种方式显示某个字段数据(如newsName),但是,这两者是用区别的,即如果Controllers中没有查询到数据,则会返回一个值为null的实体(当然你可以进行判断,不返回null到view中),用 @Model.newsName这种方式显示的话会报错.下面我就用一个实例来演示一下: Control

解决.net在MVC中POST回传Model失效

在.net中,当你先使用 [HttpGet] public ActionResult Create(EcBoh.ViewModels.OrderPage model) { !......此处省略......! return View(model); } 传回model到View是没有问题的,但是因为某种需要,你在后端通过下面的方法传回View传回前端就会出现model失效的问题. [HttpPost] public ActionResult Create(EcBoh.ViewModels.Ord

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

ViewData["moduleList"] = new SelectList(new El_Basic_ModuleInfo().Rows().AsEnumerable(), "moduleId", "name", objEl_UserInfo.moduleId); 第一个参数为查询得到的数据 第二个参数为绑定的ID,字段属性 第四个参数为默认绑定的值 前台绑定 @Html.DropDownList("drpmodule",

ASP.NET MVC Model绑定(一)

ASP.NET MVC Model绑定(一) 前言 ModelMetadata系列的结束了,从本篇开始就进入Model绑定部分了,这个系列阅读过后你会对Model绑定有个比较清楚的了解, 本篇对于Model绑定器的最基础的应用作个简单的示例展示,目的在于让大家事先了解一下Model绑定器是什么样的便于后续篇幅的理解. Model绑定 IModelBinder.自定义Model绑定器简单实现 Model绑定器在MVC框架中的位置 MVC中的默认Model绑定器生成过程 IModelBinderPr

ASP.NET MVC Model绑定(二)

ASP.NET MVC Model绑定(二) 前言 上篇对于Model绑定的简单演示想必大家对Model绑定的使用方式有一点的了解,那大家有没有想过Model绑定器是在什么时候执行的?又或是执行的过程是什么样的?将在本篇为大家解除这些疑惑,在其中涉及到的一些描述类型和上下文参数会在后续的篇幅中讲到. Model绑定 IModelBinder.自定义Model绑定器简单实现 Model绑定器在MVC框架中的位置 MVC中的默认Model绑定器生成过程 IModelBinderProvider的简单

ASP.NET MVC Model绑定(六)

ASP.NET MVC Model绑定(六) 前言 前面的篇幅对于IValueProvider的使用做个基础的示例讲解,但是没并没有对 IValueProvider类型的实现做详细的介绍,然而MVC框架中给我们提供了几种默认的实现类型,在本篇中将会对NameValueCollectionValueProvider类型做一个示例讲解,了解一下MVC框架给我们提供的值提供程序是怎么处理Model值的. Model绑定 IModelBinder.自定义Model绑定器简单实现 Model绑定器在MVC

ASP.NET MVC Model绑定(五)

ASP.NET MVC Model绑定(五) 前言 前面的篇幅对于IValueProvider的获取位置和所处的生成过程做了讲解,本篇将会对IValueProvider的使用做个基础的示例讲解,读完本篇你将会对IValueProvider有个更清晰的印象. Model绑定 IModelBinder.自定义Model绑定器简单实现 Model绑定器在MVC框架中的位置 MVC中的默认Model绑定器生成过程 IModelBinderProvider的简单应用 IValueProvider在MVC框

ASP.NET MVC Model绑定(四)

ASP.NET MVC Model绑定(四) 前言 前面的篇幅对于Model绑定器IModelBinder以及实现类型.Model绑定器提供程序都作了粗略的讲解,可以把Model绑定器想象成一个大的容器,为什么这么说呢?留个疑问在这里. 首先控制器的方法参数可能是很多种类型的.可能是多个同一种类型的,应对这种情况MVC框架使用的绑定实现都是IValueProvider来做的,而针对参数类型的不同等等一些情况,IValueProvider的实现类型也是有很大的差异的,这些具体实现的讲解会在后续的篇

ASP.NET MVC Model绑定(三)

ASP.NET MVC Model绑定(三) 前言 看过前两篇的朋友想必对Model绑定有个大概的了解,然而MVC框架给我们提供了更高的可扩展性的提供程序编程模式,也就是本篇的主题了,会讲解一下Model绑定器提供程序的实现以及解决一下上篇遗留的问题. 第一个问题是ModelBinderProviderCollection类型的执行过程? 还有个本篇的问题就是同样的向系统上下文中注册Model绑定器和Model绑定器提供程序,哪一个优先级更高? Model绑定 IModelBinder.自定义M