zoukankan      html  css  js  c++  java
  • Asp.Net MVC<七>:Model

    Model 指ViewModel ,其作用:

    1. 用于目标Action的参数绑定
    2. 用于View呈现

    Model元数据则是对ViewModel数据类型的描述,其作用在于控制作为Model的数据对象在View中的呈现方式,它使模板化的HTML呈现成为可能,此外它还服务于Model绑定和验证。

    ModelMetadata对象

    元数据的结构

    用于描述Model元数据的是一个ModelMetadata对象,它具有层级结构

    public class ModelMetadata
    {
        public object Container { get; set; }
        //     模型的容器的类型。
        public Type ContainerType { get; }
        //     获取模型元数据对象的集合,这些对象描述模型的属性。
        public virtual IEnumerable<ModelMetadata> Properties { get; }
    	//……其他成员
    }
    

    构造方法及类型、值、依赖关系等信息

    public class ModelMetadata
    {
        public ModelMetadata(ModelMetadataProvider provider, Type containerType, Func<object> modelAccessor, Type modelType, string propertyName);
        //     从模型的 Expression 参数返回元数据。
        public static ModelMetadata FromLambdaExpression<TParameter, TValue>(Expression<Func<TParameter, TValue>> expression, ViewDataDictionary<TParameter> viewData);
        //     从模型的表达式参数中获取元数据。
        public static ModelMetadata FromStringExpression(string expression, ViewDataDictionary viewData);
    
        public const int DefaultOrder = 10000;
        //     获取或设置一个值,该值表示当前元数据的顺序。
        public virtual int Order { get; set; }
        //     获取或设置提供程序。
        protected ModelMetadataProvider Provider { get; set; }
        //     获取或设置一个值,该值指示模型是否为复杂类型。
        public virtual bool IsComplexType { get; }
        //     获取模型的类型。
        public Type ModelType { get; }
        //     获取一个值,该值指示类型是否可为 null。
        public bool IsNullableValueType { get; }
        //     获取属性名称。
        public string PropertyName { get; }
        //     获取模型的值。
        public object Model { get; set; }
        //     获取包含有关模型的其他元数据的字典。
        public virtual Dictionary<string, object> AdditionalValues { get; }
        //  Returns the simple description of the model.
        protected virtual string GetSimpleDisplayText();
        //     获取或设置模型的说明。
        public virtual string Description { get; set; }
    	
    	//……其他成员
    }
    • ModelType表示Model自身的数据类型,IsNullableValueType和IsComplexType分别表示它是否一个可空值类型和复杂类型
    • PropertyName: 表示对应的属性名,作为根节点的ModelMetadata对象该属性总是返回null
    • AdditionalValues用于存储一些自定义的属性,字典中的key和value分别表述自定义属性的名称和值,通过AdditionalMetadataAttribute来添加自定义属性。

    IsComplexType属性

    IsComplexType属性判断被描述数据是否复杂类型的条件是:它是否支持资源字符串的类型转换。依照这个标准,所有基元类型和可空值类型都是简单类型。而一个自定义类型默认是一个复杂类型,但可以为它应用一个TypeConverterAttribute特性并指定一个支持字符串转换的TypeConvert类型,则可以将其转变为一个简单类型。

    [TypeConverter(typeof(PointTypeConverter))]
    public class Point
    {
        public double X { get; set; }
        public double Y { get; set; }
    
        public static Point Parse(string val)
        {
            //……
            return new Point();
        }
    }
    public class PointTypeConverter : TypeConverter
    {
        public override bool CanConvertFrom(ITypeDescriptorContext context, Type sourceType)
        {
            return sourceType == typeof(string);
        }
    
        public override object ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, object value)
        {
            if (value is string)
            {
                return Point.Parse(value as string);
            }
            return base.ConvertFrom(context, culture, value);
        }
    }
    

    元数据的定制

    ASP.NET MVC通过应用在数据类型或其属性成员上的数据注解特性(主要定义在using System.ComponentModel.DataAnnotations.dll中)来定制描述目标类型或数据成员的Model元数据。

    public class ModelMetadata
    {
        //     获取或设置模型的显示格式字符串。
        public virtual string DisplayFormatString { get; set; }
        //     获取或设置模型的编辑格式字符串。
        public virtual string EditFormatString { get; set; }
        //     获取或设置模型的显示名称。
        public virtual string DisplayName { get; set; }
        //     获取模型的显示名称。
        public string GetDisplayName();
        //     获取或设置短显示名称。
        public virtual string ShortDisplayName { get; set; }
        //     获取或设置要为 null 值显示的字符串。
        public virtual string NullDisplayText { get; set; }
        //     获取或设置一个值,该值指示是否应该使用关联的 HTML 元素呈现模型对象。
        public virtual bool HideSurroundingHtml { get; set; }
        public virtual bool HtmlEncode { get; set; }
        //     获取或设置一个值,该值指示属性是否应显示在只读视图(如列表和详细信息视图)中。
        public virtual bool ShowForDisplay { get; set; }
        //     获取或设置一个值,该值指示是否应在可编辑视图中显示模型。
        public virtual bool ShowForEdit { get; set; }
        //     获取或设置模型的简单显示字符串。
        public virtual string SimpleDisplayText { get; set; }
        //     获取或设置一个提示,该提示建议要为此模型使用哪个模板。
        public virtual string TemplateHint { get; set; }
        //     获取或设置可用作水印的值。
        public virtual string Watermark { get; set; }
    
        //     获取或设置一个值,该值指示是否启用请求验证。
        public virtual bool RequestValidationEnabled { get; set; }
        //     获取或设置一个值,该值指示模型是否为只读。
        public virtual bool IsReadOnly { get; set; }
        //     获取或设置一个值,该值指示模型是否为必需的。
        public virtual bool IsRequired { get; set; }
        //     获取或设置有关数据类型的元信息。
        public virtual string DataTypeName { get; set; }
        //     获取模型的验证程序的列表。
        public virtual IEnumerable<ModelValidator> GetValidators(ControllerContext context);
    
        //     获取或设置一个值,该值指示在窗体中回发的空字符串是否应转换为 null。
        public virtual bool ConvertEmptyStringToNull { get; set; }
    }
    

    UIHintAttribute

    Model元数据决定了对应数据对象在View中的默认程序方式。在HtmlHelper和HtmlHelper<TModel>中定义了一系列模版方法,如Display/DispalyFor、Editor/EditorFor、DisplayForModel/EditForModel、Label/LabelFor、DisplayText/DisplayTextFor等。当我们调用这些方法将指定数据程序到View中的时候,并不对最终呈现的Html做具体控制,而是利用默认或指定的模版来决定呈现在浏览器中的Html。

    每个模版都具有一个确定的名称,ModelMetadata的TemplateHint属性返回默认采用的模版名称,可通过UIHintAttribute属性定制。

    如果多个UIHintAttribute被应用到同一个成员上,Asp.net mvc会优先选择PresentationLayer属性为mvc的那个,如果这样的UIHintAttribute不存在,则第一个PresentationLayer属性为空的会被选中。

  • 相关阅读:
    建持续集成
    Apache通用日志工具commonslogging和Log4j使用总结
    subversion(SVN)常见问题及其解决方法
    UML类图的相关名词解释
    SVN项目的目录布局
    敏捷开发流程总结
    敏捷开发实践
    卓有成效的敏捷开发流程
    字符串反转操作
    转:图片水印 http://www.cnblogs.com/xiaoge_com/archive/2009/09/10/1564216.html
  • 原文地址:https://www.cnblogs.com/wj033/p/6060696.html
Copyright © 2011-2022 走看看