模型绑定

  模型绑定主要是将Http请求数据绑定到Action的参数中。模型绑定接口是IModelBinder

  模型绑定器数据检测顺序:

  1、检测目标对象的名称和类型。通常是动作方法的参数。

  2、通过已知对象查找数据源(http请求),并找到可用数据(字符串值)。

  3、根据对象的类型把可用数据值转换为目标类型。如果转换失败会报错误信息。

  4、通过已处理的数据来构造目标对象。

  5、将目标对象送到动作调用器,并由动作调用器将对象注入到目标动作方法中。

一、IModelBinder接口定义  

// 摘要: 
    //     定义模型联编程序所需的方法。
    public interface IModelBinder
    {
        // 摘要: 
        //     使用指定的控制器上下文和绑定上下文将模型绑定到一个值。
        //
        // 参数: 
        //   controllerContext:
        //     控制器上下文。
        //
        //   bindingContext:
        //     绑定上下文。
        //
        // 返回结果: 
        //     绑定值。
        object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext);
    }
View Code

二、默认模型绑定

  DefaultModelBinder是内奸的模型绑定器。默认绑定器查找参数的顺序为 Request.Form,RouteData.Values,Request.QueryString,Request.Files。

  模型绑定器处理数据类型转换时,如果转换失败会报错误信息。例如/person/edit/1,请求参数为int类型,改为/person/edid/jack,由jack转换为int时失败,那么通常情况下会报参数错误。

 

三、简单参数绑定

  简单参数绑定使用TypeConverter进行简单类型数据绑定。

四、复杂数据类型绑定

  复杂数据类型绑定,DefaultModelBinder使用反射获得公共属性然后再进行数据绑定。

五、手动调用模型绑定

  手动调用模型绑定使用UpdateModel和TryUpdateModel两种方法。两方法均是Controller中定义,并且均有不同类型的重载。   

   //
        // 摘要: 
        //     使用来自控制器的当前值提供程序的值更新指定的模型实例。
        //
        // 参数: 
        //   model:
        //     要更新的模型实例。
        //
        // 类型参数: 
        //   TModel:
        //     模型对象的类型。
        //
        // 返回结果: 
        //     如果更新已成功,则为 true;否则为 false。
        //
        // 异常: 
        //   System.ArgumentNullException:
        //     model 参数或 System.Web.Mvc.ControllerBase.ValueProvider 属性为 null。
        protected internal bool TryUpdateModel<TModel>(TModel model) where TModel : class;
        //
        // 摘要: 
        //     使用来自值提供程序的值更新指定的模型实例。
        //
        // 参数: 
        //   model:
        //     要更新的模型实例。
        //
        //   valueProvider:
        //     可用于更新模型的值字典。
        //
        // 类型参数: 
        //   TModel:
        //     模型对象的类型。
        //
        // 返回结果: 
        //     如果更新已成功,则为 true;否则为 false。
        protected internal bool TryUpdateModel<TModel>(TModel model, IValueProvider valueProvider) where TModel : class;
        //
        // 摘要: 
        //     使用来自控制器的当前值提供程序的值和前缀更新指定的模型实例。
        //
        // 参数: 
        //   model:
        //     要更新的模型实例。
        //
        //   prefix:
        //     在值提供程序中查找值时要使用的前缀。
        //
        // 类型参数: 
        //   TModel:
        //     模型对象的类型。
        //
        // 返回结果: 
        //     如果更新已成功,则为 true;否则为 false。
        //
        // 异常: 
        //   System.ArgumentNullException:
        //     model 参数或 System.Web.Mvc.ControllerBase.ValueProvider 属性为 null。
        protected internal bool TryUpdateModel<TModel>(TModel model, string prefix) where TModel : class;
        //
        // 摘要: 
        //     使用来自控制器的当前值提供程序的值和包含的属性更新指定的模型实例。
        //
        // 参数: 
        //   model:
        //     要更新的模型实例。
        //
        //   includeProperties:
        //     一个要更新的模型的属性列表。
        //
        // 类型参数: 
        //   TModel:
        //     模型对象的类型。
        //
        // 返回结果: 
        //     如果更新已成功,则为 true;否则为 false。
        //
        // 异常: 
        //   System.ArgumentNullException:
        //     model 参数或 System.Web.Mvc.ControllerBase.ValueProvider 属性为 null。
        protected internal bool TryUpdateModel<TModel>(TModel model, string[] includeProperties) where TModel : class;
        //
        // 摘要: 
        //     使用来自值提供程序的值和前缀更新指定的模型实例。
        //
        // 参数: 
        //   model:
        //     要更新的模型实例。
        //
        //   prefix:
        //     在值提供程序中查找值时要使用的前缀。
        //
        //   valueProvider:
        //     可用于更新模型的值字典。
        //
        // 类型参数: 
        //   TModel:
        //     模型对象的类型。
        //
        // 返回结果: 
        //     如果更新已成功,则为 true;否则为 false。
        protected internal bool TryUpdateModel<TModel>(TModel model, string prefix, IValueProvider valueProvider) where TModel : class;
        //
        // 摘要: 
        //     使用来自控制器的当前值提供程序的值、前缀和包含的属性更新指定的模型实例。
        //
        // 参数: 
        //   model:
        //     要更新的模型实例。
        //
        //   prefix:
        //     在值提供程序中查找值时要使用的前缀。
        //
        //   includeProperties:
        //     一个要更新的模型的属性列表。
        //
        // 类型参数: 
        //   TModel:
        //     模型对象的类型。
        //
        // 返回结果: 
        //     如果更新已成功,则为 true;否则为 false。
        //
        // 异常: 
        //   System.ArgumentNullException:
        //     model 参数或 System.Web.Mvc.ControllerBase.ValueProvider 属性为 null。
        protected internal bool TryUpdateModel<TModel>(TModel model, string prefix, string[] includeProperties) where TModel : class;
        //
        // 摘要: 
        //     使用来自值提供程序的值和要包含的属性列表更新指定的模型实例。
        //
        // 参数: 
        //   model:
        //     要更新的模型实例。
        //
        //   includeProperties:
        //     一个要更新的模型的属性列表。
        //
        //   valueProvider:
        //     可用于更新模型的值字典。
        //
        // 类型参数: 
        //   TModel:
        //     模型对象的类型。
        //
        // 返回结果: 
        //     如果更新已成功,则为 true;否则为 false。
        protected internal bool TryUpdateModel<TModel>(TModel model, string[] includeProperties, IValueProvider valueProvider) where TModel : class;
        //
        // 摘要: 
        //     使用来自值提供程序的值、前缀和包含的属性更新指定的模型实例。
        //
        // 参数: 
        //   model:
        //     要更新的模型实例。
        //
        //   prefix:
        //     在值提供程序中查找值时要使用的前缀。
        //
        //   includeProperties:
        //     一个要更新的模型的属性列表。
        //
        //   valueProvider:
        //     可用于更新模型的值字典。
        //
        // 类型参数: 
        //   TModel:
        //     模型对象的类型。
        //
        // 返回结果: 
        //     如果更新已成功,则为 true;否则为 false。
        protected internal bool TryUpdateModel<TModel>(TModel model, string prefix, string[] includeProperties, IValueProvider valueProvider) where TModel : class;
        //
        // 摘要: 
        //     使用来自控制器的当前值提供程序的值、前缀、要排除的属性列表和要包含的属性列表更新指定的模型实例。
        //
        // 参数: 
        //   model:
        //     要更新的模型实例。
        //
        //   prefix:
        //     在值提供程序中查找值时要使用的前缀
        //
        //   includeProperties:
        //     一个要更新的模型的属性列表。
        //
        //   excludeProperties:
        //     要从该更新中显式排除的属性列表。即使 includeProperties 参数列表中列出了这些属性,也会将其排除。
        //
        // 类型参数: 
        //   TModel:
        //     模型对象的类型。
        //
        // 返回结果: 
        //     如果更新已成功,则为 true;否则为 false。
        //
        // 异常: 
        //   System.ArgumentNullException:
        //     model 参数或 System.Web.Mvc.ControllerBase.ValueProvider 属性为 null。
        protected internal bool TryUpdateModel<TModel>(TModel model, string prefix, string[] includeProperties, string[] excludeProperties) where TModel : class;
        //
        // 摘要: 
        //     使用来自值提供程序的值、前缀、要排除的属性列表和要包含的属性列表更新指定的模型实例。
        //
        // 参数: 
        //   model:
        //     要更新的模型实例。
        //
        //   prefix:
        //     在值提供程序中查找值时要使用的前缀。
        //
        //   includeProperties:
        //     一个要更新的模型的属性列表。
        //
        //   excludeProperties:
        //     要从该更新中显式排除的属性列表。即使 includeProperties 参数列表中列出了这些属性,也会将其排除。
        //
        //   valueProvider:
        //     可用于更新模型的值字典。
        //
        // 类型参数: 
        //   TModel:
        //     模型对象的类型。
        //
        // 返回结果: 
        //     如果更新已成功,则为 true;否则为 false。
        protected internal bool TryUpdateModel<TModel>(TModel model, string prefix, string[] includeProperties, string[] excludeProperties, IValueProvider valueProvider) where TModel : class;
View Code

 

//
        // 摘要: 
        //     使用来自控制器的当前值提供程序的值更新指定的模型实例。
        //
        // 参数: 
        //   model:
        //     要更新的模型实例。
        //
        // 类型参数: 
        //   TModel:
        //     模型对象的类型。
        //
        // 异常: 
        //   System.InvalidOperationException:
        //     此模型没有成功更新。
        protected internal void UpdateModel<TModel>(TModel model) where TModel : class;
        //
        // 摘要: 
        //     使用来自值提供程序的值更新指定的模型实例。
        //
        // 参数: 
        //   model:
        //     要更新的模型实例。
        //
        //   valueProvider:
        //     可用于更新模型的值字典。
        //
        // 类型参数: 
        //   TModel:
        //     模型对象的类型。
        protected internal void UpdateModel<TModel>(TModel model, IValueProvider valueProvider) where TModel : class;
        //
        // 摘要: 
        //     使用来自控制器的当前值提供程序的值和前缀更新指定的模型实例。
        //
        // 参数: 
        //   model:
        //     要更新的模型实例。
        //
        //   prefix:
        //     在值提供程序中查找值时要使用的前缀。
        //
        // 类型参数: 
        //   TModel:
        //     模型对象的类型。
        protected internal void UpdateModel<TModel>(TModel model, string prefix) where TModel : class;
        //
        // 摘要: 
        //     使用来自控制器对象的当前值提供程序的值更新指定的模型实例。
        //
        // 参数: 
        //   model:
        //     要更新的模型实例。
        //
        //   includeProperties:
        //     一个要更新的模型的属性列表。
        //
        // 类型参数: 
        //   TModel:
        //     模型对象的类型。
        protected internal void UpdateModel<TModel>(TModel model, string[] includeProperties) where TModel : class;
        //
        // 摘要: 
        //     使用来自值提供程序的值和前缀更新指定的模型实例。
        //
        // 参数: 
        //   model:
        //     要更新的模型实例。
        //
        //   prefix:
        //     在值提供程序中查找值时要使用的前缀。
        //
        //   valueProvider:
        //     可用于更新模型的值字典。
        //
        // 类型参数: 
        //   TModel:
        //     模型对象的类型。
        protected internal void UpdateModel<TModel>(TModel model, string prefix, IValueProvider valueProvider) where TModel : class;
        //
        // 摘要: 
        //     使用来自控制器的当前值提供程序的值、前缀和包含的属性更新指定的模型实例。
        //
        // 参数: 
        //   model:
        //     要更新的模型实例。
        //
        //   prefix:
        //     在值提供程序中查找值时要使用的前缀。
        //
        //   includeProperties:
        //     一个要更新的模型的属性列表。
        //
        // 类型参数: 
        //   TModel:
        //     模型对象的类型。
        protected internal void UpdateModel<TModel>(TModel model, string prefix, string[] includeProperties) where TModel : class;
        //
        // 摘要: 
        //     使用来自值提供程序的值、前缀和要包含的属性列表更新指定的模型实例。
        //
        // 参数: 
        //   model:
        //     要更新的模型实例。
        //
        //   includeProperties:
        //     一个要更新的模型的属性列表。
        //
        //   valueProvider:
        //     可用于更新模型的值字典。
        //
        // 类型参数: 
        //   TModel:
        //     模型对象的类型。
        protected internal void UpdateModel<TModel>(TModel model, string[] includeProperties, IValueProvider valueProvider) where TModel : class;
        //
        // 摘要: 
        //     使用来自值提供程序的值、前缀和要包含的属性列表更新指定的模型实例。
        //
        // 参数: 
        //   model:
        //     要更新的模型实例。
        //
        //   prefix:
        //     在值提供程序中查找值时要使用的前缀。
        //
        //   includeProperties:
        //     一个要更新的模型的属性列表。
        //
        //   valueProvider:
        //     可用于更新模型的值字典。
        //
        // 类型参数: 
        //   TModel:
        //     模型对象的类型。
        protected internal void UpdateModel<TModel>(TModel model, string prefix, string[] includeProperties, IValueProvider valueProvider) where TModel : class;
        //
        // 摘要: 
        //     使用来自控制器的当前值提供程序的值、前缀、要排除的属性列表和要包含的属性列表更新指定的模型实例。
        //
        // 参数: 
        //   model:
        //     要更新的模型实例。
        //
        //   prefix:
        //     在值提供程序中查找值时要使用的前缀。
        //
        //   includeProperties:
        //     一个要更新的模型的属性列表。
        //
        //   excludeProperties:
        //     要从该更新中显式排除的属性列表。即使 includeProperties 列表中列出了这些属性,也会将其排除。
        //
        // 类型参数: 
        //   TModel:
        //     模型对象的类型。
        protected internal void UpdateModel<TModel>(TModel model, string prefix, string[] includeProperties, string[] excludeProperties) where TModel : class;
        //
        // 摘要: 
        //     使用来自值提供程序的值、前缀、要排除的属性列表和要包含的属性列表更新指定的模型实例。
        //
        // 参数: 
        //   model:
        //     要更新的模型实例。
        //
        //   prefix:
        //     在值提供程序中查找值时要使用的前缀。
        //
        //   includeProperties:
        //     一个要更新的模型的属性列表。
        //
        //   excludeProperties:
        //     要从该更新中显式排除的属性列表。即使 includeProperties 参数列表中列出了这些属性,也会将其排除。
        //
        //   valueProvider:
        //     可用于更新模型的值字典。
        //
        // 类型参数: 
        //   TModel:
        //     模型对象的类型。
        protected internal void UpdateModel<TModel>(TModel model, string prefix, string[] includeProperties, string[] excludeProperties, IValueProvider valueProvider) where TModel : class;
View Code

  两种手动模型绑定方式如果出现错误是均可以使用ModelState.IsValide来查看是否有错误。 

 在实际中常用的是FormCollection,因为FormCollection实现了IValueProvider接口。  

// 摘要: 
    //     包含应用程序的窗体值提供程序。
    public sealed class FormCollection : NameValueCollection, IValueProvider
    {
        // 摘要: 
        //     初始化 System.Web.Mvc.FormCollection 类的新实例。
        public FormCollection();
        //
        // 摘要: 
        //     初始化 System.Web.Mvc.FormCollection 类的新实例。
        //
        // 参数: 
        //   collection:
        //     集合。
        //
        // 异常: 
        //   System.ArgumentNullException:
        //     collection 参数为 null。
        public FormCollection(NameValueCollection collection);

        // 摘要: 
        //     获取指定的值提供程序。
        //
        // 参数: 
        //   name:
        //     要获取的值提供程序的名称。
        //
        // 返回结果: 
        //     值提供程序。
        //
        // 异常: 
        //   System.ArgumentException:
        //     name 参数为 null 或为空。
        public ValueProviderResult GetValue(string name);
        //
        // 摘要: 
        //     返回包含值提供程序的字典。
        //
        // 返回结果: 
        //     值提供程序的字典。
        public IValueProvider ToValueProvider();
    }
View Code

 

六、创建自定义IValueProvider

  创建自定义值提供器,需要实现IValueProvider接口。  

 // 摘要: 
    //     定义 ASP.NET MVC 中的值提供程序所需的方法。
    public interface IValueProvider
    {
        // 摘要: 
        //     确定集合是否包含指定的前缀。
        //
        // 参数: 
        //   prefix:
        //     要搜索的前缀。
        //
        // 返回结果: 
        //     如果集合包含指定的前缀,则为 true;否则为 false。
        bool ContainsPrefix(string prefix);
        //
        // 摘要: 
        //     使用指定键来检索值对象。
        //
        // 参数: 
        //   key:
        //     要检索的值对象的键。
        //
        // 返回结果: 
        //     指定的键的值对象。
        ValueProviderResult GetValue(string key);
    }
View Code

  

七、模型验证 

  数据操作UpdateModel和TryUpdateModel方法对数据进行绑定操作,是否绑定成功,哪儿未绑定成功,可能通过模型验证来查看。ModelState.IsValidate属性来查看是否有错误发生,也可能在绑定过程中添加错误信息,方法是ModelState.AddModelError方法。

  ModelState类是一个字典类,存放关于模型验证的各种信息。  

 // 摘要: 
    //     表示有关将已发送窗体绑定到操作方法(其中包括验证信息)的尝试的状态。
    [Serializable]
    public class ModelStateDictionary : IDictionary<string, ModelState>, ICollection<KeyValuePair<string, ModelState>>, IEnumerable<KeyValuePair<string, ModelState>>, IEnumerable
    {
        // 摘要: 
        //     初始化 System.Web.Mvc.ModelStateDictionary 类的新实例。
        public ModelStateDictionary();
        //
        // 摘要: 
        //     使用从指定的模型状态字典复制的值来初始化 System.Web.Mvc.ModelStateDictionary 类的新实例。
        //
        // 参数: 
        //   dictionary:
        //     模型状态字典。
        //
        // 异常: 
        //   System.ArgumentNullException:
        //     dictionary  参数为 null。
        public ModelStateDictionary(ModelStateDictionary dictionary);

        // 摘要: 
        //     获取集合中键/值对的数目。
        //
        // 返回结果: 
        //     集合中键/值对的数目。
        public int Count { get; }
        //
        // 摘要: 
        //     获取一个值,该值指示该集合是否为只读集合。
        //
        // 返回结果: 
        //     如果该集合是只读的,则为 true;否则为 false。
        public bool IsReadOnly { get; }
        //
        // 摘要: 
        //     获取一个值,该值指示模型状态字典的此实例是否有效。
        //
        // 返回结果: 
        //     如果该实例有效,则为 true;否则为 false。
        public bool IsValid { get; }
        //
        // 摘要: 
        //     获取包含字典中的键的集合。
        //
        // 返回结果: 
        //     一个包含模型状态字典中的键的集合。
        public ICollection<string> Keys { get; }
        //
        // 摘要: 
        //     获取包含字典中的值的集合。
        //
        // 返回结果: 
        //     一个包含模型状态字典中的值的集合。
        public ICollection<ModelState> Values { get; }

        // 摘要: 
        //     获取或设置与指定的键关联的值。
        //
        // 参数: 
        //   key:
        //     键。
        //
        // 返回结果: 
        //     模型状态项。
        public ModelState this[string key] { get; set; }

        // 摘要: 
        //     将指定的项添加到模型状态字典中。
        //
        // 参数: 
        //   item:
        //     要添加到模型状态字典中的对象。
        //
        // 异常: 
        //   System.NotSupportedException:
        //     模型状态字典为只读。
        public void Add(KeyValuePair<string, ModelState> item);
        //
        // 摘要: 
        //     将具有指定的键和值的元素添加到模型状态字典中。
        //
        // 参数: 
        //   key:
        //     要添加的元素的键。
        //
        //   value:
        //     要添加的元素的值。
        //
        // 异常: 
        //   System.NotSupportedException:
        //     模型状态字典为只读。
        //
        //   System.ArgumentNullException:
        //     key 为 null。
        //
        //   System.ArgumentException:
        //     一个具有指定键的元素已经存在于模型状态字典中。
        public void Add(string key, ModelState value);
        //
        // 摘要: 
        //     将指定的模型错误添加到与指定键关联的模型状态字典的错误集合中。
        //
        // 参数: 
        //   key:
        //     键。
        //
        //   exception:
        //     异常。
        public void AddModelError(string key, Exception exception);
        //
        // 摘要: 
        //     将指定的错误消息添加到与指定键关联的模型状态字典的错误集合中。
        //
        // 参数: 
        //   key:
        //     键。
        //
        //   errorMessage:
        //     错误消息。
        public void AddModelError(string key, string errorMessage);
        //
        // 摘要: 
        //     移除模型状态字典中的所有项。
        //
        // 异常: 
        //   System.NotSupportedException:
        //     模型状态字典为只读。
        public void Clear();
        //
        // 摘要: 
        //     确定模型状态字典是否包含特定值。
        //
        // 参数: 
        //   item:
        //     要在模型状态字典中查找的对象。
        //
        // 返回结果: 
        //     如果在模型状态字典中找到 item,则为 true;否则为 false。
        public bool Contains(KeyValuePair<string, ModelState> item);
        //
        // 摘要: 
        //     确定模型状态字典是否包含指定的键。
        //
        // 参数: 
        //   key:
        //     要在模型状态字典中查找的键。
        //
        // 返回结果: 
        //     如果模型状态字典包含指定的键,则为 true;否则为 false。
        public bool ContainsKey(string key);
        //
        // 摘要: 
        //     从指定的索引位置开始,将模型状态字典中的元素复制到一个数组中。
        //
        // 参数: 
        //   array:
        //     作为从 System.Collections.Generic.ICollection<T> 对象复制的元素的目标的一维数组。该数组的索引必须从零开始。
        //
        //   arrayIndex:
        //     array 中开始复制位置的从零开始的索引。
        //
        // 异常: 
        //   System.ArgumentNullException:
        //     array 为 null。
        //
        //   System.ArgumentOutOfRangeException:
        //     arrayIndex 小于 0。
        //
        //   System.ArgumentException:
        //     array 是多维的。- 或 - arrayIndex 大于或等于 array 的长度。- 或 -源集合中的元素数大于从 arrayIndex 到目标
        //     array 末尾之间的可用空间。- 或 -类型 T 无法自动转换为目标 array 的类型。
        public void CopyTo(KeyValuePair<string, ModelState>[] array, int arrayIndex);
        //
        // 摘要: 
        //     返回一个可用于循环访问集合的枚举器。
        //
        // 返回结果: 
        //     一个可用于循环访问集合的枚举器。
        public IEnumerator<KeyValuePair<string, ModelState>> GetEnumerator();
        //
        // 摘要: 
        //     确定是否存在与指定键关联或以指定键为前缀的任何 System.Web.Mvc.ModelError 对象。
        //
        // 参数: 
        //   key:
        //     键。
        //
        // 返回结果: 
        //     如果模型状态字典包含一个与指定键关联的值,则为 true;否则为 false。
        //
        // 异常: 
        //   System.ArgumentNullException:
        //     key 参数为 null。
        public bool IsValidField(string key);
        //
        // 摘要: 
        //     将指定的 System.Web.Mvc.ModelStateDictionary 对象中的值复制到此字典中,如果键相同,则覆盖现有值。
        //
        // 参数: 
        //   dictionary:
        //     字典。
        public void Merge(ModelStateDictionary dictionary);
        //
        // 摘要: 
        //     从模型状态字典中移除指定对象的第一个匹配项。
        //
        // 参数: 
        //   item:
        //     要从模型状态字典中移除的对象。
        //
        // 返回结果: 
        //     如果从模型状态字典中成功移除了 item,则为 true;否则为 false。如果在模型状态字典中找不到 item,则此方法也会返回 false。
        //
        // 异常: 
        //   System.NotSupportedException:
        //     模型状态字典为只读。
        public bool Remove(KeyValuePair<string, ModelState> item);
        //
        // 摘要: 
        //     从模型状态字典中移除具有指定键的元素。
        //
        // 参数: 
        //   key:
        //     要移除的元素的键。
        //
        // 返回结果: 
        //     如果成功移除该元素,则为 true;否则为 false。如果在模型状态字典中找不到 key,则此方法也会返回 false。
        //
        // 异常: 
        //   System.NotSupportedException:
        //     模型状态字典为只读。
        //
        //   System.ArgumentNullException:
        //     key 为 null。
        public bool Remove(string key);
        //
        // 摘要: 
        //     使用指定的值提供程序字典设置指定键的值。
        //
        // 参数: 
        //   key:
        //     键。
        //
        //   value:
        //     值。
        public void SetModelValue(string key, ValueProviderResult value);
        //
        // 摘要: 
        //     尝试获取与指定的键关联的值。
        //
        // 参数: 
        //   key:
        //     要获取的值的键。
        //
        //   value:
        //     当此方法返回时,如果找到指定键,则返回与该键相关联的值;否则,将返回 value 参数的类型的默认值。该参数未经初始化即被传递。
        //
        // 返回结果: 
        //     如果实现 System.Collections.Generic.IDictionary<TKey,TValue> 的对象包含具有指定键的元素,则为
        //     true;否则为 false。
        //
        // 异常: 
        //   System.ArgumentNullException:
        //     key 为 null。
        public bool TryGetValue(string key, out ModelState value);
    }
View Code

   模型错误信息显示通过Html.ValidationSummary方法来控制显示.该方法有多种重载。在方法中通过excludePropertyErrors来控制是错误显示级别,true显示模型级别错误,false或者不设置则显示所有错误。  

    //
        // 摘要: 
        //     返回 System.Web.Mvc.ModelStateDictionary 对象中的验证消息的未排序列表(ul 元素)。
        //
        // 参数: 
        //   htmlHelper:
        //     此方法扩展的 HTML 帮助器实例。
        //
        // 返回结果: 
        //     一个字符串,其中包含验证消息的未排序列表(ul 元素)。
        public static MvcHtmlString ValidationSummary(this HtmlHelper htmlHelper);
        //
        // 摘要: 
        //     返回 System.Web.Mvc.ModelStateDictionary 对象中验证消息的未排序列表(ul 元素),还可以选择仅显示模型级错误。
        //
        // 参数: 
        //   htmlHelper:
        //     此方法扩展的 HTML 帮助器实例。
        //
        //   excludePropertyErrors:
        //     true 表示使摘要仅显示模型级错误;false 表示使摘要显示所有错误。
        //
        // 返回结果: 
        //     一个字符串,其中包含验证消息的未排序列表(ul 元素)。
        public static MvcHtmlString ValidationSummary(this HtmlHelper htmlHelper, bool excludePropertyErrors);
        //
        // 摘要: 
        //     返回 System.Web.Mvc.ModelStateDictionary 对象中的验证消息的未排序列表(ul 元素)。
        //
        // 参数: 
        //   htmlHelper:
        //     此方法扩展的 HMTL 帮助器实例。
        //
        //   message:
        //     要在指定字段包含错误时显示的消息。
        //
        // 返回结果: 
        //     一个字符串,其中包含验证消息的未排序列表(ul 元素)。
        public static MvcHtmlString ValidationSummary(this HtmlHelper htmlHelper, string message);
        //
        // 摘要: 
        //     返回 System.Web.Mvc.ModelStateDictionary 对象中验证消息的未排序列表(ul 元素),还可以选择仅显示模型级错误。
        //
        // 参数: 
        //   htmlHelper:
        //     此方法扩展的 HTML 帮助器实例。
        //
        //   excludePropertyErrors:
        //     true 表示使摘要仅显示模型级错误;false 表示使摘要显示所有错误。
        //
        //   message:
        //     与验证摘要一起显示的消息。
        //
        // 返回结果: 
        //     一个字符串,其中包含验证消息的未排序列表(ul 元素)。
        public static MvcHtmlString ValidationSummary(this HtmlHelper htmlHelper, bool excludePropertyErrors, string message);
        //
        // 摘要: 
        //     返回 System.Web.Mvc.ModelStateDictionary 对象中的验证消息的未排序列表(ul 元素)。
        //
        // 参数: 
        //   htmlHelper:
        //     此方法扩展的 HTML 帮助器实例。
        //
        //   message:
        //     要在指定字段包含错误时显示的消息。
        //
        //   htmlAttributes:
        //     一个包含元素的 HTML 特性的字典。
        //
        // 返回结果: 
        //     一个字符串,其中包含验证消息的未排序列表(ul 元素)。
        public static MvcHtmlString ValidationSummary(this HtmlHelper htmlHelper, string message, IDictionary<string, object> htmlAttributes);
        //
        // 摘要: 
        //     返回 System.Web.Mvc.ModelStateDictionary 对象中的验证消息的未排序列表(ul 元素)。
        //
        // 参数: 
        //   htmlHelper:
        //     此方法扩展的 HTML 帮助器实例。
        //
        //   message:
        //     要在指定字段包含错误时显示的消息。
        //
        //   htmlAttributes:
        //     包含元素 HTML 特性的对象。
        //
        // 返回结果: 
        //     一个字符串,其中包含验证消息的未排序列表(ul 元素)。
        public static MvcHtmlString ValidationSummary(this HtmlHelper htmlHelper, string message, object htmlAttributes);
        //
        // 摘要: 
        //     返回 System.Web.Mvc.ModelStateDictionary 对象中验证消息的未排序列表(ul 元素),还可以选择仅显示模型级错误。
        //
        // 参数: 
        //   htmlHelper:
        //     此方法扩展的 HTML 帮助器实例。
        //
        //   excludePropertyErrors:
        //     true 表示使摘要仅显示模型级错误;false 表示使摘要显示所有错误。
        //
        //   message:
        //     与验证摘要一起显示的消息。
        //
        //   htmlAttributes:
        //     一个包含元素的 HTML 特性的字典。
        //
        // 返回结果: 
        //     一个字符串,其中包含验证消息的未排序列表(ul 元素)。
        public static MvcHtmlString ValidationSummary(this HtmlHelper htmlHelper, bool excludePropertyErrors, string message, IDictionary<string, object> htmlAttributes);
        //
        // 摘要: 
        //     返回 System.Web.Mvc.ModelStateDictionary 对象中验证消息的未排序列表(ul 元素),还可以选择仅显示模型级错误。
        //
        // 参数: 
        //   htmlHelper:
        //     此方法扩展的 HTML 帮助器实例。
        //
        //   excludePropertyErrors:
        //     true 表示使摘要仅显示模型级错误;false 表示使摘要显示所有错误。
        //
        //   message:
        //     与验证摘要一起显示的消息。
        //
        //   htmlAttributes:
        //     包含元素 HTML 特性的对象。
        //
        // 返回结果: 
        //     一个字符串,其中包含验证消息的未排序列表(ul 元素)。
        public static MvcHtmlString ValidationSummary(this HtmlHelper htmlHelper, bool excludePropertyErrors, string message, object htmlAttributes);
View Code

  通过Html.ValidationMessage和html.ValidationMessageFor显示属性级别是的错误信息。  

  //
        // 摘要: 
        //     在 System.Web.Mvc.ModelStateDictionary 对象中的指定字段出错时显示一条验证消息。
        //
        // 参数: 
        //   htmlHelper:
        //     此方法扩展的 HTML 帮助器实例。
        //
        //   modelName:
        //     所验证的属性或模型对象的名称。
        //
        // 返回结果: 
        //     如果该属性或对象有效,则为一个空字符串;否则为一个包含错误消息的 span 元素。
        public static MvcHtmlString ValidationMessage(this HtmlHelper htmlHelper, string modelName);
        //
        // 摘要: 
        //     在 System.Web.Mvc.ModelStateDictionary 对象中的指定字段出错时显示一条验证消息。
        //
        // 参数: 
        //   htmlHelper:
        //     此方法扩展的 HTML 帮助器实例。
        //
        //   modelName:
        //     所验证的属性或模型对象的名称。
        //
        //   htmlAttributes:
        //     包含元素 HTML 特性的对象。
        //
        // 返回结果: 
        //     如果该属性或对象有效,则为一个空字符串;否则为一个包含错误消息的 span 元素。
        public static MvcHtmlString ValidationMessage(this HtmlHelper htmlHelper, string modelName, IDictionary<string, object> htmlAttributes);
        //
        // 摘要: 
        //     在 System.Web.Mvc.ModelStateDictionary 对象中的指定字段出错时显示一条验证消息。
        //
        // 参数: 
        //   htmlHelper:
        //     此方法扩展的 HTML 帮助器实例。
        //
        //   modelName:
        //     所验证的属性或模型对象的名称。
        //
        //   htmlAttributes:
        //     包含元素 HTML 特性的对象。
        //
        // 返回结果: 
        //     如果该属性或对象有效,则为一个空字符串;否则为一个包含错误消息的 span 元素。
        public static MvcHtmlString ValidationMessage(this HtmlHelper htmlHelper, string modelName, object htmlAttributes);
        //
        // 摘要: 
        //     在 System.Web.Mvc.ModelStateDictionary 对象中的指定字段出错时显示一条验证消息。
        //
        // 参数: 
        //   htmlHelper:
        //     此方法扩展的 HTML 帮助器实例。
        //
        //   modelName:
        //     所验证的属性或模型对象的名称。
        //
        //   validationMessage:
        //     要在指定字段包含错误时显示的消息。
        //
        // 返回结果: 
        //     如果该属性或对象有效,则为一个空字符串;否则为一个包含错误消息的 span 元素。
        public static MvcHtmlString ValidationMessage(this HtmlHelper htmlHelper, string modelName, string validationMessage);
        //
        // 摘要: 
        //     在 System.Web.Mvc.ModelStateDictionary 对象中的指定字段出错时显示一条验证消息。
        //
        // 参数: 
        //   htmlHelper:
        //     此方法扩展的 HTML 帮助器实例。
        //
        //   modelName:
        //     所验证的属性或模型对象的名称。
        //
        //   validationMessage:
        //     要在指定字段包含错误时显示的消息。
        //
        //   htmlAttributes:
        //     包含元素 HTML 特性的对象。
        //
        // 返回结果: 
        //     如果该属性或对象有效,则为一个空字符串;否则为一个包含错误消息的 span 元素。
        public static MvcHtmlString ValidationMessage(this HtmlHelper htmlHelper, string modelName, string validationMessage, IDictionary<string, object> htmlAttributes);
        //
        // 摘要: 
        //     在 System.Web.Mvc.ModelStateDictionary 对象中的指定字段出错时显示一条验证消息。
        //
        // 参数: 
        //   htmlHelper:
        //     此方法扩展的 HTML 帮助器实例。
        //
        //   modelName:
        //     所验证的属性或模型对象的名称。
        //
        //   validationMessage:
        //     要在指定字段包含错误时显示的消息。
        //
        //   htmlAttributes:
        //     包含元素 HTML 特性的对象。
        //
        // 返回结果: 
        //     如果该属性或对象有效,则为一个空字符串;否则为一个包含错误消息的 span 元素。
        public static MvcHtmlString ValidationMessage(this HtmlHelper htmlHelper, string modelName, string validationMessage, object htmlAttributes);
        //
        // 摘要: 
        //     为由指定表达式表示的每个数据字段的验证错误消息返回对应的 HTML 标记。
        //
        // 参数: 
        //   htmlHelper:
        //     此方法扩展的 HTML 帮助器实例。
        //
        //   expression:
        //     一个表达式,用于标识包含要呈现的属性的对象。
        //
        // 类型参数: 
        //   TModel:
        //     模型的类型。
        //
        //   TProperty:
        //     属性的类型。
        //
        // 返回结果: 
        //     如果该属性或对象有效,则为一个空字符串;否则为一个包含错误消息的 span 元素。
        public static MvcHtmlString ValidationMessageFor<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> expression);
        //
        // 摘要: 
        //     使用指定消息,为由指定表达式表示的每个数据字段的验证错误消息返回对应的 HTML 标记。
        //
        // 参数: 
        //   htmlHelper:
        //     此方法扩展的 HTML 帮助器实例。
        //
        //   expression:
        //     一个表达式,用于标识包含要呈现的属性的对象。
        //
        //   validationMessage:
        //     要在指定字段包含错误时显示的消息。
        //
        // 类型参数: 
        //   TModel:
        //     模型的类型。
        //
        //   TProperty:
        //     属性的类型。
        //
        // 返回结果: 
        //     如果该属性或对象有效,则为一个空字符串;否则为一个包含错误消息的 span 元素。
        public static MvcHtmlString ValidationMessageFor<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> expression, string validationMessage);
        //
        // 摘要: 
        //     使用指定消息和 HTML 特性,为由指定表达式表示的每个数据字段的验证错误消息返回对应的 HTML 标记。
        //
        // 参数: 
        //   htmlHelper:
        //     此方法扩展的 HTML 帮助器实例。
        //
        //   expression:
        //     一个表达式,用于标识包含要呈现的属性的对象。
        //
        //   validationMessage:
        //     要在指定字段包含错误时显示的消息。
        //
        //   htmlAttributes:
        //     包含元素 HTML 特性的对象。
        //
        // 类型参数: 
        //   TModel:
        //     模型的类型。
        //
        //   TProperty:
        //     属性的类型。
        //
        // 返回结果: 
        //     如果该属性或对象有效,则为一个空字符串;否则为一个包含错误消息的 span 元素。
        public static MvcHtmlString ValidationMessageFor<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> expression, string validationMessage, IDictionary<string, object> htmlAttributes);
        //
        // 摘要: 
        //     使用指定消息和 HTML 特性,为由指定表达式表示的每个数据字段的验证错误消息返回对应的 HTML 标记。
        //
        // 参数: 
        //   htmlHelper:
        //     此方法扩展的 HTML 帮助器实例。
        //
        //   expression:
        //     一个表达式,用于标识包含要呈现的属性的对象。
        //
        //   validationMessage:
        //     要在指定字段包含错误时显示的消息。
        //
        //   htmlAttributes:
        //     包含元素 HTML 特性的对象。
        //
        // 类型参数: 
        //   TModel:
        //     模型的类型。
        //
        //   TProperty:
        //     属性的类型。
        //
        // 返回结果: 
        //     如果该属性或对象有效,则为一个空字符串;否则为一个包含错误消息的 span 元素。
        public static MvcHtmlString ValidationMessageFor<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> expression, string validationMessage, object htmlAttributes);
        
View Code

  验证属性:

  

 创建自定义属性验证,通过继承抽象类ValidationAttribute,并重写IsValid方法来实现自定义属性验证。  

    // 摘要: 
    //     作为所有验证属性的基类。
    //
    // 异常: 
    //   System.ComponentModel.DataAnnotations.ValidationException:
    //     在设置非本地化 System.ComponentModel.DataAnnotations.ValidationAttribute.ErrorMessage
    //     属性错误消息的同时,本地化错误消息的 System.ComponentModel.DataAnnotations.ValidationAttribute.ErrorMessageResourceType
    //     和 System.ComponentModel.DataAnnotations.ValidationAttribute.ErrorMessageResourceName
    //     属性也被设置。
    public abstract class ValidationAttribute : Attribute
    {
        // 摘要: 
        //     初始化 System.ComponentModel.DataAnnotations.ValidationAttribute 类的新实例。
        protected ValidationAttribute();
        //
        // 摘要: 
        //     通过使用实现验证资源访问功能的函数,初始化 System.ComponentModel.DataAnnotations.ValidationAttribute
        //     类的新实例。
        //
        // 参数: 
        //   errorMessageAccessor:
        //     实现验证资源访问的函数。
        //
        // 异常: 
        //   System:ArgumentNullException:
        //     errorMessageAccessor 为 null。
        protected ValidationAttribute(Func<string> errorMessageAccessor);
        //
        // 摘要: 
        //     通过使用要与验证控件关联的错误消息,来初始化 System.ComponentModel.DataAnnotations.ValidationAttribute
        //     类的新实例。
        //
        // 参数: 
        //   errorMessage:
        //     要与验证控件关联的错误消息。
        protected ValidationAttribute(string errorMessage);

        // 摘要: 
        //     获取或设置一条在验证失败的情况下与验证控件关联的错误消息。
        //
        // 返回结果: 
        //     与验证控件关联的错误消息。
        public string ErrorMessage { get; set; }
        //
        // 摘要: 
        //     获取或设置错误消息资源的名称,在验证失败的情况下,要使用该名称来查找 System.ComponentModel.DataAnnotations.ValidationAttribute.ErrorMessageResourceType
        //     属性值。
        //
        // 返回结果: 
        //     与验证控件关联的错误消息资源。
        public string ErrorMessageResourceName { get; set; }
        //
        // 摘要: 
        //     获取或设置在验证失败的情况下用于查找错误消息的资源类型。
        //
        // 返回结果: 
        //     与验证控件关联的错误消息的类型。
        public Type ErrorMessageResourceType { get; set; }
        //
        // 摘要: 
        //     获取本地化的验证错误消息。
        //
        // 返回结果: 
        //     本地化的验证错误消息。
        protected string ErrorMessageString { get; }
        //
        // 摘要: 
        //     获取指示特性是否要求验证上下文的值。
        //
        // 返回结果: 
        //     如果特性需要验证上下文,则为 true;否则为 false。
        public virtual bool RequiresValidationContext { get; }

        // 摘要: 
        //     基于发生错误的数据字段对错误消息应用格式设置。
        //
        // 参数: 
        //   name:
        //     要包括在带有格式的消息中的名称。
        //
        // 返回结果: 
        //     带有格式的错误消息的实例。
        public virtual string FormatErrorMessage(string name);
        //
        // 摘要: 
        //     检查指定的值对于当前的验证特性是否有效。
        //
        // 参数: 
        //   value:
        //     要验证的值。
        //
        //   validationContext:
        //     有关验证操作的上下文信息。
        //
        // 返回结果: 
        //     System.ComponentModel.DataAnnotations.ValidationResult 类的实例。
        public ValidationResult GetValidationResult(object value, ValidationContext validationContext);
        //
        // 摘要: 
        //     确定对象的指定值是否有效。
        //
        // 参数: 
        //   value:
        //     要验证的对象的值。
        //
        // 返回结果: 
        //     如果指定的值有效,则为 true;否则,为 false。
        public virtual bool IsValid(object value);
        //
        // 摘要: 
        //     根据当前的验证特性来验证指定的值。
        //
        // 参数: 
        //   value:
        //     要验证的值。
        //
        //   validationContext:
        //     有关验证操作的上下文信息。
        //
        // 返回结果: 
        //     System.ComponentModel.DataAnnotations.ValidationResult 类的实例。
        protected virtual ValidationResult IsValid(object value, ValidationContext validationContext);
        //
        // 摘要: 
        //     验证指定的对象。
        //
        // 参数: 
        //   value:
        //     要验证的对象的值。
        //
        //   name:
        //     要包括在错误消息中的名称。
        //
        // 异常: 
        //   System.ComponentModel.DataAnnotations.ValidationException:
        //     value 无效。
        public void Validate(object value, string name);
        //
        // 摘要: 
        //     验证指定的对象。
        //
        // 参数: 
        //   value:
        //     要验证的对象。
        //
        //   validationContext:
        //     描述验证检查的执行上下文的 System.ComponentModel.DataAnnotations.ValidationContext 对象。
        //     此参数不能为 null。
        //
        // 异常: 
        //   System.ComponentModel.DataAnnotations.ValidationException:
        //     验证失败。
        public void Validate(object value, ValidationContext validationContext);
    }
View Code

 

posted @ 2017-07-10 07:04  mopheify  阅读(350)  评论(0编辑  收藏  举报