app教程网 综合百科 asp.net mvc运行流程(asp.net mvc ef)

asp.net mvc运行流程(asp.net mvc ef)

In his latest blog post, Scott Gu recommended Simon Chiaretta's article 13 MVC extension points in ASP.NET that you must know.

本文简要介绍了ASP.NET MVC中的13个扩展点。Keyvan Nayyeri(与Simone合著《开始ASP.NET MVC 1.0》)已经陆续发表了一些文章。

对这13个扩展点分别进行了深入的讨论。我会在以后的随笔中逐一翻译这些文章,希望对大家有所帮助。

ASP.NET MVC设计的主要原则之一是可伸缩性。处理流水线上的一切(或大部分)都是可替换的。因此,

如果你不喜欢ASP.NET MVC使用的约定(或者缺少一些约定),你可以创建自己的服务来支持你的约定,并将它们注入主线。

在本文中,我们将一个接一个地向您展示,ASP.NET的每个MVC开发人员都必须理解从管道到视图表示的13个扩展点。

1.RouteConstraint

通常,您可以使用正则表达式来约束url参数,但是如果您的约束依赖于多个参数,您可以实现IRouteConstrains方法并向其中添加验证逻辑。

例如,对于日期验证,url可能包含年、月和日,您需要验证这三者是否可以组合成一个有效的日期。

2.RouteHandler

RouteHandler是一个在路由之后进行处理的组件,它不仅仅是针对ASP.NET MVC的。显然,如果您更改了RouteHandler,ASP.NET MVC将不再用于处理请求。

但是当您使用其他HttpHandler或经典WebForm进行路由处理时,这非常有用。

3.ControllerFactory

ControllerFactory是一个基于路由的组件,它选择正确的控制器并将其实例化。默认工厂寻找实现IController并以Controller结束的类。

然后使用无参数构造函数通过反射将其实例化。

但是,如果要使用依赖注入,就不能再使用默认工厂,而必须使用支持IoC的控制器工厂。

MvcContrib and Ninject controller factories both contain controller factories that support IOC containers.

4.ActionInvoker

ActionInvoker,顾名思义,负责invoke)动作。

默认的动作调用程序通过方法名、动作名或其他可能的选择器属性来查找动作,然后调用动作方法和定义的过滤器。

最后得出动作结果。

你会发现大多数执行管道都存在于ControllerActionInvoker类的逻辑中。因此,如果你想改变这些惯例,

比如动作方法的选择逻辑,http参数映射到动作参数的方式,选择和执行filter的方式等等。你需要扩展这个类,重写需要修改的方法。

You can refer to my development of NinjectActionInvoker, which allows dependencies to be injected into the filter.

5.ActionMethodSelectorAttribute

当使用默认的动作调用程序时,动作的选择是基于名称的。您还可以实现自己的方法选择器来改进操作的选择。AcceptVerbs特性已经包含在框架中。

它允许您指定使用哪个HTTP谓词来处理操作的响应。

例如,您可能希望根据浏览器支持的语言或浏览器类型来选择操作,例如移动设备的浏览器或桌面浏览器。

6.AuthorizationFilter

该过滤器在操作执行之前执行,以确保请求有效。

该框架已经包含了一些授权过滤器,其中最著名的是Authorize特性,用于检查当前用户是否被允许执行该操作。

另一个是ValidateAntiForgeryToken,用于防止CSRF攻击。如果要实现自己的授权,必须实现接口。例如,日期中的小时。

7.ActionFilter

动作过滤器在动作执行前后执行。OutputCache过滤器是几个核心过滤器之一。这大概是你最有可能使用的扩展点,在我看来,控制器只关心它的主要工作。

视图需要的所有其他数据必须从动作过滤器中获得,这对于一个组织良好的视图是至关重要的。

8.ModelBinder

默认的模型绑定器使用参数名将HTTP参数映射到动作方法参数。例如,http参数user。Address.City将被映射到方法参数user的Address属性的City属性。

DefaultModelBinder也适用于数组和其他列表类型。

此外,例如,您可能希望从数据库中检索它,并根据人员的id直接将其转换为人员对象。

Timothy Khouri(网名SingingEels)在他的文章《ASP.NET MVC中的模型绑定器》中更好地阐述了这种方法。他的代码基于Preview 5,但想法是一样的。

9.ControllerBase

所有控制器都从基类控制器继承。如果你想封装你自己逻辑和约定,创建你自己的父类是一个好方法,这样所有的控制器都可以继承它。

10.ResultFilter

与ActionFilter类似,ResultFilters在ActionResult之前和之后执行。OutputCache筛选器也可以用作ResultFilter的示例。此外,

解释这个过滤器的一个常见例子是日志记录。如果希望在页面返回给用户时进行记录,可以编写一个自定义的RenderFilter,在执行ActionResult后进行记录。

11.ActionResult

ASP.NET MVC提供了许多结果来呈现视图、JSON、纯文本、文件和重定向到其他动作。如果需要其他类型的结果,可以自定义ActionResult。

并实现ExecuteResult方法。例如,如果您想要发送一个PDF文件作为结果,您需要使用一个PDF库来编写一个可以生成PDF的ActionResult。另一个例子是RSS提要,

See how to write an RssResult in this article.

12.ViewEngine

您可能不需要编写自己的视图引擎,但是可以考虑使用另一个引擎来代替默认的WebForm视图引擎。在我看来,最有趣的引擎是Spark。

如果你真的想编写自己的视图引擎,你可以阅读Brad Wilson的文章:ASP.NET MVC中的部分渲染视图引擎。

13.HtmlHelper

视图必须非常简单和整洁。它们只能包含html标记并调用HtmlHelper的helper方法。视图不能包含任何代码,所以辅助方法必须非常方便,以便您可以从视图中提取代码,并将其放在可测试的环境中。

就像Rob Conery说的:如果有一个if,构造一个辅助方法(如果有一个IF,做一个Helper)。

什么是HtmlHelper帮助器方法?实际上是HtmlHelper类的扩展方法,这是唯一的要求。

您可以从Rob的文章避免标签汤中了解为什么HtmlHelper是封装视图中代码的好方法。

您应该在应用程序中使用哪一个?

您可以猜到,并不是所有的应用程序都需要扩展上述13个扩展点。所有应用程序中最有可能的扩展是ActionFilter和HtmlHelper。此外,您很可能会使用他人编写的扩展。

比如使用IoC容器的ControllerFactory或者用来摆脱WebForm的ViewEngine。

但是,学习这些扩展点并尝试它们是非常重要的,这样您就可以做出选择,并准备在必要时使用这些强大的扩展点。下周我会发表一些文章来解释如何使用这些扩展点。

可以考虑购买即将出版的Beginning ASP.NET MVC(我是作者之一)或Professional ASP.NET MVC(ASP.NET MVC开发团队编写)或ASP.NET MVC in Action (Jeffrey Palermo和Ben Scheirman著)。

我是否遗漏了某些您认为重要的扩展点呢?您是否使用过我上面提到的扩展点呢?我很想听听您所遇到的场景。

本文来自网络,不代表本站立场,转载请注明出处:https: