ASP.NET MVC Model验证-ModelValidatorProvider

  在《ASP.NET MVC Model验证-ModelValidator》 中我们介绍了ASP.NET MVC用于Model验证的四种ModelValidator,那么这些ModelValidator是如何被创建的呢?ASP.NET MVC的很多组件(比如ModelBinder和Filter)都采用了基于Provider的提供机制,这篇文章为你讲述这些 ModelValidator对应的ModelValidatorProvider。一、ModelValidatorProvider  通过注册ModelValidatorProvider来创建相应的ModelValidator,所有的Mode
http://www.w3dev.cn/article/20120615/ASP.NET-MVC-Model-ModelValidatorProvider.aspx

ASP.NET MVC Model验证-ModelValidatorProviders

  《ASP.NET MVC Model验证-ModelValidator》介绍用真正用于实施Model验证的ModelValidator,以及用于提供ModelValidator的ModelValidatorProvider《ASP.NET MVC Model验证-ModelValidatorProvider》, 那么对于ASP.NET MVC的Model验证体系来说,最终是通过怎样的方式对ModelValidatorProvider进行注册,又是如何利用它们来创建相应的 ModelValidator来实施Model验证的呢?这就是本篇文章论述的重点。一、ModelValidatorPro
http://www.w3dev.cn/article/20120615/ASP.NET-MVC-Model-ModelValidatorProviders.aspx

ASP.NET MVC Model绑定ModelBinder

az: BazModelBinder四、ModelBinderProvider   ASP.NET MVC的Model绑定系统还涉及到另一个重要的组件ModelBinderProvider。顾名思义,ModelBinderProvider专门用于提供相应的ModelBinder对象,它们均实现了IModelBinderProvider面的代码片断所示,IModelBinderProvider接口定义了唯一的GetBinder方法用于根据数据类型获取相应的ModelBinder对象。不过在ASP.NET MVC现有的应用编程接口中并没有定义任何一个实现该接口的ModelBinderProvid
http://www.w3dev.cn/article/20120614/ASP.NET-MVC-Model-ModelBinder.aspx

ASP.NET MVC Model简单复杂类型绑定

Value方法得到 一个ValueProviderResult调用,并最终调用ConvertTo方法转换为参数类型并返回。  为了验证我们自定义的DefaultModelBinder能够真正地用于针对简单参数类型的Model绑定没我们将它应用到一个具体的 ASP.NET MVC应用中。在通过Visual Studio的ASP.NET MVC项目模板创建的空Web应用中,我们创建了如下一个默认的HomeController。HomeController具有一个 ModelBinder属性,其类型正是我们自定义的DefaultModelBinder,该属性通过方法GetValueProvider
http://www.w3dev.cn/article/20120614/ASP.NET-MVC-Model-datatype-bind.aspx

ASP.NET MVC Model字典绑定

  在《ASP.NET MVC Model简单复杂类型绑定》、《ASP.NET MVC Model数组绑定》通过创建的实例程序模拟了ASP.NET MVC默认使用的DefaultModelBinder对简单类型、复杂类型以及数组对象的Model绑定。现在我们按照相同的方式来分析基于集合和字典类型的Model绑定是如何实现的。[源代码从这里下载]一、集合  这里的集合指的是除数组和字典之外的所有实现IEnumerableT接口的类型。和基于数组的Model绑定类似,ValueProvider可以将多个同名的数据项作为集合的元素,基于索引(基零整数和字符串)的数据项命名方式同样适用。我们对自定义
http://www.w3dev.cn/article/20120614/ASP.NET-MVC-Model-Dictionary-Collection-bind.aspx

ASP.NET MVC ControllerDescriptor对象

  ASP.NET MVC应用的请求都是针对某个Controller的某个Action方法,所以对请求的处理最终体现在对目标Action方法的执行。而Action方 法具有相应的参数,所以在方法执行之前必须根据相应的规则从请求中提取相应的数据并将其转换为Action方法参数列表,我们将这个过程称为Model绑 定。在ASP.NET MVC应用编程接口中,Action方法某个参数的元数据通过ParameterDescriptor表示,而两个相关的类型ControllerDescriptor和ActionDescriptor则用于描述Controller和Action方法。一、Controller
http://www.w3dev.cn/article/20120613/ASP.NET-MVC-ControllerDescriptor.aspx

ASP.NET MVC ActionDescriptor对象

ibute : Attribute 3: { 4: public abstract bool IsValidForRequest(ControllerContext controllerContext, MethodInfo methodInfo); 5: }  在ASP.NET MVC应用编程接口中定义了如下四个基于HTTP方法(GET、POST、PUT和DELETE)的 ActionMethodSelectorAttribute,当我们将它们应用到某个Action方法上时,只有在当前请求的HTTP方法与之相匹配的 情况下目标Action方法才会被选择。System.
http://www.w3dev.cn/article/20120613/ASP.NET-MVC-ActionDescriptor.aspx

ASP.NET MVC ControllerDescriptor与ActionDescriptor的创建机制

lerActionInvoker。 1: 默认ActionInvoker类型:System.Web.Mvc.Async.AsyncControllerActionInvoker  为了进一步验证基于DependencyResolver对ActionInvoker的提供机制,我们将在《ASP.NET MVC Controller IoC应用[下篇]》 创建的基于Ninject的自定义NinjectDependencyResolver应用在这里。如下面的代码片断所示,在初始化 NinjectDependencyResolver的时候,我们将IActionInvoker和IAsyncActio
http://www.w3dev.cn/article/20120613/ASP.NET-MVC-ControllerDescriptor-ActionDescriptor-create.aspx

ASP.NET MVC ParameterDescriptor对象

  Model绑定是为作为目标Action的方法准备参数列表的过程,所以针对参数的描述才是Model绑定的核心。在ASP.NET MVC应用编程接口中,服务于Model绑定的参数元数据通过ParameterDescriptor类型来表示,而ActionDescriptor的GetParameters方法返回的就是一个ParameterDescriptor数组。  如下面的代码片断所示,ParameterDescriptor同样实现了ICustomAttributeProvider接口提供应用在相应参数上的特 性。ParameterDescriptor的只读属性ActionDescriptor
http://www.w3dev.cn/article/20120613/ASP.NET-MVC-ParameterDescriptor.aspx

ASP.NET MVC ValueProvider值提供系统:DictionaryValueProvider

vider, IValueProvider 2: { 3: //其他成员 4: private readonly Dictionarystring, ValueProviderResult _values; 5: }   在通过Visual Studio的ASP.NET MVC 项目模板创建的空Web应用中定义如下一个默认的HomeController。默认的Action方法Index仅仅是将默认的View呈现出来而已, 并没有特别之处。在另一个Action方法DisplayRouteData中,我们名称分别为Foo、Bar和Baz的三个路由数据篡改成abc、
http://www.w3dev.cn/article/20120613/ASP.NET-MVC-ValueProvider-DictionaryValueProvider.aspx

ASP.NET MVC Model预定义模板

} 5: }  我们创建一个具体的Model对象,并将Foo属性设置为一个表示Url的字符串http://www.asp.net,最后通过如下的方式将该属性以显示模式呈现出来。 1: @model Model 2: @Html.DisplayFor(m=m.Foo)  如下面的代码片断所示,该属性最终呈现为一个href属性和文本内容均属性值得连接(a/a)。 1: a href=http://www.asp.nethttp://www.asp.net/aMultilineText  一般的字符串在编辑模式下会呈现为一个单行的文本框(类型为text的input元素),而Mult
http://www.w3dev.cn/article/20120612/ASP.NET-MVC-Model-predefined-template.aspx

ASP.NET MVC Model模板的获取与执行策略

对应着某个自定义的分部View,那么只需要执行该View即可;对于默认模板,则直接可 以得到相应的HTML。本篇文章着重讨论模板的获取和执行机制,不过在这之前,顺便来讨论一下DataTypeAttribute和模板的关系。一、 DataTypeAttribute和模板有何关系?  通过《ASP.NET MVC Model元数据》针对Model元数据定义的介绍,我们知道通过DataTypeAttribute特性对目标元素设置的数据类型最终会反映在表示Model元数据的 ModelMetadata对象的DataTypeName属性上。此外,对于某些设置的数据类型,比如Date、Time、Dura
http://www.w3dev.cn/article/20120612/ASP.NET-MVC-Model-get-template-execute-Strategy.aspx

ASP.NET MVC Model ListControl

ListItem[]{ 29: new ListItem{ Text = C#, Value=CSharp} , 30: new ListItem{ Text = ASP.NET, Value=AspNet}, 31: new ListItem{ Text = ADO.NET, Value=AdoNet}}; 32: listItems.Add(Skill, items); 33: } 34: public IEnumerableListItem GetListItems
http://www.w3dev.cn/article/20120612/ASP.NET-MVC-Model-ListControl.aspx

ASP.NET MVC Model元数据提供机制的实现

ataProvider来实现,通过自定义ModelMetadataProvider我们完全可以 提供一种全新的Model元数据定义方式。不过我们经常使用的方式还是通过继承 DataAnnotationsModelMetadataProvider在现有的元数据提供机制上做一些扩展。  在《ASP.NET MVC Model元数据IMetadataAware接口》 中我们创建了一个用于控制目标元素显示名称的DisplayTextAttribute特性。该特性支持基于资源文件的本地化,并且可以省去对资源条目名 称和资源类型的显式指定。该DisplayTextAttribute特性是通过实现IMet
http://www.w3dev.cn/article/20120612/ASP.NET-MVC-Model-ModelMetadataProvider.aspx

ASP.NET MVC Model元数据

之后,ASP.NET MVC会根据当前请求上下文得到目标Action的名称,然后解析出对应的方法并执行之。在整个Action方法的执行过程中,Model元数据的解析是 一个非常重要的环节。ASP.NET MVC中的Model实际上View Model,表示最终绑定到View上的数据,而Model元数据描述了Model的数据结构,以及Model的每个数据成员的一些特性。正是有了 Model元数据的存在,才使模板化HTML的呈现机制成为可能。此外,Model元数据支撑了ASP.NET MVC的Model验证体系,因为针对Model的验证规则正是定义在Model元数据中。ASP.NET MVC的Mo
http://www.w3dev.cn/article/20120610/ASP.NET-MVC-Model-Metadata.aspx

ASP.NET MVC Model元数据定制

过相应的HTML呈现在UI界面 上。具体来说,针对应用了HiddenInputAttribute的目标元素对应的ModelMetadata对象,其被设置为HiddenInput, 并将其DisplayValue属性为HideSurroundingHtml属性赋值。HiddenInput为ASP.NET MVC自身定义的一个默认模板名称,也就是说当目标元素应用了HiddenInputAttribute特性,这个默认模板别用来实现对其的UI呈现。 1: public class ModelMetadata 2: { 3: //其他成员 4: public virt
http://www.w3dev.cn/article/20120610/ASP.NET-MVC-Model-Metadata-Customize.aspx

ASP.NET MVC Model元数据IMetadataAware接口

{ 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: p
http://www.w3dev.cn/article/20120610/ASP.NET-MVC-Model-Metadata-IMetadataAware-interface.aspx

ASP.NET MVC Controller总体设计

rSessionBehavior方法返回一个SessionStateBehavior枚举。熟悉ASP.NET的读者应该对SessionStateBehavior不会感到陌生,它用于表示请求处理过程中会话状态支持的模式,它的四个枚举值分别具有如下的含义:Default:使用默认 ASP.NET 逻辑来确定请求的会话状态行为。Required:为请求启用完全的读写会话状态行为。ReadOnly:为请求启用只读会话状态。Disabled:禁用会话状态。  对于Default选项来说,ASP.NET通过映射的HttpHandler类型是否实现了相关接口来决定具体的会话状态控制行为。在 System.
http://www.w3dev.cn/article/20120609/ASP.NET-MVC-Controller-design.aspx

ASP.NET MVC Controller默认实现

gistration类型列表的MVC- AreaRegistrationTypeCache.xml文件也保存在这个目录下面。%Windir%\Microsoft.NET\Framework\v{version}\Temporary ASP.NET Files\{appname}\...\...\UserCache\%Windir%\Microsoft.NET\Framework\v{version}\Temporary ASP.NET Files\root\...\...\UserCache\  对针对Web应用被启动后的第一个请求时,Controller激活系统会读取这个用于缓存所有Cont
http://www.w3dev.cn/article/20120609/ASP.NET-MVC-Controller-DefaultControllerFactory.aspx

ASP.NET MVC Controller IoC应用[上篇]

ll ? No二、Controller与Model的分离  在《MVC、MVP以及Model2[下篇]》中我们谈到ASP.NET MVC是基于MVC的变体Model2设计的。ASP.NET MVC所谓的Model仅仅表示绑定到View上的数据,我们一般称之为View Model。而真正的Model一般意义上指维护应用状态和提供业务功能操作的领域模型,或者是针对业务层的入口或者业务服务的代理。真正的MVC在ASP.NET MVC中的体现如下图所示。  对于一个ASP.NET MVC应用来说,用户交互请求直接发送给Controller。如果涉及到针对某个个业务功能的调用,Controller会直
http://www.w3dev.cn/article/20120609/ASP.NET-MVC-Controller-IoC-I.aspx

ASP.NET MVC Controller IoC应用[下篇]

于 Controller对象的激活,那么我们可以自定义ControllerActivator的方式将IoC引入Controller激活系统。我们接下 来自定义的ControllerActivtor基于另一个IoC框架Ninject,较之Unity,Ninject是一个更加轻量级也更适合 ASP.NET MVC的IoC框架。我们将自定义的ControllerActivator起名为NinjectControllerActivator,全部定义如 下。[源代码从这里下载] 1: public class NinjectControllerActivator: IControllerActiv
http://www.w3dev.cn/article/20120609/ASP.NET-MVC-Controller-IoC-II.aspx

ASP.NET mvc URL与物理文件的分离

请求地址与目标Controller和Action的动态映射的URL路由系统并不是专属于ASP.NET MVC,而是直接建立在ASP.NET 中。ASP.NET通过URL路由系统实现了请求地址与物理文件的分离。[源代码地址从这里下载]一、URL与物理文件的分离  对 于一个 ASP.NET Web Form应用来说,任何一个请求都对应着某个具体的物理文件。部署在Web服务器上的物理文件可以是静态的(比如图片和静态HTML文件等),也可以是动 态的(比如.asxp文件)。对于静态文件的请求,ASP.NET直接返回文件的整个内容;而针对动态文件的请求则会触发相关代码的执行,并最终返回执行 后的结果。
http://www.w3dev.cn/article/20120603/ASP.NET-mvc-router-URL-Physical-file-Separate.aspx

ASP.NET mvc路由映射

址完全满足我们注册路由对象的URL模板模式,但是ASP.NET并没有对请求地址实施路由。原因很简单,如果中间发生了路由,基于页面的 RouteData的各项属性都不可能为空。[实例源代码下载]  那么是否意味着如果请求地址对应着一个现存的物理文件,ASP.NET就会自动忽略路由呢?实则不然,或者说不对现有文件实施路由仅仅默认采用的行 为。是否对现有文件实施路由取决于代表全局路由表的RouteCollection对象的RouteExistingFiles属性,该属性默认情况下为 False,我们可以将此属性设置为True使ASP.NET路由系统忽略现有物理文件的存在,总是按照注册的路由表进行路
http://www.w3dev.cn/article/20120603/ASP.NET-mvc-router-mapping.aspx

ASP.NET mvc路由规则生成URL

  ASP.NET 的路由系统主要具有两个方面的应用,其一就是通过注册URL模板与物理文件路径的匹配实现请求地址和物理地址的分离;另一个则是通过注册的路由规测生成一 个相应的URL。后者通过调用RouteCollection类型的GetVirtualPath方法来实现。[源代码从这里下载]  如 下面的代码片断所示,GetVirtualPath定义了两个GetVirtualPath方法重载,它们共同的参数requestContext和 values分别表示请求上下文(RouteData和HTTP上下文的封装)和用于替换定义在URL模板中的变量站位符的值。另一个 GetVirtualPath方
http://www.w3dev.cn/article/20120603/ASP.NET-mvc-router-rule-create-url.aspx

ASP.NET MVC路由扩展:路由映射

  上周我写了三篇文章(ASP.NET mvc URL与物理文件的分离、ASP.NET mvc路由映射、ASP.NET mvc路由规则生成URL) 详细地介绍了ASP.NET的路由系统。ASP.NET的路由系统旨在通过注册URL模板与物理文件之间的映射进而实现请求地址与文件路径之间的分离,但 是对于ASP.NET MVC应用来说,请求的目标不再是一个具体的物理文件,而是定义在某个Controller类型中的Action方法。出于自身路由特点的需 要,ASP.NET对ASP.NET的路由系统进行了相应的扩展。一、基本路由映射  通过前面的介绍我们知道基于某个物理文件的路由映射通过调用代表全局路由
http://www.w3dev.cn/article/20120603/ASP.NET-mvc-router-extend-router-mapping.aspx

ASP.NET MVC路由扩展:链接和URL的生成

string, object htmlAttributes); 14: }三、实例演示:创建一个RouteHelper模拟UrlHelper的URL生成逻辑  为了让读者对UrlHelper如果利用ASP.NET路由系统进行URL生成的逻辑具有一个深刻认识,我们接下来创建一个名为 RouteHelper的等效帮助类。我们将RouteHelper定义在创建的一个ASP.NET Web应用中,如下面的代码片断所示,RouteHelper具有RequestContext和RouteCollection两个属性,前者在构造函 数中指定,后者则只是使用通过RouteTable的Routes静态
http://www.w3dev.cn/article/20120603/ASP.NET-mvc-router-extend-link-url-create.aspx

ASP.NET MVC路由实现原理-HttpHandler的动态映射

ler GetHttpHandler(RequestContext requestContext) 5: { 6: return new MvcHandler(requestContext) 7: } 8: }三、 ASP.NET路由系统扩展  到此为止我们已经对ASP.NET的路由系统的实现进行了详细介绍,总的来说,整个路由系统是通过对HttpHandler的动态注册的方式来实现 的。具体来说,UrlRoutingModule通过对代表Web应用的HttpApplication的 PostResolveRequestCache事件的注册实现了
http://www.w3dev.cn/article/20120603/ASP.NET-mvc-router-httphandler-Dynamic-mapping.aspx

ASP.NET MVC通过URL路由多语言的支持

的Web应用,一个很常见的使用方式就是通过请求地址来控制界面 呈现所基于的语言文化,比如我们在表示请求地址的URL中将上语言文化代码(比如en或者en-US)来指导服务器应该采用怎样的语言来显示界面的内容。 对于一个ASP.NET MVC应用来说,很容易通过URL路由来实现这样一个功能。  在具体介绍实现之前,我们通过一个简单的例子谈谈最终实现的效果。在通过ASP.NET MVC项目模板创建的空Web应用中,我们创建了如下一个HomeController,默认的Action方法Index用于呈现一个登录View。作 为Model的LoginInfo类包含UserName和Password两个
http://www.w3dev.cn/article/20120603/ASP.NET-mvc-url-router-Multi-language-support.aspx

asp.net mvc URL路由

  在一个ASP.NET MVC应用来说,针对HTTP请求的处理和相应定义Controller类型的某个Action方法中,每个HTTP请求的目标对象不再像ASP .NET Web Form应用一样是一个物理文件,而是某个Controller的某个Action。目标Controller和Action的名称包含在HTTP请求 中,而ASP.NET MVC的首要任务就是通过当前HTTP请求的解析得到正确的Controller和Action的名称。这个过程是通过ASP.NET MVC的URL路由机制来实现的。一、RouteData  ASP.NET 定义了一个全局的路由表,路由表中的每个路由对象对
http://www.w3dev.cn/article/20120602/asp.net-mvc-URL-router.aspx