Web开发网 > 站内搜索 > asp无组件上传
于显示 验证失败后的错误消息。该span元素的CSS类型为field-validation-valid,我们可以通过它来定制错误消息 的显示样式。二、客户端验证规则的生成 ASP .NET MVC在利用jQuery进行客户端验证的时候,虽然验证规则并没有采用其原生的方式通过被验证元素的class属性来提供,但是却可以通过data-val-{rulename}的命名模式提取相应的验证规则属性值,并最终得到一样验证规则,ASP .NET MVC只需要对两种作简单的适配即可。 我们现在关心的是当我们调用HtmlHelperTModel相应的扩展方法将Model对象的某个属性以表单输入元素的形式呈现的http://www.w3dev.cn/article/20120622/ASP.NET-MVC-client-jQuery-Model-validate.aspx
.maxage 23: }; 24: options.messages[agerange] = options.message; 25: });三、AgeRangeAttribute的应用 现在我们将AgeRangeAttribute 应用到一个简单的ASP .NET MVC应用中。在通过VS的ASP .NET MVC项目模板创建的空Web应用中,我们定义了如下一个简单的Person类型,我们定义的AgeRangeAttribute 应用到了表示出生日期的BirthDate上,并将允许的年龄上、下限设置为18和30。 1: public class Person 2http://www.w3dev.cn/article/20120622/ASP.NET-MVC-client-self-defined-validate.aspx
} 24: return base.IsValid(value, validationContext); 25: } 26: } 那么这样一个RangeIfAttribute特性真的能够按照我们期望的方式进行验证吗?为此我们通过Visual Studio的ASP .NET MVC项目模板创建了一个空的Web应用,我们将上面的Employee类型定义其中,然后创建一个具有如下定义的HomeController。在 Action方法Index中,我们创建了一个DataAnnotationsModelValidatorProvider对象,通过它获取针对 Emhttp://www.w3dev.cn/article/20120618/ASP.NET-MVC-Model-ValidationAttribute.aspx
对于ASP .NET MVC基于标注特性的Model验证,很多人只知道应用在数据类型及其属性上用于定义验证规则和错误消息的ValidationAttribute。通过《ASP .NET MVC Model验证-ModelValidator》 的介绍,我们知道了最终用于进行Model验证的是一个叫做ModelValidator的组件 。ValidationAttribute对应的 ModelValidator为DataAnnotationsModelValidator,这篇简短的文章为你介绍ASP .NET MVC是如何针对Validation来创建DataAnnotationsModelValihttp://www.w3dev.cn/article/20120618/ASP.NET-MVC-Model-DataAnnotationsModelValidator.aspx
http://www.w3dev.cn/article/20120618/ASP.NET-MVC-Model-DataAnnotationsModelValidatorProvider.aspx
到此为止,为了能够将验证特性应用于Action方法的参数,我们创建了自定义的ActionInvoker、 ModelValidatorProvider和ModelBinder。为了验证它们是否能够最终实现我们期望的验证效果,我们将它们应用到一个简单的 ASP .NET MVC应用中。六、实例演示 在通过Visual Studio的ASP .NET MVC项目模板创建的空的Web应用中,我们创建了一个具有如下定义的HomeController。我们重写了CreateActionInvoker 方法,如果调用基类同名方法返回一个ControllerActionInvoker对象,那么我们返回一http://www.w3dev.cn/article/20120618/ASP.NET-MVC-Model-ValidationAttribute-demo.aspx
求。但是ASP .NET MVC的Model验证确是Model驱动的,因为验证规则以验证特性的形式应用到Model类型及其属性上。这样的验证方式实际上限制了Model类型 在基于不同验证规则的使用场景中的重用。通过上一篇文章《ASP .NET MVC Model验证-ValidationAttribute示例》的扩展我们将验证特性直接应用在参数上变成了可能,这从一定程度上解决了这个问题,但是只能解决部分问题,因为应用到参数的验证特性只能用于针对参数类型级别的验证,而不能用于针对参数类型属性级别的验证(源代码从这里下载)。一、同一个Model在采用不同的验证规则 现在我们通过利用对ASP .NEThttp://www.w3dev.cn/article/20120618/ASP.NET-MVC-Model-Validatio-rules.aspx
delBinder通过ValueProvider为Model对象的某个属性提供相应属性值之后,会根据定义在基于该属性的Model元 数据的验证规则实施验证。ASP .NET MVC的整个Model验证系统以组件 ModelValidator为核心,或者说Model对象的验证最终通过某个ModelValidator对象来 完成,所以我们有必要先来认识一下ModelValidator以及背后的提供机制。一、ModelValidator 在ASP .NET MVC应用编程接口中,所有的ModelValidator都直接或者间接地继承自抽象类型ModelValidator。如下面的代码片断所示,Modehttp://www.w3dev.cn/article/20120615/ASP.NET-MVC-Model-ModelValidator.aspx
在《ASP .NET MVC Model验证-ModelValidator》 中我们介绍了ASP .NET MVC用于Model验证的四种ModelValidator,那么这些ModelValidator是如何被创建的呢?ASP .NET MVC的很多组件 (比如ModelBinder和Filter)都采用了基于Provider的提供机制,这篇文章为你讲述这些 ModelValidator对应的ModelValidatorProvider。一、ModelValidatorProvider 通过注册ModelValidatorProvider来创建相应的ModelValidator,所有的Modhttp://www.w3dev.cn/article/20120615/ASP.NET-MVC-Model-ModelValidatorProvider.aspx
《ASP .NET MVC Model验证-ModelValidator》介绍用真正用于实施Model验证的ModelValidator,以及用于提供ModelValidator的ModelValidatorProvider《ASP .NET MVC Model验证-ModelValidatorProvider》, 那么对于ASP .NET MVC的Model验证体系来说,最终是通过怎样的方式对ModelValidatorProvider进行注册,又是如何利用它们来创建相应的 ModelValidator来实施Model验证的呢?这就是本篇文章论述的重点。一、ModelValidatorProhttp://www.w3dev.cn/article/20120615/ASP.NET-MVC-Model-ModelValidatorProviders.aspx
3: baz: BazModelBinder四、ModelBinderProvider ASP .NET MVC的Model绑定系统还涉及到另一个重要的组件 ModelBinderProvider。顾名思义,ModelBinderProvider专门用于提供相应的ModelBinder对象,它们均实现了IModelBinderProvider面的代码片断所示,IModelBinderProvider接口定义了唯一的GetBinder方法用于根据数据类型获取相应的ModelBinder对象。不过在ASP .NET MVC现有的应用编程接口中并没有定义任何一个实现该接口的ModelBinderPrhttp://www.w3dev.cn/article/20120614/ASP.NET-MVC-Model-ModelBinder.aspx
用GetValue方法得到 一个ValueProviderResult调用,并最终调用ConvertTo方法转换为参数类型并返回。 为了验证我们自定义的DefaultModelBinder能够真正地用于针对简单参数类型的Model绑定没我们将它应用到一个具体的 ASP .NET MVC应用中。在通过Visual Studio的ASP .NET MVC项目模板创建的空Web应用中,我们创建了如下一个默认的HomeController。HomeController具有一个 ModelBinder属性,其类型正是我们自定义的DefaultModelBinder,该属性通过方法GetValueProvhttp://www.w3dev.cn/article/20120614/ASP.NET-MVC-Model-datatype-bind.aspx
input name=Bar type=file ... / 6: input name=Bar type=file ... / 假设针对具有如下定义的Action方法ActionMethod提交的标单具有如上的输入元素,在三个文本框中输入的字符串将绑定到foo参数,而通过三个文件输入元素上传 得文件将会绑定给bar参数。 1: Public void ActionMethod(string[] foo, HttpPostedFileBase[] bar) 现在我们对用于模拟默认Model绑定的自定义DefaultModelBinder进行进一步完善,使之对基于名称的数组绑定提供支http://www.w3dev.cn/article/20120614/ASP.NET-MVC-Model-array-Collection-bind.aspx
在《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应用的请求都是针对某个Controller的某个Action方法,所以对请求的处理最终体现在对目标Action方法的执行。而Action方 法具有相应的参数,所以在方法执行之前必须根据相应的规则从请求中提取相应的数据并将其转换为Action方法参数列表,我们将这个过程称为Model绑 定。在ASP .NET MVC应用编程接口中,Action方法某个参数的元数据通过ParameterDescriptor表示,而两个相关的类型ControllerDescriptor和ActionDescriptor则用于描述Controller和Action方法。一、Controllerhttp://www.w3dev.cn/article/20120613/ASP.NET-MVC-ControllerDescriptor.aspx
Attribute : Attribute 3: { 4: public abstract bool IsValidForRequest(ControllerContext controllerContext, MethodInfo methodInfo); 5: } 在ASP .NET MVC应用编程接口中定义了如下四个基于HTTP方法(GET、POST、PUT和DELETE)的 ActionMethodSelectorAttribute,当我们将它们应用到某个Action方法上时,只有在当前请求的HTTP方法与之相匹配的 情况下目标Action方法才会被选择。Syshttp://www.w3dev.cn/article/20120613/ASP.NET-MVC-ActionDescriptor.aspx
solver直接通过对指定的类型进行反射来提供对应的实例对象,所以对于前面两个步骤返回的对象 均为Null,所以默认创建出来的ActionInvoker类型为AsyncControllerActionInvoker。我们可以通过如下一个简 单的实例来验证这一点。在通过Visual Studio的ASP .NET MVC项目模板创建的空Web应用中,我们创建了如下一个默认的HomeController,在Action方法Index中直接通过 ContentResult将ActionInvoker属性的类型名称呈现出来。 1: public class HomeController : Conhttp://www.w3dev.cn/article/20120613/ASP.NET-MVC-ControllerDescriptor-ActionDescriptor-create.aspx
Model绑定是为作为目标Action的方法准备参数列表的过程,所以针对参数的描述才是Model绑定的核心。在ASP .NET MVC应用编程接口中,服务于Model绑定的参数元数据通过ParameterDescriptor类型来表示,而ActionDescriptor的GetParameters方法返回的就是一个ParameterDescriptor数组。 如下面的代码片断所示,ParameterDescriptor同样实现了ICustomAttributeProvider接口提供应用在相应参数上的特 性。ParameterDescriptor的只读属性ActionDescriptorhttp://www.w3dev.cn/article/20120613/ASP.NET-MVC-ParameterDescriptor.aspx
中,需要根据基于Action方法参数的绑定上下文从请求数据 中提取相应的数据以提供相应的数据。具体来说,Model绑定的数据具有多个来源,可能来源于Post的表单或者JSON字符串,或者来源于当前的路由数 据,也可能来源于请求地址的插叙字符串。ASP .NET MVC将这种基于不同数据来源的数据获取/提供机制实现在一个叫做ValueProvider的组件 中。一、IValueProvider与ValueProviderResult 一般来讲,一个ValueProvider采用的数据源是一个字典类型的数据结构,我们通过它从这个字典中获取一个Key与当前绑定上下文匹配的值。ValueProvidehttp://www.w3dev.cn/article/20120613/ASP.NET-MVC-ValueProvider-NameValueCollectionValueProvider.aspx
读者对HttpFileCollectionValueProvider采用的针对上传 文件的值对象提供机制具有一个深刻的认识,我们来进行 一个简单的实例演示。在通过Visual Studio的ASP .NET MVC项目模板创建的空Web应用中创建一个具有如下定义的HomeController。该Controller类型中定义了两个Action方法,默 认的Index方法会将默认的View呈现出来,DisplayPostedFiles方法则通过创建的 HttpFileCollectionValueProvider对象将上传 文件的文件名称呈现出来。 1: public class HomeConthttp://www.w3dev.cn/article/20120613/ASP.NET-MVC-ValueProvider-DictionaryValueProvider.aspx
书去同时存在于请求表单和查询字符串中,前者会被选用。 以ValueProvider为核心的值提供系统中涉及到了三类组件 /类型,即用于具体实现数据值提供的 ValueProvider,ValueProvider通过ValueProviderFactotry,而 ValueProviderFactotry通过ValueProviderFactotries进行注册。图5-4所示的UML体现了三者之间的关系。三、实例演示:创建一个自定义ValueProviderFactory ASP .NET MVC提供的6种ValueProviderFactory基本上已经可以满足我们绝大部分Model绑定需求,http://www.w3dev.cn/article/20120613/ASP.NET-MVC-ValueProvider-ValueProviderFactory.aspx
set; } 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元素),而http://www.w3dev.cn/article/20120612/ASP.NET-MVC-Model-predefined-template.aspx
如果模板对应着某个自定义的分部View,那么只需要执行该View即可;对于默认模板,则直接可 以得到相应的HTML。本篇文章着重讨论模板的获取和执行机制,不过在这之前,顺便来讨论一下DataTypeAttribute和模板的关系。一、 DataTypeAttribute和模板有何关系? 通过《ASP .NET MVC Model元数据》针对Model元数据定义的介绍,我们知道通过DataTypeAttribute特性对目标元素设置的数据类型最终会反映在表示Model元数据的 ModelMetadata对象的DataTypeName属性上。此外,对于某些设置的数据类型,比如Date、Time、http://www.w3dev.cn/article/20120612/ASP.NET-MVC-Model-get-template-execute-Strategy.aspx
我们先来看看通过该扩展最终实现的效果。在通过Visual Studio的ASP .NET MVC项目模板创建的空Web应用中,我们定义一个作为Model表示员工的Employee类型。如下面的代码片断所示,表示性别、学历、部门和技能的属性分别应用了RadioButtonListAttribute、DropdownListAttribute、ListBoxAttribute和CheckBoxListAttribubte四 个特性。从名称可以看出来,这四个特性分别代表了目标元素呈现在UI界面上的形式,即对应着传统ASP .NET Web应用中的四种类型的列表控件:RadioButtonList、http://www.w3dev.cn/article/20120612/ASP.NET-MVC-Model-ListControl.aspx
在前面的介绍中我们已经提到过表示Model元数据的ModelMetadata对象最 终是通过一个名为ModelMetadataProvider的组件 提供的,接下来我们着重讨论基于ModelMetadataProvider的 Model元数据提供机制及其扩展。一、 ModelMetadataProvider 在ASP .NET MVC的Model元数据相关的应用编程接口中,用于创建Model元数据的ModelMetadataProvider接继承自抽象类ModelMetadataProvider。 如下面的代码片断所示,ModelMetadataProvide具有三个抽象方法。GetMethttp://www.w3dev.cn/article/20120612/ASP.NET-MVC-Model-ModelMetadataProvider.aspx
er激活之后,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 MVhttp://www.w3dev.cn/article/20120610/ASP.NET-MVC-Model-Metadata.aspx
否需要通过相应的HTML呈现在UI界面 上。具体来说,针对应用了HiddenInputAttribute的目标元素对应的ModelMetadata对象,其被设置为HiddenInput, 并将其DisplayValue属性为HideSurroundingHtml属性赋值。HiddenInput为ASP .NET MVC自身定义的一个默认模板名称,也就是说当目标元素应用了HiddenInputAttribute特性,这个默认模板别用来实现对其的UI呈现。 1: public class ModelMetadata 2: { 3: //其他成员 4: public http://www.w3dev.cn/article/20120610/ASP.NET-MVC-Model-Metadata-Customize.aspx
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: http://www.w3dev.cn/article/20120610/ASP.NET-MVC-Model-Metadata-IMetadataAware-interface.aspx
ontroller类型的。[源代码从这里下载]四、Controller的激活与URL路由 ASP .NET路由系统是HTTP请求抵达服务端的第一道屏障,它根据注册的路由规则对拦截的请求进行匹配并解析包含目标Controller和 Action名称的路由信息。而当前ControllerBuilder具有用于激活Controller对象的ControllerFactory,我 们现在看看两者是如何结合起来的。 通过《ASP .NET MVC路由实现原理-HttpHandler的动态映射》介绍我们知道ASP .NET 路由系统的核心是一个叫做UrlRoutingModule的自定义HttpModulhttp://www.w3dev.cn/article/20120609/ASP.NET-MVC-Controller-design.aspx
VC- 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激活系统会读取这个用于缓存所有Controller类型列表的 Conhttp://www.w3dev.cn/article/20120609/ASP.NET-MVC-Controller-DefaultControllerFactory.aspx
首页 上一页 [1] [2] [3] [4] [5] [6] [7] [8] [9] [10] [11] [12] [13] [14] [15] [16] [17] [18] 下一页 尾页 7/18页,每页显示30条,共518条相关记录