ASP.NET MVC的Model为View Model,表示最终呈现在View上的数据,而Model元数据的一个重要的作用在于控制对象在View上的呈现方式。说得更加具体点,就是基于某种数据类型的Model元数据用于指导最终生成怎样的HTML来呈现对应的Model对象。Model元数据的存在使模板化的HTML呈现机制成为可能。除此之外,Model元数据还服务于Model绑定和Model验证。

表示Model元数据的ModelMetadata对象最终是通过一个名为ModelMetadataProvider的组件提供的。

Model元数据的复杂类型和简单类型之间的区别仅仅在于它们是否支持针对字符串类型的转换(表单、JSON字符串以及查询字符串)。对于简单类型参数的Model绑定,只需要将参数名称或者通过应用在参数上的BindAttribute特性指定的前缀作为Key调用ValueProvider的GetValue方法,并将的到的ValueProviderResult对象转换成参数类型即可。

用于描述数据类型的Model元数据主要在View中为绑定的数据实现模板化的HTML呈现。它的一个主要的作用就是为定义在HtmlHelper<TModel>中的模板方法(这些模板方法包括Display/DisplayFor、Editor/EditorFor、DisplayForModel / EditForModel、Lable / LableFor、DisplayText / DisplayTextFor)提供辅助生成HTML的元数据信息。

Action参数值的绑定过程:核心InvokeAction方法用于执行指定的Action(假定Action方法返回一个ActionResult对象)。在该方法中我们针对自身类型创建出相应的ControllerDescriptor对象,并根据Action名称得到对应的ActionDescriptor对象。然后根据ActionDescriptor获取用于描述其参数的ParameterDescriptor列表,而Model绑定就是根据每个ParameterDescriptor进行的。

具体来说,根据针对ParameterDescriptor对象创建表示Model绑定上下文的ModelBindingContext对象,并对其ModelName、ModelState、ValueProvider、ModelMetadata和FallbackToEmptyPrefix属性进行了初始化。最后将该ModelBindingContext对象和当前ControllerContext作为参数调用ModelBinder的BindModel方法得到相应的参数值。所有的参数最终被添加到一个字典对象中(Key表示参数名称),它会作为参数钓鱼那个ActionDescriptor的Execute方法实现对指定Action的执行。

MVC中Model元数据及绑定机制的更多相关文章

  1. MVC之Model元数据

    Contronoller激活之后,ASP.NET MVC会根据当前请求上下文得到目标Action的名称,然后解析出对应的方法并执行之. 在整个Action方法的执行过程中,Model元数据的解析是一个 ...

  2. ASP.NET的MVC中Model对象字段的数…

    ASP.NET的MVC中Model对象字段的常用数据说明属性: Required——该字段不允许为空. MaxLength——设置数组或字符串最大长度. StringLength——设置字符串最小和最 ...

  3. MVC中Model和model的区别和用户

    MVC中Model和model的区别,它们应该怎么用呢? 使用@model关键字可以定义一个Action里所对应的一个模型(经常可以叫他实体类). MVC的第一个字母M是Model,承载着View层和 ...

  4. MVC中Model BLL层Model模型互转

    MVC中Model BLL层Model模型互转 一. 模型通常可以做2种:充血模型和失血模型,一般做法是模型就是模型,不具备方法来操作,只具有属性,这种叫做失血模型(可能不准确):具备对模型一定的简单 ...

  5. ThreadLocal,Java中特殊的线程绑定机制

    在DRP项目中,我们使用了ThreadLocal来创建Connection连接,避免了一直以参数的形式将Connection向下传递(传递connection的目的是由于jdbc事务要求确保使用同一个 ...

  6. Java-ThreadLocal,Java中特殊的线程绑定机制

    在DRP项目中,我们使用了ThreadLocal来创建Connection连接,避免了一直以参数的形式将Connection向下传递(传递connection的目的是由于jdbc事务要求确保使用同一个 ...

  7. 解决MVC中Model上的特性在EF框架刷新时清空的问题

    MVC中关于前端数据的效验一般都是通过在Model中相关的类上打上特性来实现. 但是在我们数据库发生改变,EF框架需要刷新时会把我们在Model上的特性全部清除,这样的话,我们前端的验证就会失效. 因 ...

  8. MVC中Model用法

    Model:对于MVC来说,Model可不简单只是实体,它应该叫视图模型,这是我自己的理解,即视图中的数据由Model来提供,当视图的数据需要改变时,我们不用打开aspx或ascx文件,只需要修改相应 ...

  9. 深入学习AngularJS中数据的双向绑定机制

    来自:http://www.jb51.net/article/80454.htm Angular JS (Angular.JS) 是一组用来开发Web页面的框架.模板以及数据绑定和丰富UI组件.它支持 ...

随机推荐

  1. Ubuntu安装Hadoop

    系统:Ubuntu16.04 JDK:jdk-8u201 Hadoop:3.1.2 一.安装JDK https://www.cnblogs.com/tanrong/p/10641803.html 二. ...

  2. 2018-2019-2 20165235 《网络对抗技术》 Exp6 信息搜集与漏洞扫描

    2018-2019-2 20165235 <网络对抗技术> Exp6 信息搜集与漏洞扫描 1.实践目标 掌握信息搜集的最基础技能与常用工具的使用方法. 2.实践内容 (1)各种搜索技巧的应 ...

  3. sql查询一个字段多列值合并为一列

    SELECT GROUP_CONCAT(A.字段) AS 字段别名 FROM 表名 A WHERE A.字段=,,) SELECT GROUP_CONCAT(A.字段) AS 字段FROM 表名 A

  4. Numpy 基础运算1

    # -*- encoding:utf-8 -*- # Copyright (c) 2015 Shiye Inc. # All rights reserved. # # Author: ldq < ...

  5. Java Concurrency in Practice——读书笔记

    Thread Safety线程安全 线程安全编码的核心,就是管理对状态(state)的访问,尤其是对(共享shared.可变mutable)状态的访问. shared:指可以被多个线程访问的变量 mu ...

  6. mint17上建立lamp环境

    使用apt-get方式是最简单的也是最快捷稳定的在桌面linux环境下.   分别执行如下命令:   (1)安装MYSQL   sudo apt-get install mysql-server   ...

  7. su;su -;sudo;sudo -i;sudo su;sudo su - 之间的区别

    今天我们来聊聊su;su -;sudo;sudo -i;sudo su;sudo su -他们之间的区别. su :su 在不加任何参数,默认为切换到root用户,但没有转到root用户家目录下,也就 ...

  8. android中进度条的实现

    布局: <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:androi ...

  9. 为不具有change事件的html标签设置监听事件

    change事件会在文本内容或选项被更改时触发. 该事件仅适用于<input type="text">和<textarea>以及<select> ...

  10. d3.js做的柱状图

    window.onload = function(){ var dataArray = [23, 13, 21, 14, 37, 15, 18, 34, 30]; var height = 400,w ...