Asp.Net MVC<七>:Model
Model 指ViewModel ,其作用:
- 用于目标Action的参数绑定
- 用于View呈现
Model元数据则是对ViewModel数据类型的描述,其作用在于控制作为Model的数据对象在View中的呈现方式,它使模板化的HTML呈现成为可能,此外它还服务于Model绑定和验证。
1、 ModelMetadata对象
1.1、 元数据的结构
用于描述Model元数据的是一个ModelMetadata对象,它具有层级结构
1 2 3 4 5 6 7 8 9 | public class ModelMetadata { public object Container { get ; set ; } // 模型的容器的类型。 public Type ContainerType { get ; } // 获取模型元数据对象的集合,这些对象描述模型的属性。 public virtual IEnumerable<ModelMetadata> Properties { get ; } //……其他成员 } |
构造方法及类型、值、依赖关系等信息
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 | 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来添加自定义属性。
1.1.1、 IsComplexType属性
IsComplexType属性判断被描述数据是否复杂类型的条件是:它是否支持资源字符串的类型转换。依照这个标准,所有基元类型和可空值类型都是简单类型。而一个自定义类型默认是一个复杂类型,但可以为它应用一个TypeConverterAttribute特性并指定一个支持字符串转换的TypeConvert类型,则可以将其转变为一个简单类型。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | [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); } } |
1.2、 元数据的定制
ASP.NET MVC通过应用在数据类型或其属性成员上的数据注解特性(主要定义在using System.ComponentModel.DataAnnotations.dll中)来定制描述目标类型或数据成员的Model元数据。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 | 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 ; } } |
1.2.1、 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属性为空的会被选中。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 解答了困扰我五年的技术问题
· 为什么说在企业级应用开发中,后端往往是效率杀手?
· 用 C# 插值字符串处理器写一个 sscanf
· Java 中堆内存和栈内存上的数据分布和特点
· 开发中对象命名的一点思考
· 为什么说在企业级应用开发中,后端往往是效率杀手?
· DeepSeek 解答了困扰我五年的技术问题。时代确实变了!
· 本地部署DeepSeek后,没有好看的交互界面怎么行!
· 趁着过年的时候手搓了一个低代码框架
· 推荐一个DeepSeek 大模型的免费 API 项目!兼容OpenAI接口!