Mvc Model 模板的获取【学习笔记】

MVC的Model模板有两种:一种编辑模式(@Html.EditorFor())、一种显示模式(Html.DisplayFor())。

模板的获取与执行(以下转自这里):

当我们调用HtmlHelper或者HtmlHelper<TModel>的模板方法对整个Model或者Model的某个数据成员以某种模式(

显示模式或者编辑模式)进行呈现的时候,通过预先创建的代表Model元数据的ModelMetadata对象都可以找到相

应的模板。如果模板对应着某个自定义的分部View,那么只需要执行该View即可;对于默认模板,则直接可以得

到相应的HTML。

根据Model元数据对目标模板的解析是整个模板方法执行流程中最核心的部分,也是本篇讨论的重点。我们以针对

HtmlHelper<TModel>的扩展方法DisplayFor为例,看看针对通过表达式expression获取的Model对象是如何以显示

模式呈现出来的。

1: public static class DisplayExtensions

2: {

3:     public static MvcHtmlString DisplayFor<TModel, TValue>(this HtmlHelper<TModel> html,

Expression<Func<TModel, TValue>> expression, string templateName);

4: }

在DisplayFor被调用的时候,如果通过参数expression表示的Model获取表达式是针对某个属性的,那么属性名会

被获取出来。然后执行表达式得到一个作为Model的对象,该对象连同属性名(如果有)一起被用于表示Model元

数据的Metadatadata对象。接下来会根据该Metadatadata对象得到一系列表示分部模板View名称的列表,这些

View名称按照优先级排列如下:

作为参数templateName传入的模板名称(如果不为空)。
    Metadatadata的TemplateHint属性值(如果不为空)。
    Metadatadata的DataTypeName属性值(如果不为空)。
    如果Model对象的真实类型为非空值类型,该类型名作为模板View名;否则底层(Underlying)类型名作为模

板View名(比如说,对于int?类型则将Int32作为模板View名)。
    如果Model对象的真实类型为非复杂类型,则使用String模板(由于非复杂类型能够实现与String类型之间的

转换,所以可以转换成String进行呈现)。
    在Model的声明类型为接口情况下,如果该接口继承自IEnuerable则采用Collection模板。
    在Model的声明类型为接口情况下,使用Object模板。
    如果Model声明类型不是接口类型,按照其类型继承关系向上追溯知道Object类型,逐个将类型名称作为模板

View名称。如果声明类型实现了IEnuerable接口,则将最后的Object替换成Collection。

对于得到的这个表示列表,会按照先后顺序便利所有的元素。针对具体的表示模板View名称的某个字符串,会根

据呈现的模式在指定的路径(显示模式和编辑模式分别为“/DisplayTemplates/

{TemplateName}”和“/EditorTemplates/{TemplateName}”)去寻找定义模板的View。如果这样的View存在,则

直接执行该View并返回。如果不能找到自定义模板分部View,则根据该模板名称在默认的模板列表中查找,如果

存在名称匹配的默认模板,则直接返回默认模板对应的HTML。如果默认的模板列表中的名称均与指定的名称不匹

配,在进入下一次迭代。

Mvc Model 模板的获取【学习笔记】

时间: 2024-10-31 14:34:18

Mvc Model 模板的获取【学习笔记】的相关文章

mvc Model元数据【学习笔记】

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

ASP.Net MVC开发基础学习笔记:一、走向MVC模式

一.ASP.Net的两种开发模式 1.1 ASP.Net WebForm的开发模式 (1)处理流程 在传统的WebForm模式下,我们请求一个例如http://www.aspnetmvc.com/blog/index.aspx的URL,那么我们的WebForm程序会到网站根目录下去寻找blog目录下的index.aspx文件,然后由index.aspx页面的CodeBehind文件(.CS文件)进行逻辑处理,其中或许也包括到数据库去取出数据(其中的经过怎样的BLL到DAL这里就不谈了),然后再由

【转】Backbone.js学习笔记(二)细说MVC

文章转自: http://segmentfault.com/a/1190000002666658 对于初学backbone.js的同学可以先参考我这篇文章:Backbone.js学习笔记(一) Backbone源码结构 1: (function() { 2: Backbone.Events // 自定义事件 3: Backbone.Model // 模型构造函数和原型扩展 4: Backbone.Collection // 集合构造函数和原型扩展 5: Backbone.Router // 路由

ASP.Net MVC开发基础学习笔记(1):走向MVC模式

链接地址:http://blog.jobbole.com/84992/ 一.ASP.Net的两种开发模式 1.1 ASP.Net WebForm的开发模式 (1)处理流程 在传统的WebForm模式下,我们请求一个例如http://www.aspnetmvc.com/blog/index.aspx的URL,那么我们的WebForm程序会到网站根目录下去寻找blog目录下的index.aspx文件,然后由index.aspx页面的CodeBehind文件(.CS文件)进行逻辑处理,其中或许也包括到

ASP.Net MVC开发基础学习笔记(3):Razor视图引擎、控制器与路由机制学习

首页 头条 文章 频道                         设计频道 Web前端 Python开发 Java技术 Android应用 iOS应用 资源 小组 相亲 频道 首页 头条 文章 小组 相亲 资源 设计 前端 Python Java 安卓 iOS 登录 注册 首页 最新文章 经典回顾 开发 Web前端 Python Android iOS Java C/C++ PHP .NET Ruby Go 设计 UI设计 网页设计 交互设计 用户体验 设计教程 设计职场 极客 IT技术

Django学习笔记(三)—— 模型 model

疯狂的暑假学习之 Django学习笔记(三)-- 模型 model 参考:<The Django Book> 第5章 1.setting.py 配置 DATABASES = { 'default': { 'ENGINE': 'django.db.backends.', # 用什么数据库管理系统 'NAME': '', # 数据库名称,如果用sqlite,要写完整路径 'USER': '', # 如果用sqlite,这个不用写 'PASSWORD': '', # 如果用sqlite,这个不用写

ASP.Net MVC开发基础学习笔记:三、Razor视图引擎、控制器与路由机制学习

一.天降神器“剃须刀” — Razor视图引擎 1.1 千呼万唤始出来的MVC3.0 在MVC3.0版本的时候,微软终于引入了第二种模板引擎:Razor.在这之前,我们一直在使用WebForm时代沿留下来的ASPX引擎或者第三方的NVelocity模板引擎. Razor在减少代码冗余.增强代码可读性和Visual Studio智能感知方面,都有着突出的优势.Razor一经推出就深受广大ASP.Net开发者的喜爱. 1.2 Razor的语法 (1)Razor文件类型:Razor支持两种文件类型,分

【笔记】ASP.NET MVC Model元数据

问题1:什么叫Model元数据? Model元数据,是针对数据类型的一种描述信息.由于复杂类型(或者说类型嵌套的存在,比如CustomerModel中有一个属性为复杂类型Address)的存在,因此Model 元数据为树形结构: 1 //namespace:System.Web.Mvc 2 public class ModelMetadata 3 { 4 //其它成员 5 6 //当前模型类型 7 //倘若用数据库中树形结构解释,这个属性相当于Id 8 public Type ModelType

.NET MVC学习笔记(一)

看了些关于MVC的资料,做一些MVC的笔记. 分解关注点 在MVC世界里有个很重要的观念--"分解关注点"(Separation of Concerns),指的是:当你进行软件开发时,可一直关注当前的对象,而不会受到同样的系统中其它对象的干扰,进而专注于完毕开发工作.如此一来,不但easy提升软件质量,也能够加快对代码的理解速度. 分解关注点观念的特征与优势 简化复杂度 大幅提升可维护性 更易于測试 对开发ASP.net MVC项目的建议 不要反复你自己: 好的软件不应该有太多反复的程