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 = "010",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/

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面

转载于:https://www.cnblogs.com/jin-yuan/p/3809151.html

ASP.NET MVC Model元数据(五)相关推荐

  1. ASP.NET MVC Model绑定(五)

    ASP.NET MVC Model绑定(五) 前言 前面的篇幅对于IValueProvider的获取位置和所处的生成过程做了解说,本篇将会对IValueProvider的使用做个基础的演示样例解说,读 ...

  2. ASP.NET MVC Model绑定(二)

    ASP.NET MVC Model绑定(二) 前言 上篇对于Model绑定的简单演示想必大家对Model绑定的使用方式有一点的了解,那大家有没有想过Model绑定器是在什么时候执行的?又或是执行的过程 ...

  3. 艾伟_转载:学习 ASP.NET MVC (第五回)理论篇

    本系列文章导航 学习 ASP.NET MVC (第一回)理论篇 学习 ASP.NET MVC (第二回)实战篇 学习 ASP.NET MVC (第三回)实战篇 学习 ASP.NET MVC (第四回) ...

  4. ASP.NET MVC Model绑定(四)

    ASP.NET MVC Model绑定(四) 前言 前面的篇幅对于Model绑定器IModelBinder以及实现类型.Model绑定器提供程序都作了粗略的讲解,可以把Model绑定器想象成一个大的容 ...

  5. ModelBinder——ASP.NET MVC Model绑定的核心

    Model的绑定体现在从当前请求提取相应的数据绑定到目标Action方法的参数.通过前面的介绍我们知道Action方法的参数通过ParameterDescriptor来描述,ParameterDesc ...

  6. 学习 ASP.NET MVC (第五回)理论篇

    通过前几篇文章,我们通过ASP.NET MVC创建了一个简单的应用程序,学习了ASP.NET MVC的基本框架和工作流程.但是Demo中很多东西都是VS为我们自动生成的,比如View的html代码等. ...

  7. ASP.NET MVC Model绑定小结

    Model绑定是指从URL提取数据,生成对应Action方法的参数这个过程.前面介绍的一系列Descriptor负责提供了控制器,行为方法和参数的元数据,ValueProvieder负责获取数据,剩下 ...

  8. 【转】【Asp.Net MVC】asp.net mvc Model验证总结及常用正则表达式

    本文属转载,来源:http://www.byywee.com/page/M0/S868/868615.html关于Model验证官方资料:http://msdn.microsoft.com/zh-cn ...

  9. ASP.NET MVC@model多个对象

    需求:同时查看一个产品信息和发布会员的信息 方案1:新建ViewModel 方案2:ViewData.ViewBag 方案3:Tuple<obj1,obj2> 在这里我们使用方案3来实现这 ...

最新文章

  1. args, sys.argv的区别
  2. python编程计算1!+2!+...+10!_如何用C语言编程计算 1!+2!+3!+…+10!?
  3. java理解程序逻辑_使用java理解程序逻辑(5)
  4. VF02 会计凭证过账时间
  5. Android Java 代码设置 layout_weight 属性
  6. tcp 服务端如何判断客户端断开连接
  7. 最新完整版PHP配置文件翻译
  8. 动手学深度学习(PyTorch实现)(五)--多层感知机
  9. readfile读取串口数据_谈一谈使用字体库加密数据仿58同城
  10. html5实现饼图和线图-我们到底能走多远系列(34)
  11. 学渣笔记——Java常用基本数据类型
  12. Python Day4 循环关键字和练习【零基础】
  13. 公司流程 企业所得税 个人所得税
  14. mysql提取身份证生日并查询指定月份的数据
  15. Photoshop——切图小技巧
  16. 《炬丰科技-半导体工艺》RCA清洗系统及清洗液自适应预测温度
  17. android 微博字体高亮,安卓开发札记——高仿新浪微博文字处理(实现关键字高亮,自定义表情替换并加入点击事件实现)...
  18. Windows主机入侵痕迹排查办法
  19. 记录华为勇敢星实习的一次面经
  20. ubuntu 安装code blocks全记录

热门文章

  1. linux1.0内核下载,《Linux 0.01 内核分析与操作系统设计》(Linxu 0.01Source)
  2. python识别latex公式_Python代码转Latex公式,这个开源库用一行代码帮你搞定
  3. 智能车竞赛技术报告 | 双车接力组 - 大连海事大学 - 同舟拾贰队
  4. 利用Python模拟鼠标操作,一键将GIF文件载入CSDN的Markdown编辑器
  5. 2021年春季学期-信号与系统-第九次作业参考答案-第五小题
  6. 联想win10摁F2一直无法进入BIOS
  7. mysql model first,一个支持 CodeFirst/DbFirst/ModelFirst 的数据库小工具
  8. java 9宫格抽奖_前端js实现九宫格模式抽奖(多宫格抽奖)
  9. arr数组怎么取值_JS 面试之数组的几个不 low 操作
  10. 切换不了摄像头 高拍仪_手机摄像头模组支架保护膜的变革之路