Model元数据定制与Model模板
元数据这一词对于计算机科学来说不算陌生,对元数据的解释最简单的解释就是描述数据的数据,那么Model元数据当然是描述Model中各种成员的数据了,在ASP.NET MVC中ModelMetadata这个类专门用于描述Model及其成员的信息,这样就表明Model的描述需要一个ModelMetadata,Model里面的各个属性也需要ModelMetadata;换言之,ModelMetadata这个类有个自引用的现象,类的内部有个集合存储ModelMetadata。其声明如下
IEnumerable<ModelMetadata> Properties
这是ModelMetadata的一个成员,它的成员有很多,按现在的认识就分了两类,一种是包含上述属性的用于描述数据基本信息用的属性;一种是用于定制的属性,那部分包含定制信息的属性主要是用于呈现在View中或控制属性显示的模板。
那么用于描述数据基本信息用的属性就有
|
类型 |
属性名 |
描述 |
|
Iemumerable<ModelMetadata> |
Properties |
属性成员的元数据集合 |
|
Type |
ModelType |
本身的类型 |
|
bool |
IsComplexType |
是否复杂类型 |
|
bool |
IsNullableValueType |
是否可空值 |
|
Type |
ContainerType |
父级类型 |
|
object |
Model |
本类的实例 |
|
string |
PropertyName |
在父类型中的属性名称 |
|
Dictionary<string,object> |
AdditionalValue |
存储自定义属性的字典集 |
|
ModelMetadataProvider |
Provider |
元数据的提供者 |
在这个表中复杂类型这个词要稍作解释,其实也不算难,就是一个类型的值能通过字符串转换过来的就算是简单类型,反之则是复杂类型,例如整形(”1”),浮点型(”1.23”),日期(”2014-07-29”)等类型能通过字符串转换得到相应的(int,float,DateTime)类型的值,那么这个类型就算是简单类型,否则是复杂类型。
另一部分用作定制的属性如下所示
| 类型 | 属性名 | 定制的Attribute | 描述 | 备注 | |
| string | TemplateHint | HiddenInputAttribute | UIHintAttribute | 指定动态数据用来显示数据字段的模板或用户控件。 | 两个Attribute同时使用,后者具有更高的优先级 |
| bool | HideSurrounding | 该特性用于指示是否应将属性值或字段值呈现为隐藏的 input 元素 | |||
| bool | ShowForDisplay | ScaffoldColumnAttribute | 控制目标元素是否应该存在于基架之中 | ||
| bool | ShowForEdit | ||||
| string | DataTypeName | DataTypeAttribute | 指定要与数据字段关联的附加类型的名称。 | ||
| bool | ConvertEmptyStringToNull | DisplayFormatAttribute | 指定 ASP.NET 动态数据如何显示数据字段以及如何设置数据字段的格式。 | ||
| string | NullDisplayText | ||||
| string | DisplayFormatString | ||||
| string | EditFormatString | ||||
| bool | IsReadOnly | EditableAttribute | ReadOnlyAttribute | EditableAttribute:指示数据字段是否可编辑; ReadOnlyAttribute:指定该特性所绑定到的属性是只读属性还是读/写属性。 |
两个Attribute同时使用,前者具有更高的优先级 |
| string | DisplayName | DisplayAttribute | DisplayNameAttribute | 用于设置目标元素的显示名称 | 两者共同使用时,前者具有更高优先级 |
| string | ShowDisplayName | 可以为实体分部类的类型和成员指定可本地化的字符串 | |||
| string | Description | ||||
| int | Order | ||||
| string | watermark | ||||
| bool | IsRequired | RequiredAttribute | 目标元素设置为是否必需的数据成员 | ||
Model模板则是利用Model元数据的定制信息来给HtmlHelper<TModel>的模板方法以特定的形式把数据以及元数据生成Html展示出来。那么这里的模板有框架里面预定义的模板,也可以由开发人员自己去定义的模板。下面则介绍预定义的模板。
预定义模板主要使用的是UIHintAttribute来设置,如前面介绍元数据定制中所描述的:用于指定动态数据用来显示数据字段的模板或用户控件。下面还是以表格的形式展现各个预定义模板的使用还有结果。
| 模板名称 | 使用形式 | 结果 |
| EmailAddress | [UIHint("EmailAddress")]或者 [DataType(DataType.EmailAddress)] |
DisplayFor:<a href="mailto:foo@gmail.com">goo@gmail.com</a> |
| HiddenInput | [UIHint("HiddenInput")] | DisplayFor:1234567 |
| EditFor:<input id="Foo" name="Foo" type="hidden" value="1234567"/> |
||
| Html | [UIHint("Html")]或者 [DataType(DataType.Html)] |
DisplayFor:<a href="www.google.com">google.com</a> |
| Text | [UIHint("Text")]或者 [DataType(DataType.Text)] |
DisplayFor:Admin |
| String | [UIHint("String")] | EditFor:<input class="text-box single-line" id="Foo" name="Foo" type="text" value="Admin"/> |
| Url | [UIHint("Url")]或者 [DataType(DataType.Url)] |
DisplayFor:<a href="http://www.google.com">http://www.google.com</a> |
| MultilineText | [UIHint("MultilineText")]或者 [DataType(DataType.MultilineText)] |
EditFor:<textarea class="text-box multi-line" id="Foo" name="Foo">Admin</textarea> |
| Password | [UIHint("Password")]或者 [DataType(DataType.Password)] |
EditFor:<input class="text-box single-line password" id="Foo" name="Foo" type="password" value=""/> |
| Decimal | [UIHint("Decimal")] | Display:123.00 |
| EditFor:<input class="text-box single-line" id="Foo" name="Foo" type="text" value="123.00\"/> |
||
| Boolean | [UIHint("Boolean")] | Dislplay:<input id="Foo" name="Foo" type="checkbox" value="true" disable="true"/> |
| EditFor:<input id="Foo" name="Foo" type="checkbox" value="true" disable="true"/> <input name="Foo" type="hidden" value="false"/> |
||
| Collection | [UIHint("Collection")] | Display:各元素的Display形式 |
| EditFor:各元素的Edit形式 | ||
| Object | [DisplayName("城市")] | DisplayForModel:<div class="display-label">城市</div> <div class="display-field">佛山市</div> |
此时在一个以UserInfo类型为强类型的视图中调用@Html.DisplayForModel(),类的信息则会显示出来。但是若是UserInfo中的属性一定要是简单类型的;
如果要给类中的某个成员定制模板,如给DateTime类型再定义一个MyDateTime模板
@model DateTime
时间是 @Model.ToString("yyyy-MM-dd HH:mm:ss")
然后给相应的成员使用上标记
[DataType(“MyDateTime”)]
则可。
目前这部分内容还没学习完,经过后续的学习后会继续补充此文,由于还在学习,故会有理解得不恰当的地方,以上有什么说的不对的请指正,有什么好的建议或意见也请分享,谢谢!
Model元数据定制与Model模板的更多相关文章
- .NET/ASP.NETMVC 深入剖析 Model元数据、HtmlHelper、自定义模板、模板的装饰者模式(三)
阅读目录: 7.HtmlHelper.HtmlHelper<T>中的ViewModel的类型推断 8.控制ViewModel中的某个属性的呈现(使用PartialView部分视图细粒度控制 ...
- MVC之Model元数据
Contronoller激活之后,ASP.NET MVC会根据当前请求上下文得到目标Action的名称,然后解析出对应的方法并执行之. 在整个Action方法的执行过程中,Model元数据的解析是一个 ...
- ASP.NET MVC Model元数据(五)
ASP.NET MVC Model元数据(五) 前言 在上一篇中我们描述了应用于Model上面的各种用于显示控制的特性类,在本篇中将详细的介绍这些特性类的应用,虽然它们跟Model元数据的直接关系并不 ...
- ASP.NET MVC Model元数据(四)
ASP.NET MVC Model元数据(四) 前言 前面的篇幅讲解了Model元数据生成的过程,并没有对Model元数据生成过程的内部和Model元数据结构的详细解释.看完本篇后将会对Model元数 ...
- ASP.NET MVC Model元数据(三)
ASP.NET MVC Model元数据(三) 前言 在上篇中我们大概的讲解了Model元数据的生成过程,并没有对Model元数据本身和详细的生成过程有所描述,本篇将会对详细的生成过程进行讲解,并且会 ...
- ASP.NET MVC Model元数据(二)
ASP.NET MVC Model元数据(二) 前言 在上篇中,给大家留个对Model元数据的印象,并没有对Model元数据有过多的讲解,而在本篇中也不会对Model元数据的本身来解释,而是针对于它的 ...
- ASP.NET MVC Model元数据(一)
ASP.NET MVC Model元数据(一) 前言 在我初学的时候对Model元数据的概念很模糊,或者说是在大脑中没有它的一个模型,作为小白的我去看网上的一些文章还是两眼一黑啥都看不明白,然后我想退 ...
- Model元数据提供机制小结
在最开始先我得说说我看这部分的情况,最开始被各种ModelMetadata和各种ModelMetadataProvider给搞晕了,就几页书花了我好大的精力去看,直到后来看了一幅类图,细细看各个类之间 ...
- ASP.NET MVC Model元数据
ASP.NET MVC Model元数据(三) 前言 在上篇中我们大概的讲解了Model元数据的生成过程,并没有对Model元数据本身和详细的生成过程有所描述,本篇将会对详细的生成过程进行讲解,并且会 ...
随机推荐
- js跨浏览器的事件处理函数
/* 跨浏览器的事件处理函数 */ var EventUtil = { addHandler : function(element,type,handler){ if(element.addEvent ...
- H5常用代码:适配方案3
在H5项目中有一种常见的宣传页,就是那种整屏整屏的,带着炫丽进场动画的移动宣传页,不仅是一种欣赏也起到了很大宣传作用. 对于这种整屏的适配,前面通过视口的兼容处理也是可以做到的,但是在窄屏下会在上下有 ...
- 类的继承和多态性-编写Java应用程序,定义Animal类,此类中有动物的属性:名称 name,腿的数量legs,统计动物的数量 count;方法:设置动物腿数量的方法 void setLegs(),获得腿数量的方法 getLegs(),设置动物名称的方法 setKind(),获得动物名称的方法 getKind(),获得动物数量的方法 getCount()。定义Fish类,是Animal类的子类,
编写Java应用程序,定义Animal类,此类中有动物的属性:名称 name,腿的数量legs,统计动物的数量 count;方法:设置动物腿数量的方法 void setLegs(),获得腿数量的方法 ...
- Codeforces Round #380 (Div. 2) 总结分享
B. Spotlights 题意 有n×m个格子的矩形舞台,每个格子里面可以安排一个演员或聚光灯,聚光灯仅可照射一个方向(俯视,上下左右).若聚光灯能照到演员,则称为"good positi ...
- String详解
在开发中,我们都会频繁的使用String类,掌握String的实现和常用方法是必不可少的,当然,我们还需要了解它的内部实现. 一. String的实现 在Java中,采用了一个char数组实现Stri ...
- Python之文件读写
本节内容: I/O操作概述 文件读写实现原理与操作步骤 文件打开模式 Python文件操作步骤示例 Python文件读取相关方法 文件读写与字符编码 一.I/O操作概述 I/O在计算机中是指Input ...
- WP中的语音识别(上):基本识别
WP 8.1目前许多内容仍处于未确定状态,因此,本文所提及的语音识别,是基于WP8的,在8.1中也差不多,也是使用运行时API来实现,如果大家不知道什么是运行时API,也没关系,不影响学习和开发,因为 ...
- jsoup简单的爬取网页数据
/** * Project Name:JavaTest * File Name:BankOfChinaExchangeRate.java * Package Name:com.lee.javatest ...
- 2014牡丹江网络赛ZOJPretty Poem(暴力枚举)
/* 将给定的一个字符串分解成ABABA 或者 ABABCAB的形式! 思路:暴力枚举A, B, C串! */ 1 #include<iostream> #include<cstri ...
- hdu3635 Dragon Balls(带权并查集)
/* 题意:有N个城市, 每一个城市都有一个龙珠(编号与城市的编号相同),有两个操作 T A ,B 将标号为A龙珠所在城市的所有的龙珠移动到B龙珠所在城市中! 思路:并查集 (压缩路径的时候将龙珠移动 ...