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

ASP.NET MVC Controller的激活

uestContext) 4: { 5: return new MvcHandler(requestContext); 6: } 7: }二、MvcHandler  在前面的内容中我们已经提到整个ASP.NET MVC框架是通过自定义的HttpModule和HttpHandler对象ASP.NET进行扩展实现的。这个自定义HttpModule我们已经介绍 过了,就是UrlRoutingModule,而这个自定义的HttpHandler则是我们要重点介绍的MvcHandler。  UrlRoutingModule在通过路由表解析HTTP请求得到一
http://www.w3dev.cn/article/20120602/asp.net-mvc-Controller-active.aspx

ASP.NET MVC Action的执行

e modelType); 4: }  通过前面给出的关于ControllerActionInvoker的定义我们可以看到在构造函数中默认创建的ModelBinder对象是一个 DefaultModelBinder对象。由于仅仅是对ASP.NET MVC的模拟,定义在自定义的DefaultModelBinder中的Model绑定逻辑比ASP.NET MVC中同名类型中实现的要简单得多。  如下面的代码片断所示,绑定到参数上的数据具有三个来源:HTTP-POST Form、RouteData和Values和DataTokens,它们都是字典结构的数据集合。如果参数类型为字符串或者简单的值类
http://www.w3dev.cn/article/20120602/asp.net-mvc-Action-execute.aspx

asp.net mvc详解目录

ASP.NET + MVCIIS与ASP.NET管道MVC、MVP以及Model2[上篇]MVC、MVP以及Model2[下篇]建立在伪MVC框架上的Web应用asp.net mvc URL路由ASP.NET MVC Controller的激活ASP.NET MVC Action的执行二、URL 路由ASP.NET mvc URL与物理文件的分离ASP.NET mvc路由映射ASP.NET mvc路由规则生成URLASP.NET MVC路由扩展:路由映射ASP.NET MVC路由扩展:链接和URL的生成ASP.NET MVC路由实现原理-HttpHandler的动态映射ASP.NET MVC
http://www.w3dev.cn/article/20120601/asp.net-mvc-learning-catalog.aspx

IIS 和 ASP.NET ISAPI

g将对于不同Resource的请求分发给不同的ISAPI Extension,基于ASP.NET Resource的ASP.NET ISAPI如何将Request传递给ASP.NET Runtime 环境。第二部分将着重介绍在一个托管的ASP.NET Runtime 环境对传入的Http request的处理过程。我们先来看看IIS 5.x和IIS 6的处理过程。1. 一、IIS 5.x based Process Model  IIS 5.x一个显著的特征就是Web Server和真正的ASP.NET Application的分离。作为Web Server的IIS运行在一个名为InetIn
http://www.w3dev.cn/article/20120601/IIS-ASP.NET-ISAPI.aspx

ASP.NET Http Runtime Pipeline[上篇]

Level的角度介绍ASP.NET的整个Http Request Processing Model。我们访问一个基于ASP.NET的资源,IIS是第一道屏障,在IIS 和 ASP.NET ISAPI我分别就IIS 5.x和IIS 6的差异介绍了IIS对Http Request的处理,今天我们来继续后面的故事。一、从Unmanaged Environment到Managed Environment  上一部分我们说到IIS收到一个基于ASP.NET资源文件的访问,它会把Http Request交给一个ASP.NET ISAPI Extension处理。ASP.NET ISAPI 会加载CLR,
http://www.w3dev.cn/article/20120601/ASP.NET-Http-Runtime-Pipeline-I.aspx

ASP.NET Http Runtime Pipeline[下篇]

cation对象来承载。但不能说一个Application就唯一对应一个固定的HttpApplication对象。原因很简单,ASP.NET天生具有多线程的特性,需要通过相应不同的Client的访问,如果我们只用一个HttpApplication来处理这些并发的请求,会对Responsibility造成严重的影响,通过考虑到Performance的问题,ASP.NET对HttpApplication的使用采用Pool的机制:当Request到达,ASP.NET会现在HttpApplication Pool中查找未被使用的HttpApplication对象,如果没有,则创建之,否则从Pool直
http://www.w3dev.cn/article/20120601/ASP.NET-Http-Runtime-Pipeline-II.aspx

IIS与ASP.NET管道

行在非托管的环境中,而ASP.NET管道则是托管的,从这个意义上讲,ISAPI还是连接非托管环境和托 管环境的纽带。图5反映了IIS 6.0与ASP.NET之间的桥接关系。图5 基于IIS 6.0与ASP.NET双管道设计   IIS 5.x和IIS 6.0下把两个管道进行隔离至少带来了下面一些局限与不足:相同操作的重复执行:IIS与ASP.NET之间具有一些重复的操作,比如身份验证;动态文件与静态文件处理的不一致:因 为只有基于ASP.NET的动态文件(比如.aspx、.asmx、.svc等等)的HTTP请求才能通过ASP.NET ISAPI进入ASP.NET管道,而对于一些静态文件(比如
http://www.w3dev.cn/article/20120601/ASP.NET-IIS-Pipeline.aspx

.net remoting-Marshaling & Activation[上篇]

Invoke方法并把该IMessage对象传递给Invoke方法。RealProxy调用CreateObjRef方法 得到Remote Object的ObjRef,并通过Client注册的Channel把这个调用传递到Server Application Domain。Activation  .NET Remoting有两种不同的Activation方式Server Activation 和Client Activation。  Server Activation:客户端一般通过Activator的静态方法GetObject方法在Client端创建Transparent Proxy 和Rea
http://www.w3dev.cn/article/20120531/.net-remoting-Marshaling-Activation-I.aspx

.net通过Remoting实现双向通信

仅以服务端激活对象 (Server Activated ObjectSAO),然后再Server端执行相应的操作后把Result传递给Proxy,并最终到达Client。这是一种典型的 Request/Response的调用方式。  之所以一直比较推崇在.NET平台下使用Remoting而非XML Web Service是因为我觉得.NET Remoting是一种比较成熟的分布式技术。它自身提供了XML Web Service很多不具备的特性,其中对双向通信的支持就是一个很好的体现。  相对于典型的Request/Response 的消息交换模式(Message Exchange Patte
http://www.w3dev.cn/article/20120531/.net-Remoting-Duplex-communication.aspx

.net remoting-远程对象的生命周期管理[下篇]

  在.net remoting-远程对象的生命周期管理[上篇], 简要的讲述了CLR的垃圾回收机制和Remoting 基于Lease的对象生命周期的管理。在文章的开始,我将以我的理解详细地讲述Remoting中两个 重要的概念Lease和Sponsorship。然后通过一个Sample,为大家演示如何以不同的方法延长远程对象的生命周期。  先不谈远程对象、本地对象。 不管是远程的对象,还是本地对象,都对于程序Application Domain 所在地址空间的一块连续的托管堆(managed heap)内存区域。在.NET环境下,其对象的生命周期,也就是对应托管堆的回收,都由垃圾回收器(g
http://www.w3dev.cn/article/20120531/.net-remoting-object-Life-cycle-II.aspx