ASP.NET MVC ActionResult本质:EmptyResult & ContentResult

NET MVC应用中我们定义了如下一个HomeController,其中定义了4个无参数的Action方法。Foo返回一个RedirectResult对 象,Bar的返回类型为viod,Baz返回值为Null,而Qux则返回一个double类型的数字。 1: public class HomeController : Controller 2: { 3: //其他成员 4: public ActionResult Foo() 5: { 6: return new RedirectResult(http://www.asp.net
http://www.w3dev.cn/article/20120909/ASP.NET-MVC-ActionResult-EmptyResult-ContentResult.aspx

ASP.NET MVC ActionResult本质:FileResult

ntentType, string fileDownloadName); 30: }五、实例演示:通过FileResult发布图片  为了让读者对FileResult具有更加深刻地认识,我们通过一个实例来演示如何通过FileResult来对外发布图片。在通过Visual Studio的ASP.NET MVC项目模板创建的空Web应用中,我们在根目录下添加一个名为images的子目录来存放发布的.jpg图片,然后我们定义如下一个 HomeController。 1: public class HomeController : Controller 2: { 3: publ
http://www.w3dev.cn/article/20120909/ASP.NET-MVC-ActionResult-FileResult.aspx

ASP.NET MVC ActionResult本质:HttpStatusCodeResult & RedirectResult/RedirectToRouteResult

的索引,对于暂时重定向则不会。 1: //1、Redirect 2: HTTP/1.1 302 Found 3: Server: ASP.NET Development Server/10.0.0.0 4: Date: Wed, 13 Jun 2012 09:34:15 GMT 5: X-AspNet-Version: 4.0.30319 6: X-AspNetMvc-Version: 4.0 7: Location: http://www.asp.net 8: Cache-Control: private 9: Content-Type: text/html; charset=utf-8
http://www.w3dev.cn/article/20120909/ASP.NET-MVC-ActionResult-HttpStatusCodeResult-RedirectResult-RedirectToRouteResult.aspx

ASP.NET MVC ActionFilter介绍

对象,设置的ActionResult直接作为其 Result属性,而Cancel属性被设置为True。我们现在考虑的问题是:之前的ActionFilter的OnActionExecuted是否 还被执行呢?  为了弄清楚这个问题,我们来创建一个测试程序。在通过Visual Studio的ASP.NET MVC项目模板创建的空Web应用中我们定义了如下三个ActionFilter(FooAttribute、BarAttribute和 BazAttribute),它们都继承自我们自定义的FilterBaseAttribute。在FilterBaseAttribute中实现的 OnActionEx
http://www.w3dev.cn/article/20120906/ASP.NET-MVC-ActionFilter.aspx

自定义BuildProvider生成ASP.NET代码

DOM定义生成代码的结构和基于T4的代码生成方式为ASP.NET应用提供了两种不同方式的代码生成解决方案,还有第三种选择自定义BuildProvider。[文中涉及的源代码从这里下载]一、BuildProvider是什么?  对 于ASP.NET应用的开发者来说,你可能不知道什么是BuildProvider,但是你几乎无时无刻不在使用它所带来的代码生成机制。当你创建一 个.aspx文件的时候,为什么会自动创建对应源代码?当你在该.aspx页面中以XML的方式添加一个按钮,源代码中为什么会自动添加一个同名的属性。 实际上,ASP.NET就是通过一个特殊的BuildProvider实现了将.as
http://www.w3dev.cn/article/20120719/selfdefined-BuildProvider-create-asp.net-code.aspx

ASP.NET MVC的筛选器

GlobalFilterCollection Filters { get; } 4: }  到目前为止,我们已经介绍了ASP.NET MVC默认提供的三种FilterProvider,以及各自采用得Filter提供机制。当用于注册FilterProvider的静态类型在加载的时 候,会默认创建这三种类型的对象并将其作为表示全局FilterProvider集合的Providers属性值,具体的逻辑体现在如下的代码片断中。也 就是说,在默认的情况下ASP.NET MVC会采用这三种FilterProvider来提供所有的Filter对象。 1: public static class F
http://www.w3dev.cn/article/20120709/ASP.NET-MVC-filter.aspx

ASP.NET MVC AuthorizationFilter

))); 14: } 15: }  我们直接运行该程序并在浏览器中通过输入相应的地址来访问这两个Action,并以查询字符串的形式指定它们的两个参数。为了检验ASP.NET MVC对请求输入的验证,我们将表示参数foo的查询字符串的值设置为为script/script。如下图所示,Action1能够正常地被调用,而Action2在调用过程中抛出异常 ,并提示请求中包含危险的查询字符串。  在ASP.NET MVC Model元数据IMetadataAware接口中我们谈到可以通过AllowHtmlAttribute特性来定义表示Model元数据的ModelMetadata的 Re
http://www.w3dev.cn/article/20120709/ASP.NET-MVC-AuthorizationFilter.aspx

ASP.NET MVC异步Action定义和执行原理

原理。一、基于线程池的请求处理  ASP.NET 通过线程池的机制处理并发的HTTP请求。一个Web应用内部维护着一个线程池,当探测到抵达的针对本应用的请求时,会从池中获取一个空闲的线程来处理该 请求。当处理完毕,线程不会被回收,而是重新释放到池中。线程池具有一个线程的最大容量,如果创建的线程达到这个上限并且所有的线程均被处于忙碌状 态,新的HTTP请求会被放入一个请求队列以等待某个完成了请求处理任务的线程重新释放到池中。  我们将这些用于处理HTTP请求的线程称为工作线程(Worker Thread),而这个县城池自然就叫做工作线程池。ASP.NET这种基于线程池的请求处理机制主要具有如下两
http://www.w3dev.cn/article/20120708/ASP.NET-MVC-asynchronous-action-defined-execute.aspx

ASP.NET MVC同步与异步[上篇]

er直接通过对指定的类型进行反射来提供对应的实例对象,所以对于前面两个步骤返回的对象 均为Null,所以默认创建出来的ActionInvoker类型为AsyncControllerActionInvoker。我们可以通过如下一个简 单的实例来验证这一点。在通过Visual Studio的ASP.NET MVC项目模板创建的空Web应用中,我们创建了如下一个默认的HomeController,在Action方法Index中直接通过 ContentResult将ActionInvoker属性的类型名称呈现出来。 1: public class HomeController : Control
http://www.w3dev.cn/article/20120708/ASP.NET-MVC-asynchronous-synchronous-I.aspx

ASP.NET MVC同步与异步[下篇]

  关于ASP.NET MVC对请求的处理方式(同步或者异步)涉及到的五个组件,在《ASP.NET MVC同步与异步[上篇]》 中我们谈了三个(MvcHandler、Controller和ActionInvoker),现在我们来谈余下的两个,即 ControllerDescriptor和ActionDescriptor,这五个组件的执行并非孤立的,而是具有议定的关系。相信读者认真阅读了这 两篇文章后,会对整个请求的处理方式有一个深刻的理解。四、ControllerDescriptor的同步与异步  如果采用ControllerActionInvoker,Action总是以同步的方式来直接,但
http://www.w3dev.cn/article/20120708/ASP.NET-MVC-asynchronous-synchronous-II.aspx

jquery easyui datagrid数据源为json文件问题

tagrid插件使用.json文件为数据源,通过非http协议访问【就是直接拖进浏览器查看效果】,能正常加载.json文件并且生成datagrid数据源。但是通过http协议访问示例代码时,无法加载json文件生成datagrid的数据源。  这个是由于服务器软件,如iis的配置MIME类型或者一些配置不正确导致的。  默认iis是没有json文件的mime映射的,所以请求json文件会出现404【GET请求】或者405 Method Not Allowed【POST请求】错误,导致无法加载json文件。  解决这个问题,可以有2种办法。1)在iis中给网站添加json文件的mime类型,内
http://www.w3dev.cn/article/20120629/jquery-easyui-datagrid-datasource-json-file.aspx

ASP.NET MVC客户端jQuery验证

读者对jQuery的验证框架可能不太熟悉,为此我们来做一个简单的实例验证。  虽然演示jQuery验证使用一个单纯的HTML文件就可以了,但是在这里我们还是通过Visual Studio的ASP.NET MVC项目模板创建一个空的Web应用,这样做有两个目的:其一、项目在创建过程中会自动添加包含jQuery本身及其验证插件的.js文件;其二,可以 确保我们现在使用的用于验证的.js文件和ASP.NET MVC真正使用的.js文件是一致的。我们创建如下一个默认的HomeController,在Action方法Index中将默认的View呈现出来。 1: public class HomeCo
http://www.w3dev.cn/article/20120622/ASP.NET-MVC-client-jQuery-validate.aspx

ASP.NET MVC客户端jQuery Model验证

验证失败后的错误消息。该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

ASP.NET MVC客户端自定义验证

age 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 2: {
http://www.w3dev.cn/article/20120622/ASP.NET-MVC-client-self-defined-validate.aspx

ASP.NET MVC Model验证-ValidationAttribute

24: return base.IsValid(value, validationContext); 25: } 26: }  那么这样一个RangeIfAttribute特性真的能够按照我们期望的方式进行验证吗?为此我们通过Visual Studio的ASP.NET MVC项目模板创建了一个空的Web应用,我们将上面的Employee类型定义其中,然后创建一个具有如下定义的HomeController。在 Action方法Index中,我们创建了一个DataAnnotationsModelValidatorProvider对象,通过它获取针对 Employ
http://www.w3dev.cn/article/20120618/ASP.NET-MVC-Model-ValidationAttribute.aspx

ASP.NET MVC Model验证-DataAnnotationsModelValidator

  对于ASP.NET MVC基于标注特性的Model验证,很多人只知道应用在数据类型及其属性上用于定义验证规则和错误消息的ValidationAttribute。通过《ASP.NET MVC Model验证-ModelValidator》 的介绍,我们知道了最终用于进行Model验证的是一个叫做ModelValidator的组件。ValidationAttribute对应的 ModelValidator为DataAnnotationsModelValidator,这篇简短的文章为你介绍ASP.NET MVC是如何针对Validation来创建DataAnnotationsModelVali
http://www.w3dev.cn/article/20120618/ASP.NET-MVC-Model-DataAnnotationsModelValidator.aspx

ASP.NET MVC Model验证-ValidationAttribute示例

为止,为了能够将验证特性应用于Action方法的参数,我们创建了自定义的ActionInvoker、 ModelValidatorProvider和ModelBinder。为了验证它们是否能够最终实现我们期望的验证效果,我们将它们应用到一个简单的 ASP.NET MVC应用中。六、实例演示  在通过Visual Studio的ASP.NET MVC项目模板创建的空的Web应用中,我们创建了一个具有如下定义的HomeController。我们重写了CreateActionInvoker 方法,如果调用基类同名方法返回一个ControllerActionInvoker对象,那么我们返回一个 Pa
http://www.w3dev.cn/article/20120618/ASP.NET-MVC-Model-ValidationAttribute-demo.aspx

ASP.NET MVC Model多种验证规则

ASP.NET MVC的Model验证确是Model驱动的,因为验证规则以验证特性的形式应用到Model类型及其属性上。这样的验证方式实际上限制了Model类型 在基于不同验证规则的使用场景中的重用。通过上一篇文章《ASP.NET MVC Model验证-ValidationAttribute示例》的扩展我们将验证特性直接应用在参数上变成了可能,这从一定程度上解决了这个问题,但是只能解决部分问题,因为应用到参数的验证特性只能用于针对参数类型级别的验证,而不能用于针对参数类型属性级别的验证(源代码从这里下载)。一、同一个Model在采用不同的验证规则  现在我们通过利用对ASP.NET MVC
http://www.w3dev.cn/article/20120618/ASP.NET-MVC-Model-Validatio-rules.aspx

ASP.NET MVC Model验证-ModelValidator

ic readonly ValidationResult Success; 5: }二、DataAnnotationsModelValidator  稍微了解ASP.NET MVC的读者应该知道,我们可以通过数据类型的某个属性上应用相应的验证标注特性(比如RequiredAttribute、 RangeAttribute和RegularExpressionAttribute等)的方式来定义相应的验证规则,这是ASP.NET MVC 提供的默认Model验证方式。这种基于数据标注(Data Annotation)特性的验证对应的ModelValidator类型为DataAnnotations
http://www.w3dev.cn/article/20120615/ASP.NET-MVC-Model-ModelValidator.aspx

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