ASP.NET MVC Model元数据及其定制:一个重要的接口IMetadataAware

在介绍用于自定义Model元数据属性的AdditionalMetadataAttribute特性时我们提到了它实现的接口IMedataAware,我们说这是一个非常重要并且有用的接口,通过自定义实现该接口的特性我们可以对最终生成的Model元数据进行自由地定制。如下面的代码片断所示,IMedataAware接口具有唯一的方法成员OnMetadataCreated。当Model元数据被创建出来后,会先获取上述的这一系列标注特性对其进行初始化,然后获取应用在目标元素上所有实现了IMedataAware接口的特性,并将初始化的ModelMetadata对象作为参数调用OnMetadataCreated方法。所以我们通过创建实现该接口的特性不仅仅可以添加一些额外的元数据属性,也可以修改已经通过相应的标注特性初始化的相关属性。

   1: public interface IMetadataAware   2: {   3:     void OnMetadataCreated(ModelMetadata metadata);   4: }

ASP.NET MVC定义了两个实现了IMedataAware接口的特性,一个就是我们已经介绍过的AdditionalMetadataAttribute,另一个则是AllowHtmlAttribute。

一、AllowHtmlAttribute

为了防止最终用于通过在针对某个数据的输入中注入一些HTML来攻击我们的Web应用,ASP.NET MVC在进行Model绑定之前会对对应的请求数据进行验证,确保没有任何HTML标记包含其中。这个针对HTML标记的验证通过ModelMetadata的RequestValidationEnabled来控制,如下面的代码片断所示,这是一个布尔类型的可读写属性。该属性在默认情况下为True,意味着默认开启针对HTML标记的请求验证。

   1: public class ModelMetadata   2: {   3:     //其他成员   4:     public virtual bool RequestValidationEnabled { get; set; }   5: }

AllowHtmlAttribute特性,顾名思义,就是运行作为目标元素的内容包含HTML标记。如下面的代码片断所示,AllowHtmlAttribute是实现了IMetadataAware 接口,在OnMetadataCreated方法中它直接将作为参数的ModelMetadata对象的RequestValidationEnabled属性设置为False,从而使针对目标对象的请求验证被忽略掉。

   1: [AttributeUsage(AttributeTargets.Property, AllowMultiple=false, Inherited=true)]   2: public sealed class AllowHtmlAttribute : Attribute, IMetadataAware   3: {   4:     public void OnMetadataCreated(ModelMetadata metadata)   5:     {   6:         //其他操作   7:         metadata.RequestValidationEnabled = false;   8:     }   9: }

为了验证ASP.NET MVC针对HTML标记的请求验证和AllowHtmlAttribute的作用,我们来做一个简单的实例演示。在通过Visual Studio提供的ASP.NET MVC项目模板创建的空Web应用中,我们定义了如下一个数据类型Foo,其中属性Baz上应用了AllowHtmlAttribute特性。

   1: public class Foo   2: {   3:     public string Bar { get; set; }   4:   5:     [AllowHtml]   6:     public string Baz { get; set; }   7: }

然后我们创建如下一个默认的HomeController,默认的Index操作方法中具有一个类型为Foo的参数,该参数直接作为Model呈现在默认的View中。

   1: public class HomeController : Controller   2: {   3:     public ActionResult Index(Foo foo)   4:     {   5:         return View(foo);   6:     }   7: }

如下所示的Index操作对应的View定义,这是一个以Foo为Model的强类型View。在该View中,我们直接调用HtmlHelper<Model>的EditorForModel方法将Foo对象以编辑模式呈现出来。

   1: @model Foo   2: @{   3:     ViewBag.Title = "Index";   4: }   5: @Html.EditorForModel()

现在我们直接运行该Web应用。根据Model绑定的规则我们知道,如果我们通过浏览器访问HomeController的Index操作,可以通过查询字符串的方式对该操作方法的参数进行初始化。具体来说,我们可以分别指定名称为Bar和Baz的查询字符串对作为参数的Foo对象的两个属性进行初始化。为了验证对包含HTML标记的输入的验证,我们将最终绑定到Model上的查询字符串设置为<script/>。

如下图所示,由于Foo的属性Baz上应用了AllowHtmlAttribute特性是之支持包含HTML标记的数据,所以我们以查询字符串方式指定的包含HTML标记的内容(<script/>)直接显示在相应的文本框中。但是Bar属性在默认情况下是不运行绑定的数据具有任何HTML标记的,所以会将输入的数据视为恶意注入的HTML,直接抛出异常。

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索数据
, 接口
, 标记
, 属性
, public
, 特性
, mvc参数验证
直接初始化
,以便于您获取更多的相关知识。

时间: 2024-10-02 15:46:34

ASP.NET MVC Model元数据及其定制:一个重要的接口IMetadataAware的相关文章

ASP.NET MVC Model元数据及其定制: Model元数据的定制

在<上篇>我们已经提到过了,Model元数据的定制是通过在作为Model的数据类型极其属性成员上应用相应的特性来实现,这些用于声明式元数据定义的特性大都定义在System.ComponentModel.DataAnnotations.dll程序集中,程序集的名称同时也是对应的命名空间名称,所以我们可以它们为数据注解特性(Data Annotation Attribute),接下来我们来介绍一些常用的数据注解特性,以及它们对于元数据具有怎样的影响. 一.UIHintAttribute HtmlH

ASP.NET MVC Model元数据及其定制: 初识Model元数据

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

Asp.Net Mvc: Model Binding to Simple Types, Complex Types,……

Asp.Net Mvc: Model Binding to Simple Types, Complex Types, Collections, Dictionaries, Etc 环境: Windows 2008, VS 2008 SP1, Asp.Net Mvc RC1 1. 简单类型 这里,我们将下面这个Book类称为简单类型: public class Book { public int BookId { get; set; } public string BookName { get;

asp.net MVC 中的过滤器 ,一个路径设置对应一个过滤器类的对象吗

问题描述 asp.net MVC 中的过滤器 ,一个路径设置对应一个过滤器类的对象吗 asp.net MVC 中的过滤器 ,一个路径设置对应一个过滤器类的对象吗 .还是多个路由对应一个过滤器对象.有没有大神给讲解下路由和过滤器的对应关系代码如下:控制器代码: [CustAuthorize(""list"")] [Route(""list"")] public ActionResult List() { return View(

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

Model的绑定体现在从当前请求提取相应的数据绑定到目标Action方法的参数.通过前面的介绍我们知道Action方法的参数通过ParameterDescriptor来描述,ParameterDescriptor的BindingInfo属性表示的ParameterBindingInfo对象具有一个名为ModelBinder的组件用于完成针对当前参数的Model绑定.ModelBinder可以看成是整个Model绑定系统的核心,我们先来认识这个重要的组件.[本文已经同步到<How ASP.NET

ModelBinder:ASP.NET MVC Model绑定的核心

Model的绑定体现在从当前请求提取相应的数据绑定到目标Action方法的参数.通过前面的介绍我们知道Action方法的参数通过ParameterDescriptor来描述,ParameterDescriptor的BindingInfo属性表示的ParameterBindingInfo对象具有一个名为ModelBinder的组件用于完成针对当前参数的Model绑定.ModelBinder可以看成是整个Model绑定系统的核心,我们先来认识这个重要的组件. 一. ModelBinder 用于进行M

Asp.Net Mvc: Model Binding 机制分析

环境: Windows 2008, VS 2008 SP1, Asp.Net Mvc RC1 请求过程片段: 在请求的Action被调用之前,ControllerActionInvoker.InvokeAction()方法被调用,在这个方法里 面,有一个ReflectedActionDescriptor的实例会被构建,这个实例包含Action的描述信息. 接着,ControllerActionInvoker.GetParameterValues()方法被调用,通过传入的之前创建的 Reflect

asp.net mvc 多语言中的一个法文乱码问题

问题描述 我现在正在做一个项目,需要同时支持中文,英文,法文,我写了一个方法CultureHelper.GetCultureValueByName(name)这个方法会读取cookie的culture值,判断当前是中文,英文还是法文,然后根据name返回对应的value,目前中英文都运行正常,但是有些法文单词显示有问题,例如:mémo(s)如果是显示在html里面,那是正常的,例如(采用的是razor引擎)<p>CultureHelper.GetCultureValueByName("

ASP.NET MVC的运行机制

一.ASP.NET + MVC IIS与ASP.NET管道 MVC.MVP以及Model2[上篇] MVC.MVP以及Model2[下篇] ASP.NET MVC是如何运行的[1]: 建立在"伪"MVC框架上的Web应用 ASP.NET MVC是如何运行的[2]: URL路由 ASP.NET MVC是如何运行的[3]: Controller的激活 ASP.NET MVC是如何运行的[4]: Action的执行 二.URL 路由 ASP.NET的路由系统:URL与物理文件的分离 ASP.