ASP.NET MVC中Model元数据解析学习

闲来继续学习蒋金楠大师的ASP.NET MVC框架揭秘一书,当前主要阅读的内容是Model元数据的解析,即使是阅读完的现在,仍然有不少细节不是特别明白。好在这部分内容主要是关于Razor引擎的呈现的,通过注解的方式对Model进行自定的修饰,最终使得页面在渲染时(即从cshtml文件转化为html时),相关的数据能够按照指定的形式转化并显示。由于接下来的项目中不再打算使用Razor引擎,该引擎虽然很不错,但也有一些问题,例如存在HTML5代码与HtmlHelper的混写,使得UI层很难与业务代码层完全的分离。所以不太利于程序开发的分工,在当前的互联网需求迅速变化的场景下变得不是也别适合。而且相关工作人员的招聘等问题上也比较难得处理,不可能要求每一个工程师都具有全栈能力,企业也可能负担的其相关成本,自己对微软2012年推出的blend开发模式不太了解,不知道是不是只是支持WPF,WinForm等,可能有些理解上问题,请给予指正。个人观点上,更倾向于直接使用HTML5开发,框架主要负责路由,过滤器等功能,当前携程等网站也主要采用这种方式。因此,该章节算是选学了,主要介绍一些主要的概念。

首先要提及的是元数据,一说元数据,大家第一反应可能都是一样的,就是中间语言IL中对类的描述信息。一般我们可以通过自定义特性的方式对其进行扩充,这儿的Model元数据只要用于控制Model对象(ViewModel对象),在View上的呈现形式。其使用System.Web.Mvc.ModelMetadata来表示Model元数据,并且ModelMetadata是一种迭代,支持自包含的结构,有点像组合模式。如果ModelMetadata是一个复杂类型,可以通过一个相应的XXXTypeConverter辅助类将其转化为简单类型。

接下来,简单介绍一下与该框架相关数据注解特性,框架就是依靠这些注解特性和相应的模板方法来控制Model数据的显示,如下表所示。


特性名称


UIHintAttribute

 

HiddenInputAttribute


ScaffoldColumnAttribute


DisplayTypeAttribute


DisplayFormatAttribute


EditableAttribute


ReadOnlyAttribute


DisplayAttribute


DisplayNameAttribute


RequiredAttribute

 

AllowHtmlAttribute

 

RadioButtonListAttribute


CheckBoxListAttribute


DropdownListAttribute


ListBoxAttribute

相关特性大部分都是顾名思义,比较容易理解,也与EF中的注解特性相似,就不一一介绍了。需要注意的是,如果想自定义一个特性,那么就要实现IMetadataAware接口,与它同名的接口也经常出现在.NET相关数据绑定中,代码如下所示。


[AttributeUsage(AttributeTargets.Class | AttributeTargets.Property)]

public class DisplayTextAttribute : Attribute, IMetadataAware

{

private static Type staticResourceType;

public string DisplayName { get; set; }

public Type ResourceType { get; set; }

public DisplayTextAttribute()

{

this.ResourceType = staticResourceType;

}

public void OnMetadataCreated(ModelMetadata metadata)

{

this.DisplayName = this.DisplayName ?? (metadata.PropertyName ?? metadata.ModelType.Name);

if (null == this.ResourceType)

{

metadata.DisplayName = this.DisplayName;

return;

}

PropertyInfo property = this.ResourceType.GetProperty(this.DisplayName, BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Static);

metadata.DisplayName = property.GetValue(null, null).ToString();

}

public static void SetResourceType(Type resourceType)

{

staticResourceType = resourceType;

}

}

Tip:注意在项目中定义相关资源文件,将英文的属性名转化为中文。

常见模板方法为:


模板方法


HtmlHelper<TModel>


Display


DisplayFor

 
Editor


EditorFor

 
DisplayForModel


EditForModel

 
Label


LabelFor

 
DisplayText


DisplayTextFor

 
DropdownList


DropdownListFor

 
ListBox


ListBoxFor

以上可以很清楚的看到显示模式和编辑模式两种不同的显示形式,由于框架是根据元数据对象中的数据类型属性值去寻找对应模板的,因此将需要将模板的View定义放在EditorTemplates目录下。接下来通过一个表格介绍一些框架预定义的模板。


预定义方法


EmailAddress


HiddenInput


Html


Text&String


Url


MultilineText


Password


Decimal


Boolean


Collection


Object

 

最后用一个简图介绍下与ModelMetadata相关的类加强理解与记忆。

可以看到,ModelMetadata是会进行缓存的,并且通过原型模式进行创建,在.NET中经常可以看到Provider,这儿主要起一个提供者的作用,但与工厂类等其他创建型模式有什么区别仍然不是很清楚,还需要加强理解。

注:本文主要供自己学习,不妥之处望见谅。

参考资料:

[1]蒋金楠. ASP.NET MVC4框架揭秘[M]. 上海:电子工业出版社, 2012. 123-182

时间: 2024-07-30 13:51:04

ASP.NET MVC中Model元数据解析学习的相关文章

ASP.NET MVC中Model相关技术

在Model里的程序,由于“只能”跟数据与商业逻辑有关,因此Model专注于如何有效地提供数据访问机制.交易环境.数据格式.商业逻辑验证等工作. 一.使用Code First创建数据模型 数据库开发模式有数据库优先开发模式(Database First Development).模型优先开发模式(Model First Development)和程序代码优先开发模式(Code First Development)这三种.ASP.NET MVC的Model数据库开发模式为程序代码优先开发模式,使用

ASP.NET MVC中的ActionFilter介绍学习

一直都知道MVC中的ActionFilter,只是没有在实际项目中使用过. 顾名思义,ActionFilter就是指在Action上的Filter, 那么,在Action上的Filter到底有哪些呢.首先我们看看MVC中的Controller基类(抽象类) public abstract class Controller : ControllerBase, IActionFilter, IAuthenticationFilter, IAuthorizationFilter, IDisposabl

MVC之Model元数据

Contronoller激活之后,ASP.NET MVC会根据当前请求上下文得到目标Action的名称,然后解析出对应的方法并执行之. 在整个Action方法的执行过程中,Model元数据的解析是一个非常重要的环节.ASP.NET MVC中的Model实际上View Model,表示最终绑定到View上的数据,而Model元数据描述了Model的数据结构,以及Model的每个数据成员的一些特性. 正是有了Model元数据的存在,才使模板化HTML的呈现机制成为可能.此外,Model元数据支撑了A

mvc Model元数据【学习笔记】

页面中Html.Editorfor(model=>model.fieldname)这些方法,都是通过Model的元数据来生成html的,我们如果想控制最终生成的html,可以通过修改元数据来实现. 代表Model元数据的类名是ModelMetadata,获取一个Model类的元数据的方法如下: public static ModelMetadata GetModelMetadata<TModel>(string propertyName) {     ModelMetadataProvi

ASP.NET MVC中对Model进行分步验证的解决方法

原文:ASP.NET MVC中对Model进行分步验证的解决方法 在我之前的文章:ASP.NET MVC2.0结合WF4.0实现用户多步注册流程中将一个用户的注册分成了四步,而这四个步骤都是在完善一个Model的信息,但是又分页面填写信息的,当时我加上ModelState.IsValid这句验证代码的时候,根本没法通过验证,因为在注册的前面三步,注册用户的Model信息都没填写完整,而ModelState.IsValid是对一个实体的所有属性进行判断验证的.当时很纠结,因为刚接触Asp.net

&lt;转&gt;ASP.NET学习笔记之在ASP.NET MVC中使用DropDownList

看到一篇关于dropdownlist的用法很好的阐述,比较清楚,留着,防止以后自己不记得,还可以瞅瞅. 在ASP.NET MVC中,尽管我们可以直接在页面中编写HTML控件,并绑定控件的属性,但更方便的办法还是使用HtmlHelper中的辅助方法.在View中,包含一个类型为HtmlHelper的属性Html,它为我们呈现控件提供了捷径. 我们今天主要来讨论Html.DropDownList的用法,首先从Html.TextBox开始. Html.TextBox有一个重载方法形式如下: publi

ASP.NET MVC 中应用Windows服务以及Webservice服务开发分布式定时器

ASP.NET MVC 中应用Windows服务以及Webservice服务开发分布式定时器一:闲谈一下:1.现在任务跟踪管理系统已经开发快要结束了,抽一点时间来写一下,想一想自己就有成就感啊!!  2.关于任务跟踪管理系统项目中遇到的Windows服务以及Webservice的综合应用的问题. 大家好这是我第二次写博客 ,写的不好请大家多多谅解, 希望大家可以多多指正. 二:我稍微的整理了一下关于这个分布式定时器需求:1.根据任务跟踪管理系统中的数据库的AnswerSheet 表格中找到客户编

ASP.NET MVC3中Model验证

原文:ASP.NET MVC3中Model验证 概述 上节我们学习了Model的数据在界面之间的传递,但是很多时候,我们在数据传递的时候为了确保数据的有效性,不得不给Model的相关属性做基本的数据验证. 本节我们就学习如何使用 System.ComponentModel.DataAnnotations 命名空间中的特性指定对数据模型中的各个字段的验证. 这些特性用于定义常见的验证模式,例如范围检查和必填字段.而 DataAnnotations 特性使 MVC 能够提供客户端和服务器验证检查,使

ASP.NET MVC中Controller与View之间的数据传递总结

在ASP.NET MVC中,经常会在Controller与View之间传递数据,因此,熟练.灵活的掌握这两层之间的数据传递方法就非常重要.本文从两个方面进行探讨: Ø Controller向View传递数据 Ø View向Controller传递数据 一.Controller向View传递数据 1.       使用ViewData传递数据 我们在Controller中定义如下: ViewData[“Message”] = “Hello word!”; 然后在View中读取Controller中