ASP.NET MVC的整个Model验证系统以组件ModelValidator为核心,或者说Model对象的验证最终通过某个ModelValidator对象来完成,所以我们有必要先来认识一下ModelValidator...MemberName和Message,前者代表被验证数据成员的名称,后者表示错误消息。...等)的方式来定义相应的验证规则,这是ASP.NET MVC 提供的默认Model验证方式。...如下面的代码片断所示,IDataErrorInfo具有两个成员,只读属性Error用于获取基于自身的错误消息,而只读索引用于返回指定数据成员的错误消息。...而对于该对象的属性的验证则采用另一个类型为DataErrorInfoPropertyModelValidator对象,DataErrorInfoPropertyModelValidator会将属性名称作为调用索引的参数从而获得相应的错误消息
MemberName和Message,前者代表被验证数据成员的名称,后者表示错误消息。...> GetValidators(ModelMetadata metadata, ControllerContext context); 4: } 如上面的代码片段所示,GetValidators方法具有两个参数...如右图所示的UML列出了组成Model验证系统的三个核心类型。...四、DataErrorInfoModelValidator 如果我们让数据类型实现IDataErrorInfo接口,可以利用实现的Error属性和索引提供针对自身以及所属数据成员的验证错误信息。...后者则专门验证容器对象的某个属性,它在实现的Validate方法中会利用属性名从实现的索引中提取相应的错误消息并将其转换成返回的ModelValidationResult对象。
由于具有多个Controller与注册的路由规则相匹配导致ASP.NET MVC的Controller激活系统无法确定目标哪个类型的Controller应该被选用,所以会出现如下图所示的错误。...目前定义了HomeController的两个命名空间具有相同的优先级,现在我们将其中一个定义在当前ControllerBuilder的默认命名空间列表中以提升匹配优先级。...在路由注册时指定的命名空间比当前ControllerBuilder的默认命名空间具有更高的匹配优先级,但是对于这两个集合中的所有命名空间却具有相同的匹配优先级。...现在我们对本例的路由注册代码作了如下的修改,为注册的路由对象指定了两个命名空间(分别是两个HomeContrller所在的命名空间),运行我们的程序依然会得到如第一张图所示的错误。...[关于ASP.NET MVC路由,在我的文章《ASP.NET MVC路由扩展:路由映射》中具有详细的介绍] 在解析Controller真实类型的过程中,会先通过RouteData包含的命名空间来解析Controller
这两个方法的签名如下所示: // GET: /Movies/Delete/5 public ActionResult Delete(int?...,需要方法具有独特唯一的签名 (方法名称相同但不同的参数列表)。...但是,在这里您需要两种删除方法 — — 一个 GET方法和一个POST方法它们都具有相同的签名。(他们都需要接受一个整数作为参数)。 要解决这一点,可以有几种办法。一是使用不同的方法名称。...这是框架代码在前面的示例中所使用的方法。然而,这就带来了一个小问题: ASP.NET 将部分的 URL按名称映射到操作方法,如果您重命名了方法,通常Routing将无法找到该方法。...另一个常见的方法,来避免具有相同名称和签名的方法,是人为地改变POST 方法,包括未使用参数的签名。
在《ASP.NET MVC以ModelValidator为核心的Model验证体系: ModelValidator》中我们介绍了ASP.NET MVC用于Model验证的四种ModelValidator...[本文已经同步到《How ASP.NET MVC Works?》...GetValidators方法具有两个参数,类型ModelMetadata的metadata参数用于或者相应的验证规则,而参数context则是表示当前Model绑定上下文的ModelBindingExecutionContext...方法中,如果当前Model元数据是基于某个属性的(表示容器类型的ContainerType不会Null并且具有属性名称),在调用GetTypeDescriptor方法获取容器类型描述对象,进而根据属性类型得到用于描述属性的...前者对Contact对象本身实施验证,并将Error属性作为验证结果的错误消息;后者针对应的属性实施验证,验证结果的错误消息来源于将属性名称作为索引的值。
将删除数据的HttpPost方法命名为唯一签名或名称的 DeleteConfirmed 方法。...,需要方法具有独特唯一的签名 (方法名称相同但不同的参数列表)。...但是,在这里您需要两种删除方法 — — 一个 GET方法和一个POST方法它们都具有相同的签名。(他们都需要接受一个整数作为参数)。 要解决这一点,可以有几种办法。一是使用不同的方法名称。...这是框架代码在前面的示例中所使用的方法。然而,这就带来了一个小问题: ASP.NET 将部分的 URL按名称映射到操作方法,如果您重命名了方法,通常Routing将无法找到该方法。...另一个常见的方法,来避免具有相同名称和签名的方法,是人为地改变POST 方法,包括未使用参数的签名。
[本文已经同步到《How ASP.NET MVC Works?》...这两个属性指定错误消息所在资源项的名称和类型即可。...我们之所以能够通过重写任一个IsValid方法是我们自定义验证逻辑生效的原因在于这两个方法在ValidationAttribute特殊的定义方法。...为此我们通过Visual Studio的ASP.NET MVC项目模板创建了一个空的Web应用,我们将上面的Employee类型定义其中,然后创建一个具有如下定义的HomeController。...MVC基于标注特性的Model验证:ValidationAttribute ASP.NET MVC基于标注特性的Model验证:DataAnnotationsModelValidator ASP.NET
在简单了解了Unobtrusive JavaScript形式的验证在jQuery中的编程方式之后,我们来介绍ASP.NET MVC是如何利用它实现客户端验证的。...[本文已经同步到《How ASP.NET MVC Works?》...中] 一、ValidationAttribute与HTML ASP.NET MVC默然采用基于ValidationAttribute特性的声明式Model验证,服务端验证最终实现在两个重写的IsValid...}”的命名模式提取相应的验证规则属性值,并最终得到一样验证规则,ASP.NET MVC只需要对两种作简单的适配即可。...ASP.NET MVC的客户端验证:jQuery的验证 ASP.NET MVC的客户端验证:jQuery验证在Model验证中的实现 ASP.NET MVC的客户端验证:自定义验证
作为Controller基类ControllerBase的Execute方法的核心在于对Action方法的执行和作为方法返回的ActionResult的执行,两者的执行是通过一个叫做ActionInvoker...由于Action方法具有相应的参数,在执行Action方法之前必须进行参数的绑定。ASP.NET MVC将这个机制成为Model的绑定,而这又涉及到另一个重要的组件ModelBinder。...,这与在真正的ASP.NET MVC中的同名接口的定义不尽相同。...和真正的ASP.NET MVC一样,定义在Contrller的Action方法返回一个ActionResult对象,我们通过指定它的Execute方法是先对请求的响应。...MVC是如何运行的[1]: 建立在“伪”MVC框架上的Web应用 ASP.NET MVC是如何运行的[2]: URL路由 ASP.NET MVC是如何运行的[3]: Controller的激活
请求处理管道 请求管道是一些用于处理HTTP请求的模块组合,在ASP.NET中,请求管道有两个核心组件:IHttpModule和IHttpHandler。...从IIS7开始两个管道合二为一,称为集成管道。 ? 上图中主要描述ASP.NET运行时对HTTP请求的处理且不涉及太多细节。...ASP.NET MVC中,路由数据必须包含controller和action的名称),再有RouteData获取IRouteHandler最终有IRouteHandler得到IHttpHandler。...Action ASP.NET MVC中ControllerBase是所有Controller的基类,在该类型的Execute方法中通过IActionInvoker的InvokeAction方法来执行对Action...和FilterScope的数值越小,过滤器的执行优先级越高; Order比FilterScope具有更高的优先级,在Order属性值相同时FilterScope才会被考虑 //数值越小,执行优先级越高
ASP.NET MVC将这种基于不同数据来源的数据获取/提供机制实现在一个叫做ValueProvider的组件中。[本文已经同步到《How ASP.NET MVC Works?》...在通过Visual Studio的ASP.NET MVC项目模板创建的空Web应用中,我们定义了如下一个默认的HomeController。...作为数据源的NameValueCollection对象针对一个包含两个元素的Contact集合,前缀“first”可以作为集合对象的名称。...MVC以ValueProvider为核心的值提供系统: NameValueCollectionValueProvider ASP.NET MVC以ValueProvider为核心的值提供系统: DictionaryValueProvider...ASP.NET MVC以ValueProvider为核心的值提供系统: ValueProviderFactory
此外,针对数组/集合的Model绑定还支持基于索引的方式。[源代码从这里下载][本文已经同步到《How ASP.NET MVC Works?》...为了演示针对数组的Model绑定,我们按照如下的方式修改了Action方法。该方法具有两个参数foo和bar,前者是一个字符串数组,后者的类型Bar的Baz属性是一个整型数组。...NameValueCollectionValueProvider具有针对这两个参数的数据源,从上面的代码片断所示,针对参数foo和bar的数据项具有相同的名称(foo和bar.baz)。...索引数据项名称为“index”,并且与数组元素数据项具有相同的前缀。...MVC的Model绑定的机制:简单类型+复杂类型 通过实例模拟ASP.NET MVC的Model绑定的机制:数组 通过实例模拟ASP.NET MVC的Model绑定的机制:集合+字典
如果具有相同的名称的请求书去同时存在于请求表单和查询字符串中,前者会被选用。...MVC项目模板创建一个空Web应用,并创建一个具有如下定义的HomeController。...默认的Action方法Index具有一系列的参数,从参数名称我们可以看出它们代表一些常用的HTTP报头。我们最终将代表HTTP报头的参数值呈现出来。...MVC以ValueProvider为核心的值提供系统: NameValueCollectionValueProvider ASP.NET MVC以ValueProvider为核心的值提供系统: DictionaryValueProvider...ASP.NET MVC以ValueProvider为核心的值提供系统: ValueProviderFactory
前面篇文章我们分别介绍用真正用于实施Model验证的ModelValidator(《ASP.NET MVC以ModelValidator为核心的Model验证体系: ModelValidator》),以及用于提供...ModelValidator的ModelValidatorProvider(《ASP.NET MVC以ModelValidator为核心的Model验证体系: ModelValidatorProvider...MVC项目模板创建的空Web应用中,我们创建了具有如下定义的默认HomeController类。...1: N/A: Contact ASP.NET MVC以ModelValidator为核心的Model验证体系: ModelValidator ASP.NET MVC以ModelValidator为核心的...Model验证体系: ModelValidatorProvider ASP.NET MVC以ModelValidator为核心的Model验证体系: ModelValidatorProviders
目标Controller和Action的名称包含在HTTP请求中,而ASP.NET MVC的首要任务就是通过当前HTTP请求的解析得到正确的Controller和Action的名称。...对于每一个抵达的HTTP请求,ASP.NET MVC会遍历路由表找到一个URL模板的模式与请求地址相匹配的路有对象,并最终解析出以Controller和Action名称为核心的路由数据。...在我们自定义的ASP.NET MVC框架中,路由数据通过具有如下定义的RouteData类型表示。...我们之前已经提到过ASP.NET MVC本质上是两个自定义的ASP.NET组件来实现的,一个是自定义的HttpModule,另一个是自定义的HttpHandler,而后者从RouteData的RouteHandler...MVC提供的基于URL模板的路由机制是通过具有如下定义的Route类型实现的。
ASP.NET MVC采用Model绑定为目标Action生成了相应的参数列表,但是在真正执行目标Action方法之前,还需要对绑定的参数实施验证以确保其有效性,我们将针对参数的验证成为Model绑定。...实际上这也是ASP.NET MVC的Model验证系统默认支持的编程方式。...如果数据成员没有通过验证,我们通过一个ValidationResult对象封装错误消息和数据成员名称(属性名),该方法最终返回的是一个元素类型为ValidationResult的集合。...如下面的代码片段所示,IDataErrorInfo具有两个成员,只读属性Error用于获取基于自身的错误消息,而只读索引用于返回指定数据成员的错误消息。...在实现的索引中,我们将索引参数columnName视为属性名称,根据它按照上面的规则对相应的属性成员实施验证,并在验证失败的情况下返回相应的错误消息。
但这会加大更新、测试和调试代码的难度,该代码在这 3 个领域的两个或多个领域间存在依赖关系。 例如,用户界面逻辑的变更频率往往高于业务逻辑。...提示 如果发现控制器操作经常执行相同类型的操作,则可将这些常见操作移入筛选器,并遵守“不要自我重复”原则。...什么是 ASP.NET Core MVC ASP.NET Core MVC 框架是轻量级、开源、高度可测试的演示框架,并针对 ASP.NET Core 进行了优化。...Core MVC 建立在 ASP.NET Core 的路由之上,是一个功能强大的 URL 映射组件,可用于生成具有易于理解和可搜索 URL 的应用程序。...C#复制 [Authorize] public class AccountController : Controller { 区域 区域提供将大型 ASP.NET Core MVC Web 应用分区为较小功能分组的方法
Value和Errors两个核心属性,前者表示ValueProvider提供的ValueProviderResult对象,后者表示针对该数据对象的错误集合,其类型为ModelErrorCollection...MVC以ModelValidator为核心的Model验证体系: ModelValidatorProviders》),并设置了相应的错误信息。...(《ASP.NET MVC以ModelValidator为核心的Model验证体系: ModelValidatorProviders》),也就是针对Contact对象的验证并不会递归地对Address对象的属性实施验证...c.Address.District) 9: @Html.ValidationMessageFor(c=>c.Address.Street) 10: 通过这两个呈现出来的验证消息具有相同的显示效果...在Action方法Index中,我们通过调用当ModelState属性的AddModelError方法认为地添加三个错误消息,对应的ModelState名称与作为Model的Contact类型的属性名称一致
它可用于任何类型的ASP.NET应用,包括基于ASP.NET Web Forms和ASP.NET MVC的应用。...下面我们来具体分析前台和管理后台: 前台采用ASP.NET MVC 2开发,比较简单,主要是使用ViewModels,HtmlHelper,输出缓存,避免CSRF攻击,查询方法中使用PartialView...ASP.NET 动态数据具有自动格式功能:比如 bit 类型的字段显示为一个多选框,而标识字段不会在插入数据时显示出来。...使用DisplayName更改界面的显示,DisplayName 只能用于类、方法、属性、索引、事件 [MetadataType(typeof(CarRentalMetadata))] ...,Tailspin Travel用来对付管理后台的开发方面具有非常高的效率,在前台使用MVC2保证性能,在UI界面的开发方面非常值得借鉴的一种模式。
HTML5 History API 是通过脚本来操作浏览器历史记录的标准方法,以这点为核心,是实现单页面应用的重点。...作为一个例子,在一般的 JavaScript 中,错误输入变量名称会创建一个新的全局变量。在严格模式下,这将抛出一个错误,因此无法意外创建一个全局变量。...主页索引的 Razor 视图和 MVC 路由 ASP.NET MVC 中集成 AngularJS 的一件有趣的事情,就是应用程序实际上是如何启动和实现路由的。...MVC 路由表中的配置,会将应用路由到 MVC Home 主控制器,并执行主控制器中的索引方法。...在下面的例子中,提供了一种用于注册和动态加载两个控制器和服务的注册方法。如果你愿意,也可以包括 Angular 全部库和指令的注册功能。
领取专属 10元无门槛券
手把手带您无忧上云