摘要:

旨在为目标Action方法的执行绑定输入参数的Model绑定过程伴随着对Model的验证。借助相应的验证特性,我们可以直接以声明的方式在Model类型上定义验证规则,这些规则将会作为Model元数据的一部分。ASP.NET MVC的整个Model验证系统以组件ModelValidator为核心,或者说Model对象的验证最终通过某个ModelValidator对象来完成。
阅读全文
posted @ 2012-06-01 08:06
Artech
阅读(10186)
推荐(21)
摘要:

在本系列的前面两篇文章(《简单类型+复杂类型》、《数组》)我们通过创建的实例程序模拟了ASP.NET MVC默认使用的DefaultModelBinder对简单类型、复杂类型以及数组对象的Model绑定。现在我们按照相同的方式来分析基于集合和字典类型的Model绑定是如何实现的。[
阅读全文
posted @ 2012-05-31 08:35
Artech
阅读(10283)
推荐(17)
摘要:

基于数组和集合类型的Model绑定机制比较类似,对于绑定参数类型或者参数类型的某个属性为数组或者集合,如果ValueProvider根据对应的Key能够匹配多条数据,那么这些数据最终将会转换为绑定的数组/集合的元素。此外,针对数组/集合的Model绑定还支持基于索引的方式。
阅读全文
posted @ 2012-05-30 08:11
Artech
阅读(13751)
推荐(13)
摘要:

总的来说,针对目标Action方法参数的Model绑定完全由组件ModelBinder来实现,在默认情况下使用的ModelBinder类型为DefaultModelBinder,接下来我们将按照逐层深入的方式通过一个模拟程序来介绍实现在DefaultModelBinder的默认Model绑定机制。
阅读全文
posted @ 2012-05-23 08:20
Artech
阅读(15761)
推荐(18)
摘要:

Model的绑定体现在从当前请求提取相应的数据绑定到目标Action方法的参数。通过前面的介绍我们知道Action方法的参数通过ParameterDescriptor来描述,ParameterDescriptor的BindingInfo属性表示的ParameterBindingInfo对象具有一个名为ModelBinder的组件用于完成针对当前参数的Model绑定。ModelBinder可以看成是整个Model绑定系统的核心,我们来认识这个重要的组件以及相关的提供机制。
阅读全文
posted @ 2012-05-21 08:12
Artech
阅读(27443)
推荐(27)
摘要:

在ASP.NET Model绑定系统中,用于提供数据值的ValueProvider对象通过ValueProviderFactory来创建。在ASP.NET MVC应用编程接口中,ValueProviderFactory继承自ValueProviderFactory类。本篇文章只要介绍基于ValueProviderFactory的ValueProvider的提供机制,以及如何通过自定义ValueProviderFactory实现我们需要的数据值的绑定方式
阅读全文
posted @ 2012-05-19 07:20
Artech
阅读(7771)
推荐(9)
摘要:

NameValueCollectionValueProvider采用一个NameValueCollection作为数据源,DictionnaryValueProvider的数据源类型自然就是一个Dictionnary。NameValueCollection和Dictionnary都是一个键值对的集合,它们之间的不同之处在NameValueCollection运行元素具有相同的Key,Dictionnary却要求元素的Key具有唯一性
阅读全文
posted @ 2012-05-18 08:22
Artech
阅读(5709)
推荐(17)
摘要:

在进行Model绑定过程中,需要根据基于Action方法参数的绑定上下文从请求数据中提取相应的数据以提供相应的数据。具体来说,Model绑定的数据具有多个来源,可能来源于Post的表单或者JSON字符串,或者来源于当前的路由数据,也可能来源于请求地址的插叙字符串。ASP.NET MVC将这种基于不同数据来源的数据获取/提供机制实现在一个叫做ValueProvider的组件中
阅读全文
posted @ 2012-05-17 09:04
Artech
阅读(8029)
推荐(13)
摘要:

ASP.NET MVC通过Model验证帮助我们很容易的实现对数据的验证。对于自定义验证,我们也只需要定义相应的Validation就可以了,不过服务端验证比较简单,而客户端验证就要稍微复杂一些,本文提供一个简单的实例说明在ASP.NET MVC中实现自定义验证的基本步骤。
阅读全文
posted @ 2012-05-15 18:37
Artech
阅读(20013)
推荐(22)
摘要:

看了dudu的《HttpClient + ASP.NET Web API, WCF之外的另一个选择》一文,想起多很久之前体验ASP.NET Web API而创建的一个Demo,放着也是放着,姑且拿出来与大家分享。这是一个只涉及到简单CRUD操作的Web应用,业务逻辑以Web API的形式定义并以服务的形式发布出来,前台通过jQuery处理用户交互并调用后台服务。[源代码从这里下载]
阅读全文
posted @ 2012-05-14 07:50
Artech
阅读(19490)
推荐(32)
摘要:

Model绑定是为作为目标Action的方法准备参数列表的过程,所以针对参数的描述才是Model绑定的核心。在ASP.NET MVC应用编程接口中,服务于Model绑定的参数元数据通过ParameterDescriptor类型来表示,而ActionDescriptor的GetParameters方法返回的就是一个ParameterDescriptor数组。
阅读全文
posted @ 2012-05-13 18:37
Artech
阅读(6910)
推荐(8)
摘要:

《WCF全面解析》在正式销售不到一周的时间内已经进入互动网7日销量已经进入计算机类书籍排名第2位,关注排名首位,谢谢各位的支持,现将三个试图章节共享出来与大家分享。
阅读全文
posted @ 2012-05-12 10:41
Artech
阅读(10535)
推荐(10)
摘要:

不论是用于描述Controller的ControllerDescriptor,还是用于描述Action方法的ActionDescriptor,都具有同步和异步两个版本,那么这些不同类型的ControllerDescriptor的ActionDescriptor是在什么情况下创建的呢?
阅读全文
posted @ 2012-05-11 08:52
Artech
阅读(6563)
推荐(13)
摘要:

在Model绑定过程中会通过激活的Controller类型创建用于描述它的ControllerDescriptor对象。Controller是一组Action方法的集合,而每一个Action通过ActionDescriptor对象来表示,在这篇文章中我们就来着重谈谈不同类型的ActionDescriptor。
阅读全文
posted @ 2012-05-10 18:59
Artech
阅读(13727)
推荐(19)
摘要:

ASP.NET MVC应用的请求都是针对某个Controller的某个Action方法,所以对请求的处理最终体现在对目标Action方法的执行。而Action方法具有相应的参数,所以在方法执行之前必须根据相应的规则从请求中提取相应的数据并将其转换为Action方法参数列表,我们将这个过程称为Model绑定。在ASP.NET MVC应用编程接口中,Action方法某个参数的元数据通过ParameterDescriptor表示,而两个相关的类型ControllerDescriptor和ActionDescriptor则用于描述Controller和Action方法。
阅读全文
posted @ 2012-05-10 07:28
Artech
阅读(8939)
推荐(15)
摘要:

在前面的介绍中我们已经提到过表示Model元数据的ModelMetadata对象最终是通过一个名为ModelMetadataProvider的组件提供的,接下来我们着重讨论基于ModelMetadataProvider的Model元数据提供机制及其扩展
阅读全文
posted @ 2012-05-09 07:52
Artech
阅读(8224)
推荐(18)
摘要:

“全书之写印,实系初稿。有时公私琐务猬集,每写一句,三搁其笔;有时兴会淋漓,走笔疾书,絮絮不休;有时意趣萧索,执笔木坐,草草而止。每写一段,自助覆阅,辄摇其首,觉有大不妥者,即贴补重书,故剪刀浆糊乃不离左右。个中甘苦,只自知之。” 在某个阳光明媚的早晨,我在去上班的公交车上翻看岳南先生的《南渡北归》的时候,看到上面这段董作宾描述自己写作《殷历谱》之甘苦的文字,回想起我写作这本书的经历,不禁感慨万千。我无意将《WCF全面解析》自比煌煌巨著《殷历谱》,只是觉得人同此心,这段文字正好描述我写作此书的状态。
阅读全文
posted @ 2012-05-08 08:05
Artech
阅读(46708)
推荐(98)
摘要:

对于一个需要支持多语言的Web应用,一个很常见的使用方式就是通过请求地址来控制界面呈现所基于的语言文化,比如我们在表示请求地址的URL中将上语言文化代码(比如en或者en-US)来指导服务器应该采用怎样的语言来显示界面的内容。对于一个ASP.NET MVC应用来说,我们很容易通过URL路由来实现这样一个功能。
阅读全文
posted @ 2012-05-04 11:00
Artech
阅读(10843)
推荐(12)
摘要:

我们不仅可以创建相应的模板来根据Model元数据控制种类型的数据在UI界面上的呈现方法,还可以通过一些扩展来控制Model元数据本身。在某些情况下通过这两者的结合往往可以解决很多特殊数据的呈现问题,我们接下来演示的实例就是典型的例子。
阅读全文
posted @ 2012-05-04 07:44
Artech
阅读(9211)
推荐(27)
摘要:

当我们调用HtmlHelper或者HtmlHelper的模板方法对整个Model或者Model的某个数据成员以某种模式(显示模式或者编辑模式)进行呈现的时候,通过预先创建的代表Model元数据的ModelMetadata对象都可以找到相应的模板。如果模板对应着某个自定义的分部View,那么只需要执行该View即可;对于默认模板,则直接可以得到相应的HTML。本篇文章着重讨论模板的获取和执行机制。
阅读全文
posted @ 2012-05-03 14:49
Artech
阅读(5882)
推荐(7)
摘要:

相信大家对TransactionScope都比较熟悉。通过TransactionScope,我们可以很容易地将一组操作纳入同一个事务中。我个人觉得这体现了一种可以重用的模式,即本篇文章介绍的Context+ContextScope模式,这种模式旨在一定范围内创建一个可以共享的上下文信息。
阅读全文
posted @ 2012-05-02 11:24
Artech
阅读(4752)
推荐(12)
摘要:

通过ModelMetadata表示的Model元数据的一个主要的作用在于为定义在HtmlHelper和HtmlHelper中的模板方法(这些模板方法包括Display/DisplayFor、Editor/EditorFor、DisplayForModel/EditForModel、Lable/LabelFor和DisplayText/DisplayTextFor等)提供用于最终生成HTML的元数据信息。在调用这些方法的时候,如果我们指定了一个具体的通过分部View定义的模板,或者对应的ModelMetadata的TemplateHint属性具有一个模板名称,会自动采用该模板来生成最终的HTML。如果没有指定模板名称,则会根据数据类型在预定义的目录下去寻找做模板的分部View。如果找不到,则会利用默认的模板进行HTML的呈现
阅读全文
posted @ 2012-05-02 06:46
Artech
阅读(16428)
推荐(34)
摘要:

Criminals have long employed the tactic of masking their true identity, from disguises to aliases to caller-id blocking. It should come as no surprise then, that criminals who conduct their nefarious activities on networks and computers should employ such techniques. IP spoofing is one of the most common forms of on-line camouflage. In IP spoofing, an attacker gains unauthorized access to a computer o
阅读全文
posted @ 2012-04-26 11:02
Artech
阅读(2341)
推荐(1)
摘要:

在介绍用于自定义Model元数据属性的AdditionalMetadataAttribute特性时我们提到了它实现的接口IMedataAware,我们说这是一个非常重要并且有用的接口,通过自定义实现该接口的特性我们可以对最终生成的Model元数据进行自由地定制。
阅读全文
posted @ 2012-04-13 06:40
Artech
阅读(8078)
推荐(17)
摘要:

在《上篇》我们已经提到过了,Model元数据的定制是通过在作为Model的数据类型极其属性成员上应用相应的特性来实现,这些用于声明式元数据定义的特性大都定义在System.ComponentModel.DataAnnotations.dll程序集中,程序集的名称同时也是对应的命名空间名称,所以我们可以它们为数据注解特性(Data Annotation Attribute),接下来我们来介绍一些常用的数据注解特性,以及它们对于元数据具有怎样的影响。
阅读全文
posted @ 2012-04-12 07:47
Artech
阅读(13122)
推荐(24)
摘要:

Contronoller激活之后,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元数据中。
阅读全文
posted @ 2012-04-11 07:32
Artech
阅读(18384)
推荐(47)
摘要:

在未来的一段时间里,我将撰写一系列关于ASP.NET MVC的文章。这些文章旨在剖析ASP.NET MVC框架底层的运行机制,力求将整个框架这个黑盒转换为百盒,将框架本身进行请求处理的流程完整而清晰地呈现在读者面前,让读者知其然并知其所以然。了解ASP.NET MVC框架本身的原理,不仅仅可以帮助我们更好地进行相关的编程,还能让我们根据项目具体的需求对其进行得心应手地扩展——因为ASP.NET MVC本身是一个极具扩展性的框架。
阅读全文
posted @ 2012-04-10 08:11
Artech
阅读(105434)
推荐(245)
摘要:

除了通过自定义ControllerFactory的方式引入IoC之外,在使用默认DefaultControllerFactory情况下也可以通过一些扩展使基于IoC的Controller激活成为可能。主要的方式就是自定义ControllerActivator和 DependencyResolver。
阅读全文
posted @ 2012-04-01 12:33
Artech
阅读(11580)
推荐(17)
摘要:

IoC简单地说就是应用本身不负责依赖对象的创建和维护,而交给一个外部容器来负责。这样控制权就由应用转移到了外部IoC容器,控制权就实现了所谓的反转。比如在类型A中需要使用类型B的实例,而B实例的创建并不由A来负责,而是通过外部容器来创建。通过IoC的方式是实现针对目标Controller的激活具有重要的意义。
阅读全文
posted @ 2012-04-01 08:33
Artech
阅读(16818)
推荐(50)
摘要:

Controller激活系统最终通过注册的ControllerFactory创建相应的Conroller对象,如果没有对ControllerFactory类型或者类型进行显式注册(通过调用当前ControllerBuilder的SetControllerFactory方法),默认使用的是一个DefaultControllerFactory对象,我们现在就来讨论实现在DefaultControllerFactory类型中的默认Controller激活机制。
阅读全文
posted @ 2012-03-31 12:54
Artech
阅读(8323)
推荐(23)
摘要:

我们将整个ASP.NET MVC框架划分为若干个子系统,那么针对请求上下文激活目标Controller对象的子系统被我们成为Controller激活系统。本系列将对Controller的激活系统进行深入地剖析,让你明白Controller到底是如何创建的。
阅读全文
posted @ 2012-03-31 09:10
Artech
阅读(14555)
推荐(45)
摘要:

我们知道一个请求最终通过一个具体的HttpHandler进行处理,而我们熟悉的用于表示一个Web页面的Page对象就是一个HttpHandler,被用于处理基于某个.aspx文件的请求。我们可以通过HttpHandler的动态映射来实现请求地址与物理文件路径之间的分离。实际上ASP.NET路由系统就是采用了这样的实现原理。
阅读全文
posted @ 2012-03-28 08:15
Artech
阅读(12788)
推荐(32)
摘要:

ASP.NET 路由系统通过注册的路由表旨在实现两个“方向”的路有功能,即针对入栈请求的路由和出栈URL的生成。前者通过调用代表全局路由表的RouteCollection对象的GetRouteData方法实现,后者则依赖于RouteCollection的GetVirtualPathData方法,而最终还是落在继承自RouteBase的路由对象的同名方法的调用上。为了编程的方面,ASP.NET MVC为了设计了HtmlHelper和UrlHelper这两个帮助类,我们可以通过调用它们的ActionLink/RouteLink和Action/RouteUrl根据注册的路有规则生成链接或者URL。从本质上讲,HtmlHelper/UrlHelper实现的对URL的生成最终还是依赖于上面所说的GetVirtualPathData方法。
阅读全文
posted @ 2012-03-27 08:09
Artech
阅读(20409)
推荐(32)
摘要:

上周我写了三篇文章(一、二、三)详细地介绍了ASP.NET的路由系统。ASP.NET的路由系统旨在通过注册URL模板与物理文件之间的映射进而实现请求地址与文件路径之间的分离,但是对于ASP.NET MVC应用来说,请求的目标不再是一个具体的物理文件,而是定义在某个Controller类型中的Action方法。出于自身路由特点的需要,ASP.NET对ASP.NET的路由系统进行了相应的扩展。
阅读全文
posted @ 2012-03-26 08:14
Artech
阅读(39544)
推荐(58)
摘要:

前面我们已经提到过,ASP.NET 的路由系统主要具有两个方面的应用,其一就是通过注册URL模板与物理文件路径的匹配实现请求地址和物理地址的分离;另一个则是通过注册的路由规测生成一个相应的URL。后者通过调用RouteCollection类型的GetVirtualPath方法来实现。[源代码从这里下载]
阅读全文
posted @ 2012-03-21 08:10
Artech
阅读(14996)
推荐(27)
摘要:

我们可以通过RouteTable的静态属性Routes得到一个基于应用的全局路由表,这是一个类型的RouteCollection的集合对象,我们可以通过调用它的MapPageRoute进行路由映射。接下来我们通过实现演示的方式来说明路由注册的一些细节问题。
阅读全文
posted @ 2012-03-20 08:29
Artech
阅读(34860)
推荐(66)
摘要:

表现为请求地址与目标Controller和Action的动态映射的URL路由系统并不是专属于ASP.NET MVC,而是直接建立在ASP.NET 中。ASP.NET通过URL路由系统实现了请求地址与物理文件的分离。[源代码地址从这里下载]
阅读全文
posted @ 2012-03-19 07:43
Artech
阅读(23511)
推荐(72)
摘要:

我们知道VS开发中引用的程序集和运行时的程序集来源于不同的地方,前者来源于%ProgramFiles%\Reference Assemblies\Microsoft\Framework\.NETFramework\v{version},后者则来源于GAC,你是否发现了它们之间存在着差异吗?
阅读全文
posted @ 2012-03-17 11:32
Artech
阅读(4573)
推荐(6)
摘要:

在《为HtmlHelper添加一个RadioButtonList扩展方法》中我通过对HtmlHelper和HtmlHelper的扩展使我们可以采用”RadioButtonList”的方式对一组类型为“radio”的<input>元素进行操作。昨天对对此进行了一些改进,并将“CheckBoxList”的功能添加进来。[源代码从这里下载]
阅读全文
posted @ 2012-03-16 10:11
Artech
阅读(16955)
推荐(21)
摘要:

在前面一篇文章中,我们通过对HtmlHelper的扩展简化了对DropDownList(Single-Line-Select)和ListBox(Multiple-Line-Select)的绑定,以及对作为数据源的列表进行单独维护。现在我们为HtmlHelper/HtmlHelper添加一个RadioButtonList/RadioButtonListFor扩展方法实现一组RadioButton的绑定。[源代码从这里下载]
阅读全文
posted @ 2012-03-15 14:10
Artech
阅读(11188)
推荐(16)