ASP.NET MVC Model元数据(五)
ASP.NET MVC Model元数据(五)
前言
在上一篇中我们描述了应用于Model上面的各种用于显示控制的特性类,在本篇中将详细的介绍这些特性类的应用,虽然它们跟Model元数据的直接关系并不大,但是我们可以用它们在编码阶段控制运行时的显示。
Model元数据
- 什么是Model元数据?
- 生成Model元数据的过程【一】
- 生成Model元数据的过程【二】
- ModelMetaData的定义、详解
- Model元数据应用(常用特性应用)-1
- Model元数据应用(自定义视图模板)-2
- Model元数据应用(IMetadataAware接口使用)-3
Model元数据应用(常用特性应用)-1
所用示例:
代码1-1
public class Customer
{
public string CustomerID { get; set; }
public string Name { get; set; }
public DateTime RegistrationDate{ get; set; }
public Address Address { get; set; }
}
public class Address
{
public string AddressName { get; set; }
}
这是下面所要用的示例Model,下面的代码1-2示例是使用自定义模型绑定器用于获取Model数据的,大家只需要看数据的值就行了,对于Model绑定部分后续的篇幅的中再介绍。
代码1-2
public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
{
return new Customer()
{
CustomerID = "",
Name = "测试人员",
RegistrationDate = DateTime.Now,
Address = new Address()
{
AddressName = "天空之城"
}
};
}
HiddenInputAttribute
HiddenInputAttribute类型所表示的意思是将应用的属性显示为隐藏输入域类型(Hidden),其中包含一个属性DisplayValue表示是否显示这个隐藏的输入域,我们修改一下代码1-1中的内容:
代码1-3
[HiddenInput(DisplayValue=true)]
public string CustomerID { get; set; }
然后看一下我们在视图界面的代码:
代码1-4
@model ConsoleApplication2.Customer
@{
ViewBag.Title = "Show";
}
<h2>Show</h2>
<p>@Html.EditorForModel()</p>
结果如图1.
图1
在图1中我们看到CustomerID对应的属性值“010”在页面里显示为只读的文本状态,生成的Html代码如下:
<input name="CustomerID" id="CustomerID" type="hidden" value="010"/>
修改代码1-3中的DisplayValue属性值为true后,视图部分的代码不变,运行结果如图2。
图2
在图2中,已经看不到CustomerID属性所表示的项了,看到这里相信我们已经了解了HiddenInputAttribute类型的使用了吧。
DataTypeAttribute
看上面的图2 ,RegistrationDate属性所对应的值都是日期时间格式的,那怎么控制属性值的输入样式呢?比如说想让属性值显示为日期类型,来看代码1-5
代码1-5
[DataType(DataType.Date)]
public DateTime RegistrationDate{ get; set; }
视图部分的代码不用改变来看一下结果图3
图3
从上图中看出输出值的格式样式已经改变了。
DisplayAttribute
DisplayAttribute类型用于指示的属性所显示的标签值的修改,比如说图3中的Name和RegistrationDate,想显示我们成我们自定义的名称就要用DisplayAttribute类型,来看代码1-6.
代码1-6
[Display(Name="姓名")]
public string Name { get; set; }
[DataType(DataType.Date)]
[Display(Name="注册日期")]
public DateTime RegistrationDate{ get; set; }
视图部分的代码依旧不变,我们来看一下运行的结果图4。
图4
从图4我们已经看到更改了
Model元数据应用(自定义视图模板)-2
UIHintAttribute
本小节对视图模板和UIHintAttribute类型的使用做一些简单的介绍。
视图模板是什么意思呢?就是根据Model元数据提供的信息生成为指定的视图模板所对应的Html代码(包含Html元素样式),我们看一下示例,这样比较直观。
代码2-1
public class Customer
{
[HiddenInput(DisplayValue=false)]
public string CustomerID { get; set; } [Display(Name="姓名")]
[UIHint("Password")]
public string Name { get; set; } [DataType(DataType.Date)]
[Display(Name="注册日期")]
public DateTime RegistrationDate{ get; set; } public Address Address { get; set; }
}
从代码2-1中的Name属性上看到UIHintAttribute类型的特性,使用它的意思就是指定一个视图模板来为这个属性生成Html代码,这样为了直观的可以看出来所以使用了Password视图模板,这个Password视图模板的意思讲Model元数据所对应的属性值生成为一个单行的文本框Input元素,并且元素中的字符是不可见的,是可编辑的。看一下结果图5.
图5
所对应的Html代码2-2
代码2-2
<input name="Name" class="text-box single-line password" id="Name" type="password" value="测试人员"/>
系统为我们提供了许多视图模板,但是也不能乱用的,要保持使用的视图模板所需类型和指定的属性一致的。
自定义视图模板
细心的朋友可能会发现在上面的显示页面中都没有发现Address属性的值,这个在前篇就强调过,因为Address属性对应的类型在生成Model元数据的时候被判别为复杂类型,而模板视图辅助器是不会去对复杂类型进行处理的,那我们要怎么显示Address属性中的值呢?
我们使用自定义的视图模板,当然作用不止这么一点,只是用来讲解而已。
首先项目中的/Views/Shared的目录下新建一个名为EditorTemplates的文件夹,然后在此文件夹中新建一个强类型的分布视图文件,类型是指定属性对应的类型,并且命名视图文件为指定属性的类型名称,按照示例来说就是Address类型的名称就是Address,完成后应该是这样的,图6
图6
在此视图中添加如代码2-3。
代码2-3
<p>
@Html.LabelFor(m=>m.AddressName)
@Html.EditorFor(m => m.AddressName)
</p>
然后修改代码2-1中的Address属性,并且修改Address类型里的AddressName属性要显示的名称,用我们上面讲过的DisplayAttribute类型示例代码2-4
代码2-4
public class Customer
{
[HiddenInput(DisplayValue=false)]
public string CustomerID { get; set; } [Display(Name="姓名")]
[UIHint("Password")]
public string Name { get; set; } [DataType(DataType.Date)]
[Display(Name="注册日期")]
public DateTime RegistrationDate{ get; set; } [UIHint("Address")]
public Address Address { get; set; }
}
public class Address
{
[Display(Name="地址名称")]
public string AddressName { get; set; }
}
然后再修改掉我们主视图页面的代码,使用EditFor辅助器单独的对Address属性进行处理操作,如代码2-5所示。
代码2-5
@model ConsoleApplication2.Customer
@{
ViewBag.Title = "Show";
}
<h2>Show</h2>
<p>@Html.EditorForModel()</p>
<p>@Html.EditorFor(m=>Model.Address)</p>
然后我们看一下修改后的结果图7.
图7
还有一些其他的特性类型的使用示例会在以后修改本篇,现在本人也不是太熟不能乱写的。
Model元数据应用(IMetadataAware接口使用)-3
前面的篇幅对Model元数据的生成的详细过程以及使用都有所粗略的讲解,想必这时大家已经对Model元数据有所了解了,这个小节介绍如何使用IMetadataAware接口类型来实现我们直接操作Model元数据,从而跳过那些使用系统自带的那些特性类,它们是可以先设置,但是我们也可以自定义的设置Model元数据的值,好了废话不多说了往下看吧。
在Model元数据(二)的篇幅里,我们提到过的内容中,在Model元数据生成后的最后一步过程是会调用Model元数据生成提供程序中的一个函数,在此函数中MVC框架会检索当前Model元数据所指定的类型上的所有特性类型集合,检索出实现了IMetadataAware接口的特性类,然后使用这个实现类型对当前Model元数据进行操作。可能朋友们看我的这段叙述有点模糊,那我们直接来看示例代码吧。
首先我们定义个类型来实现IMetadataAware接口类型,而根据MVC框架检索的前提约定,我们需要把自定义的类型定义为特性类,如代码3-1所示:
代码3-1
[AttributeUsage(AttributeTargets.Class|AttributeTargets.Property,AllowMultiple=false,Inherited=false)]
public class MyCustomMetadataAware:Attribute,IMetadataAware
{
public void OnMetadataCreated(ModelMetadata metadata)
{
if (metadata != null)
{
if (metadata.DisplayName == "地址名称")
{
metadata.DisplayName = "经过IMetadataAware修改的地址名称";
}
}
}
}
在代码3-1中,我们自定义的类型MyCustomMetadataAware实现了IMetadataAware接口类型,并且在OnMetadataCreated()方法中对metadata参数(Model元数据)进行修改,修改的属性DisplayName是Model元数据控制器对应属性显示的名称,在这个MyCustomMetadataAware类型中我们把这个DisplayName属性值如果符合某种条件下修改掉(为了配合上面的示例)。
我们再来看一下我们的Model定义,如代码3-2:
代码3-2
public class Customer
{
[HiddenInput(DisplayValue=false)]
public string CustomerID { get; set; } [Display(Name="姓名")]
[UIHint("Password")]
public string Name { get; set; } [DataType(DataType.Date)]
[Display(Name="注册日期")]
public DateTime RegistrationDate{ get; set; } [UIHint("Address")]
public Address Address { get; set; }
}
public class Address
{
[Display(Name="地址名称")]
[MyCustomMetadataAware]
public string AddressName { get; set; }
}
在代码3-2中,我们把Model中的Address属性所对应的Address类型中的AddressName属性加上了我们自定义的特性类,意在修改这个属性最后在页面上显示出来的值。
我们看一下修改后的结果图8.
图8
从图8中我们可以清楚的看到对应地址栏的标签名称已经被修改掉了,对于系统提供的这个IMetadataAware接口我们可以做更多的自定义操作,这种方式的编程模式我们也是很常见的。
Model元数据部分到这里就全部结束了,其中也会有很多细节的部分没有讲的很到位、没有很全面,因为博主是小白有什么写的不好的地方朋友们可以提出来,我会学习并且再来回的修改篇幅,能在这里为大家尽一点薄力感到很荣幸,也谢谢大家的支持。下一个系列将是Model绑定的部分,大家敬请期待。
作者:金源
出处:http://www.cnblogs.com/jin-yuan/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面
ASP.NET MVC Model元数据(五)的更多相关文章
- ASP.NET MVC Model验证(五)
ASP.NET MVC Model验证(五) 前言 上篇主要讲解ModelValidatorProvider 和ModelValidator两种类型的自定义实现, 然而在MVC框架中还给我们提供了其它 ...
- ASP.NET MVC Model绑定(五)
ASP.NET MVC Model绑定(五) 前言 前面的篇幅对于IValueProvider的获取位置和所处的生成过程做了讲解,本篇将会对IValueProvider的使用做个基础的示例讲解,读完本 ...
- 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元数据
问题1:什么叫Model元数据? Model元数据,是针对数据类型的一种描述信息.由于复杂类型(或者说类型嵌套的存在,比如CustomerModel中有一个属性为复杂类型Address)的存在,因此M ...
- ASP.NET MVC Model绑定(一)
ASP.NET MVC Model绑定(一) 前言 ModelMetadata系列的结束了,从本篇开始就进入Model绑定部分了,这个系列阅读过后你会对Model绑定有个比较清楚的了解, 本篇对于Mo ...
随机推荐
- Python高手之路【六】python基础之字符串格式化
Python的字符串格式化有两种方式: 百分号方式.format方式 百分号的方式相对来说比较老,而format方式则是比较先进的方式,企图替换古老的方式,目前两者并存.[PEP-3101] This ...
- C# ini文件操作【源码下载】
介绍C#如何对ini文件进行读写操作,C#可以通过调用[kernel32.dll]文件中的 WritePrivateProfileString()和GetPrivateProfileString()函 ...
- 恢复SQL Server被误删除的数据(再扩展)
恢复SQL Server被误删除的数据(再扩展) 大家对本人之前的文章<恢复SQL Server被误删除的数据> 反应非常热烈,但是文章里的存储过程不能实现对备份出来的日志备份里所删数据的 ...
- Docker 第一篇--初识docker
已经多年不写博客, 看完<晓松奇谈>最后一期猛然觉醒, 决定仔细梳理下自己这几年的知识脉络. 既然决定写, 那么首先就从最近2年热门的开源项目Docker开始.Docker 这两年在国内很 ...
- solr_架构案例【京东站内搜索】(附程序源代码)
注意事项:首先要保证部署solr服务的Tomcat容器和检索solr服务中数据的Tomcat容器,它们的端口号不能发生冲突,否则web程序是不可能运行起来的. 一:solr服务的端口号.我这里的sol ...
- TypeScript为Zepto编写LazyLoad插件
平时项目中使用的全部是jQuery框架,但是对于做webapp来说jQuery太过于庞大,当然你可以选择jQuery 2.*针对移动端的版本. 这里我采用移动端使用率比较多的zepto框架,他跟jqu ...
- 通过VMware的PowerCLI配置集群内指定主机的vMotion功能
PowerCLI是VMware开发的基于微软(MSFT)的PowerShell的命令行管理vSphere的实现,因此在批量化操作方面CLI会减轻很多GUI环境下的繁琐重复劳作. 现有场景中有大量的物理 ...
- 漫谈C#编程语言在游戏领域的应用
0x00 前言 随着微软越来越开放,C#也变得越来越吸引人们的眼球.而在游戏行业中,C#也开始慢慢地获得了关注.这不, 网易绝代双娇手游团队已经全面使用.Net Core支持前后端统一C#开发,跨平台 ...
- Entity Framework 教程——DBContext
DBContext: 在之前的章节<创建实体数据模型>中,EDM为我们创建了SchoolDBEntities 类,它派生子System.Data.Entity.DbContext这个类,这 ...
- 项目持续集成环境(jenkins + SVN + maven + tomcat)
整体流程 每次SVN上代码有变动,触发自动构建动作,并部署到服务器的tomcat上,具体流程: 1.SVN上提交代码修改 2.maven执行Goals 3.将web工程打成war包 4.关闭服务器的t ...