【笔记】ASP.NET MVC Model元数据
问题1:什么叫Model元数据?
Model元数据,是针对数据类型的一种描述信息。由于复杂类型(或者说类型嵌套的存在,比如CustomerModel中有一个属性为复杂类型Address)的存在,因此Model 元数据为树形结构:
//namespace:System.Web.Mvc
public class ModelMetadata
{
//其它成员 //当前模型类型
//倘若用数据库中树形结构解释,这个属性相当于Id
public Type ModelType { get; set; } //当前模型类型所属类型
//倘若用数据库中树形结构解释,这个属性相当于ParentId
public Type CotainerType { get; set; } }
在ASP.NET MVC中对应被定义为类型 “ModelMetadata”,其作用主要体现在以下两个方面:
1、控制数据类型本身及其成员属性在界面上的呈现方式;
//namespace:System.Web.Mvc
public class ModelMetadata
{
//其它成员 //模型名称
public virtual string DisplayName { get; set; }
}
上面代码将MVC框架定义的Model元数据精简为一个属性,该属性用于呈现Model或者Model数据中元素在UI上的显示名称。这样说过于抽象,下面的的代码是我们在MVC程序开发时候常写写的界面模型类:
//用户界面模型
public class CustomerModel
{
[DisplayName("用户姓名")]
public string Name{get;set;} public string Gender{get;set;}
}
给CustomerModel的 Namei属性添加DisplayName 特性,Gender属性不做任何操作,倘若在强类型视图上使用@Html.DisplayFor(d=>d.Name); @Html.DisplayFor(d=>d.Gender)显示用户信息,会发现Name会显示“用户姓名”,而Gender属性的显示仅仅是原样输出为Gender;
事实上,DisplayName特性就是通过改变ModelMetadata的DisplayName来达到这一效果,也就是说,特性的作用在于定制ModelMetadata。
2、Model绑定和验证提供必不可少的元数据
绑定以后提及,至于验证,看下面代码:
//namespace:System.Web.Mvc
public class ModelMetadata
{
//其它成员 //是否必填
public virtual bool IsRequired{ get; set; }
}
//用户界面模型
public class CustomerModel
{
[Required]
public string Name{get;set;} public string Gender{get;set;}
}
同理,Required特性定制了Model元数据中的IsRequired属性以达到针对模型的验证。
问题2:如何针对Model元数据进行定制?
问题1中说明了ModelMetadata类的各属性控制了数据在UI中的呈现、验证、绑定。那么如何获取或设置ModelMetadata类的各属性呢?答案是使用特性【Attribute】。
可以用于定制Model元数据的特性有如何:
1、UIHintAttribute
HtmlHelper定义了一系列模板方法,比如DisplayFor/Display、EditorFor/Editor,所谓模板方法,就是Model数据与HTML标签的封装。其效果类似于强类型的PartialView。
UIHintAttribute特性的作用就在于为Model中的属性或者字段显示指定模板,当UI出现@Html.DisplayFor(d=>d.Name)语句,ASP.NET MVC将会用UIHintAttribute指定的模板展示Model数据。
MVC有一套寻找模板的规则,默认吗没有指定模板情况下,MVC将从@DisplayFor(d=>d.Name) lamba表达式中得到Name的数据类型,根据该数据类型在预定义的目录下去寻找不同的模板。而同一种数据类型模板,又可以分为编辑模板(EditorFor)、显示模板(DisplayFor)。倘若指定了一个具体的模板名称,ASP.NET MVC 会自动采用该模板来生成最终的HTML。而指定的模板通常按显示模式定义在EditorTemplates目录或DisplayTemplates目录下。这些目录可以存在于Views/Shared、Views/{ControllerName}下;
可以做个测试。
首先定义数据模型:
public class CustomerModel
{
[UIHint("Name")]
public string Name { get; set; } public string Gender { get; set; }
}
通过UIHint特性指定了显示模板为“Name”;
控制器中实例一个CustomerModel对象,并传递给视图View。
public ActionResult Index()
{
CustomerModel model = new CustomerModel()
{
Name = "小李",
Gender = "男"
};
return View(model);
}
新建View如下:
<body>
<div>
@Html.DisplayFor(d=>d.Name)<br />
@Html.DisplayFor(d => d.Gender)
</div>
</body>
</html>
主要Gender属性我们并没有指定显示模板,接着需要在DisplayTemplates目录下新建Name 视图:
@model string <h3 style="color:red;">我是自定义模板:@Html.TextBox(Model,Model)</h3>
最终运行结果如下:
APS.NET MVC预定义模板总共有这么几个:
模板名称 | 模板作用 | 模板说明 |
EmailAddress | Emal地址呈现 | 仅具有显示模式 |
HiddenInput |
显示模式下文本显示; 编辑模式下文本+一个隐藏的<inptu> |
HiddenInput(DisplayValue=false) 时,显示模式、编辑模式显示文本均消失。 |
Html | 将模型数据中包含的HTML原样呈现 | 仅限于显示模式,效果与Html.Raw()相同 |
Text与String | ---- | 显示模式下直接以文本的形式输出,编辑模式下对应一个单行文本框 |
MultilineText | 多行文本(<input type="text"/>) | 仅限于编辑模式 |
Password | 密码框 | 仅限于编辑模式 |
Decimal | 小数位统一化为两位小数 | 显示模式:文本;标记哦是:单行文本框 |
Boolean | ---- | 显示模式:一个checkbox,disabled=true;编辑模式:一个chekbox,加一个隐藏的checkbox,两者name相同,value相异 |
Colloection | 集合数据呈现 | …………………… |
Object | 备胎 | 找不到其它,最终就是它。根据元数据DisplayName生成一个<div> |
2.HiddenInputAttribute与ScaffoldColumnAttribute
通过应用HiddenInputAttribute,该特性的目标对象以只读的形式显示出来,如果不希望显示,可以设置特性的DisplayValue为false([HiddenInput(DisplayValue=false)])。
通过应用ScaffoldColumnAttribute,该特性的目标对象不会出现在最终生成的Html中,区别与HiddenInputAttribute,HiddenInputAttribute目标元素会以type=hidden的形式出现在最终生成的Html当中;
3.DataTypeAttribute与DisplayFormatAttribute
这里的DataTypeAttribute不同于CLR类型,而是通过系统定义的枚举类型:DataType来表示具有某种显示格式的数据类型。枚举DataType定义如下:
// 摘要:
// 表示与数据字段和参数关联的数据类型的枚举。
public enum DataType
{
// 摘要:
// 表示自定义的数据类型。
Custom = ,
//
// 摘要:
// 表示时间上的一刻,以日期和当天的时间表示。
DateTime = ,
//
// 摘要:
// 表示日期值。
Date = ,
//
// 摘要:
// 表示时间值。
Time = ,
//
// 摘要:
// 表示对象存在的一段连续时间。
Duration = ,
//
// 摘要:
// 表示电话号码值。
PhoneNumber = ,
//
// 摘要:
// 表示货币值。
Currency = ,
//
// 摘要:
// 表示所显示的文本。
Text = ,
//
// 摘要:
// 表示一个 HTML 文件。
Html = ,
//
// 摘要:
// 表示多行文本。
MultilineText = ,
//
// 摘要:
// 表示电子邮件地址。
EmailAddress = ,
//
// 摘要:
// 表示密码值。
Password = ,
//
// 摘要:
// 表示 URL 值。
Url = ,
//
// 摘要:
// 表示图像的 URL。
ImageUrl = ,
}
事实上,DataTypeAttribute是一个验证特性,MVC在数据绑定期间将会根据应用了DataTypeAttribute的目标元素验证。
DisplayFormatAttribure用于控制目标元素的显示形式。
4 其它
EditableAttribute与ReadOnlyAttributr控制目标元素的可读写性,两者实质等同,同时出现的情况下,前者具有更高的优先级;
DisplayAttribute与DisplayNameAttribute 为目标元素定义一些说明性文字。同时出现的情况下,前者具有更高的优先级;此外,由于DisplayAttribute设置的文字都是面向最终用户的,所以有必要对其斤西瓜本地化,所以该特性提供了ResourceType属性用于代表采用的资源文件类型。
RequiredAttribute顾名思义,其将目标元素设置为必需的数据成员。
【笔记】ASP.NET MVC 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元数据的概念很模糊,或者说是在大脑中没有它的一个模型,作为小白的我去看网上的一些文章还是两眼一黑啥都看不明白,然后我想退 ...
- ASP.NET MVC Model元数据
ASP.NET MVC Model元数据(三) 前言 在上篇中我们大概的讲解了Model元数据的生成过程,并没有对Model元数据本身和详细的生成过程有所描述,本篇将会对详细的生成过程进行讲解,并且会 ...
- ASP.NET MVC Model绑定(一)
ASP.NET MVC Model绑定(一) 前言 ModelMetadata系列的结束了,从本篇开始就进入Model绑定部分了,这个系列阅读过后你会对Model绑定有个比较清楚的了解, 本篇对于Mo ...
- ASP.NET MVC Model绑定
ASP.NET MVC Model绑定(一) 前言 ModelMetadata系列的结束了,从本篇开始就进入Model绑定部分了,这个系列阅读过后你会对Model绑定有个比较清楚的了解, 本篇对于Mo ...
- ASP.NET MVC Model验证(四)
ASP.NET MVC Model验证(四) 前言 本篇主要讲解ModelValidatorProvider 和ModelValidator两种类型的自定义实现,前者是Model验证提供程序,而Mod ...
随机推荐
- Android开发教程AnimationDrawable逐帧播放动画
下面我们一起来看篇Android开发AnimationDrawable控制逐帧播放动画实现过程,希望文章对各位朋友带不一些帮助. 当我们点击按钮时,该图片会不停的旋转,当再次点击按钮时,会停止在当前的 ...
- jquery 分页控件功能
<script> //分页 function getPageNum(num) { $("#PageNum ul" ...
- POJ C++程序设计 编程题#3 编程作业—多态与虚函数
编程题 #3 来源: POJ (Coursera声明:在POJ上完成的习题将不会计入Coursera的最后成绩.) 注意: 总时间限制: 1000ms 内存限制: 65536kB 描述 下面的程序输出 ...
- HTML 5 Canvas
HTML 5 Canvas HTML5 的 canvas 元素使用 JavaScript 在网页上绘制图像. <canvas id="myCanvas" width=&q ...
- mutex 简单介绍
“mutex”是术语“互相排斥(mutually exclusive)”的简写形式,也就是互斥量. 当两个或更多线程需要同时访问一个共享资源时,系统需要使用同步机制来确保一次只有一个线程使用该资源.M ...
- 如何消除选定TextBox后的光标但又不失去焦点。
情景描述: 选择TextBox里的内容 Name:textTile 但是没有光标. 相关实现代码: [DllImport("user32", EntryPoint = " ...
- 将CentOS配置成本地yum
默认的yum是以网络来安装的,在没有网络或者网速不佳的情况下,通过yum来安装软件是意见非常痛苦的事情.其实对于CentOS DVD来说,里面提供的软件就足以满足我们的需要了,而且DVD里的软件版本都 ...
- 【转】Doscommand-操作Cmd的第三方控件
核心用法: Doscommand1.CommandLine := 'cmd /c' +[命令];Doscommand1.OutputLines :=Memo1.Lines;Doscommand1.Ex ...
- PHP实例 表单数据插入数据库及数据提取 用户注册验证
网站在进行新用户注册时,都会将用户的注册信息存入数据库中,需要的时候再进行提取.今天写了一个简单的实例. 主要完成以下几点功能: (1)用户进行注册,实现密码重复确认,验证码校对功能. (2)注册成功 ...
- Treeview获取父节点
private void treeView1_SelectedItemChanged(object sender, RoutedPropertyChangedEventArgs<object&g ...