一起谈.NET技术,13个不可不知的ASP.NET MVC扩展点

      ASP.NET MVC设计的主要原则之一是可扩展性。处理管线(processing pipeline)上的所有(或大多数)东西都是可替换的。因此,如果您不喜欢ASP.NET MVC所使用的约定(或缺乏某些约定),您可以创建自己的服务来支持您的约定,并将其注入到主管线中。

  在本文中,我们将从管线开始直到视图呈现,逐一向您展示每个ASP.NET MVC开发者都必须了解13个扩展点。

  1.ASP.NET MVC扩展之RouteConstraint

  通常情况下你可以使用正则表达式对url参数进行约束,但如果您的约束不仅仅取决于单一参数,您可以实现 IRouteConstrains的方法,并在其中添加你的验证逻辑。比如对日期的验证,url中可能会包含年、月、日,而你需要验证这三者是否可以组合成一个有效的日期。

  2.ASP.NET MVC扩展之RouteHandler

  RouteHandler是在路由选择之后进行处理的组件,它并不仅仅针对ASP.NET MVC。显然,如果您改变了RouteHandler,那么对请求的处理将不再使用ASP.NET MVC,但这在您使用其他HttpHandler或经典的WebForm进行路由处理时却是非常有用的。

  3.ASP.NET MVC扩展之ControllerFactory

  ControllerFactory是基于路由的组件,它选择正确的controller并对其实例化。 default factory会查找实现了IController并且以Controller结尾的类,然后通过反射使用无参构造函数进行实例化。但如果您希望使用依赖注入,就不能再使用default factory,而必须使用支持IoC的controller factory。MvcContrib和Ninject Controller Factory都包含支持IoC容器的controller factory。

  4.ASP.NET MVC扩展之ActionInvoker

  ActionInvoker顾名思义是负责调用(invoke)action的。默认的action invoker通过方法名、action名或其他可能的selector attribute来查找action,然后调用action方法以及定义的filter,最终执行得到action result。

  你会发现大部分执行管线存在于ControllerActionInvoker类的逻辑之中。因此,如果希望改变这些约定,如action方法的选择逻辑、http参数映射到action参数的方式、选择和执行filter的方式等,您需要扩展该类并重写需要修改的方法。可以参阅NinjectActionInvoker I developed to allow injection of dependencies inside filters。

  5.ASP.NET MVC扩展之ActionMethodSelectorAttribute

  使用默认的action invoker时,action的选择是基于名称的。您也可以实现自己的Method Selector以改善对于action的选择。在框架中已经包含了AcceptVerbs特性,它允许您指定使用哪一个HTTP Verb来处理action的响应。

  例如,您也许会希望基于浏览器所支持的语言或浏览器类型(如移动设备的浏览器或桌面浏览器)来进行action 的选取。

      6.ASP.NET MVC扩展之AuthorizationFilter

      这种过滤器是在action执行之前执行的,用来确保请求是有效的。框架中已经包含了一些autorization过滤器,最有名的莫过于Authorize特性,它用来检查当前用户是否允许执行该action。另一个是用来阻止CSRF攻击的ValidateAntiForgeryToken。如果您希望实现自己的 authorization,那么必须实现接口。例如,日期中的小时。

  7.ASP.NET MVC扩展之ActionFilter

  Action Filters在action执行前后执行。OutputCache过滤器是几个核心过滤器之一。这可能是您最有可能使用的扩展点,并且在我看来,controller只关心它的主要工作,而view所需要的所有其他数据都必须从action过滤器内部获取,这样的实现对于一个组织良好的view来说,是十分关键的。

  8.ASP.NET MVC扩展之ModelBinder

  默认的model binder使用参数名称进行HTTP参数到action方法参数的映射。

      例如,http参数user.address.city将映射到方法参数 user的Address属性的City属性。

      DefaultModelBinder也同样适用于数组和其他列表类型。更进一步来说,例如,您可能希望从数据库中进行检索,直接根据person的id将其转换为Person对象。 Timothy Khouri(网名SingingEels)在他的文章Model Binders in ASP.NET MVC中更好的阐述了这种方法。他的代码基于Preview 5,但其理念是一样的。

  9.ASP.NET MVC扩展之ControllerBase

  所有的Controller均继承自基类Controller。要想在action中封装自己的逻辑和约定,创建自己的父类使所有Controller继承自该类,是一种很好的方式。

  10.ASP.NET MVC扩展之ResultFilter

  与ActionFilter类似,ResultFilters在ActionResult前后执行。 OutputCache过滤器也可以作为ResultFilter的示例。另外,比较常用的诠释这种过滤器的示例是日志记录。如果您希望在页面返回给用户时记录日志,可以编写自定义的RenderFilter,在ActionResult执行之后记录日志。

      11.ASP.NET MVC扩展之ActionResult

  ASP.NET MVC提供了很多result用来呈现视图、JSON、纯文本、文件并重定向到其他action。如果您需要其他类型的result,可以自定义 ActionResult,并实现ExecuteResult方法。例如,如果您希望将PDF文件作为结果发送,您需要使用PDF库编写能够生成PDF的 ActionResult。

  12.ASP.NET MVC扩展之ViewEngine

  您可能不需要编写自己的view engine,但您也许可以考虑使用其他引擎来替代默认的WebForm view engine。在我看来,最有趣的引擎就是Spark。如果您确实希望编写自己的view engine,可以看一下Brad Wilson的文章: Partial Rendering & View Engines in ASP.NET MVC。

  13.ASP.NET MVC扩展之HtmlHelper

  视图必须十分简单整洁,它们只能包含html标记并调用HtmlHelper的辅助方法。视图中不能包含任何代码,所以辅助方法必须十分方便,使您可以将代码从视图中提取出来,放到一个可测试的环境中去。正如Rob Conery所说:如果有if,就构造辅助方法(If there's an IF, make a Helper)。什么是HtmlHelper辅助方法?其实就是HtmlHelper类的扩展方法,这是唯一的要求。你可以从Rob的文章Avoiding Tag Soup中了解到为什么说HtmlHelper是封装视图中代码的好方法。

  在您的应用中该使用哪个呢?正如您所猜测的那样,并不是所有的应用都需要扩展以上的13个扩展点。最可能在所有应用中进行扩展的是 ActionFilter和HtmlHelper。另外,您很可能会使用其他人编写的扩展,如使用了IoC容器的ControllerFactory或用来摆脱WebForm的ViewEngine。但是,学习这些扩展点并进行尝试是十分重要的,这样您才会做出选择,并随时准备在必要的时候使用这些强大的扩展点。

时间: 2024-09-30 02:31:18

一起谈.NET技术,13个不可不知的ASP.NET MVC扩展点的相关文章

13个不可不知的ASP.NET MVC扩展点

ASP.NET MVC设计的主要原则之一是可扩展性.处理管线(processing pipeline)上的所有(或大多数)东西都是可替换的.因此,如果您不喜欢ASP.NET MVC所使用的约定(或缺乏某些约定),您可以创建自己的服务来支持您的约定,并将其注入到主管线中. 在本文中,我们将从管线开始直到视图呈现,逐一向您展示每个ASP.NET MVC开发者都必须了解13个扩展点. 1.ASP.NET MVC扩展之RouteConstraint 通常情况下你可以使用正则表达式对url参数进行约束,但

一起谈.NET技术,使用 IIS Express 取代 ASP.NET Development Server

原文地址:VS 2010 SP1 (Beta) and IIS Express IIS Express 是一个 IIS7.5 对于开发者进行优化的免费版本,它既容易使用,又像 IIS 一样强大. 少于 5 M 的安装文件,轻量级又容易安装. 在 Visual Studio 中进行调试或者运行的时候不需要管理员账号 支持完全的 Web Server 特征,包括 SSL, URL 重写,和其他的 IIS7 模块 支持和允许扩展模块和  IIS7.x 中 web.config 支持的设置. 可以与 A

一起谈.NET技术,十步教你ASP.NET MVC2项目升级MVC 3 RC

微软在10号发布了ASP.NET MVC3的发布候选版(RC:Release-candidate),该版本提供了Razor视图引擎的智能感知等功能,并同样具备Online许可.眼馋的同学是不是已经迫不及待的想将现有项目升级呢?这里我就将官方ReleaseNotes中的升级办法翻译总结一下,以方便那些不喜欢看罗里啰嗦的英文文档的广大同学. 译文 要将现有的ASP.NET MVC2项目手动升级到ASP.NET MVC3(RC),我们需要如下这些步骤: 1. 随便创建一个新的ASP.NET MVC3项

一起谈.NET技术,微软PDC10:大牛谈ASP.NET和C#技术走向

最近看了自己关心的主题的微软PDC视频,也结合自己的Web 2.0项目做了一些思考.这次PDC最大的一个主题就是Azure OS,所谓的云操作系统.不过微软的服务器要布到中国也不知道要到什么时候,所以也没有深究.我主要关心的是Asp.net和C#的技术走向. 我总结了一下,总的走向就是更加的Web化,比如Webform的Tag的ID可以控制了,MVC将成为主流,C# 4.0更加向动态语言靠,甚至引入了一个dynamic的关键字.这些基本和我的预期相符合.其实都指向一个理念:Web的本质是文档.

探讨ASP.NET MVC框架内置AJAX支持编程技术

传统型ASP.NET Web Forms是基于同时包含了表现层和后台代码的Web页面, 所以,紧随其后出现的ASP.NET AJAX,特别是这个框架的服务器端控件并没有像 它们本应该的那样光芒四射.于是,很多跟随AJAX时髦的ASP.NET开发者只是向 ASP.NET页面中随意地放置一些UpdatePanel控件以便使其程序实现基本的AJAX支 持.实际上,这只是防止了页面的"闪烁",而根本上页面还是进行 了完整的回发,并且要经历整个页面的生存周期.为了消除ASP.NET Web Fo

ASP.NET MVC+EF框架+EasyUI实现权限管理系列(13)-权限设计

原文:ASP.NET MVC+EF框架+EasyUI实现权限管理系列(13)-权限设计 ASP.NET MVC+EF框架+EasyUI实现权限管系列 (开篇)   (1):框架搭建    (2):数据库访问层的设计Demo    (3):面向接口编程   (4 ):业务逻辑层的封装    (5):前台Jquery easyUI实现    (6):EF上下文实例管理    (7):DBSession的封装   (8):DBSession线程内唯一     (9):TT摸版的学习    (10):V

一起谈.NET技术,WPF 企业内训全程实录(中)

摘要 WPF企业内训全程实录由于文章比较长,所以一共拆分成了三篇,上篇WPF企业内训全程实录(上)主要讲了基础,这篇作为该实录的中篇,起着承上启下的作用,主要讲解开发模式.团队协作及应用框架.其实如果大家仔细看目录,可以发现我安排的顺序是首先讲解最基本的概念和基础内容.然后过渡到开发模式及框架.最后结合其他技术和项目实际运用,这也是学习并应用一门技术最好的流程.上篇实际上主要有两个侧重点:一则就是理清脉络--历史渊源.概念引入及基本阐述:二则是讲解WPFBasic--主要讲解WPF的每个知识点,

一起谈.NET技术,WPF 基础到企业应用系列3——WPF开发漫谈

1.开篇前言      首先很高兴这个系列能得到大家的关注和支持,基于对大家负责和对自己负责的态度,我会不断努力写好这个系列,分享自己的微薄技术和经验,希望在帮助别人的同时也不断提升自己.由于这篇文章稍多,所以读者花的时间长了一些,也希望大家能够见谅,这个系列以后会每周发三到四篇左右(主要是写一篇差不多要花几晚上,感觉思维比较发散),除了讲WPF技术本身之外,也会讲一些项目具体开发,所以敬请关注.在前两次的文章中我们对WPF有了一个比较全面的认识,那么在本篇文章当中,除了讲一些理论知识外,我们会

一起谈.NET技术,抛砖引玉:我看微软.NET各子技术领域之应用前景

从2002年发布.NET 1.0,历经8年发展,.NET发展到了4.0,已经成为一个庞大而复杂的软件开发与运行平台,其架构日益复杂,其应用领域也在不断地扩展,包容了"一堆"的子技术领域.在.NET 4.0即将发布之际,回顾一下已发布的各项.NET技术,看看哪些技术用得很火,哪些被打入冷宫,再猜猜.NET 4.0中可能会有哪些技术会得到"青睐",是件有意思的事. 1. 桌面应用程序开发技术( Windows Form和WPF) 在.NET桌面应用程序开发领域,Wind