国语自产精品视频在线看:您身边最放心的安全下载站! 最新软件|热门排行|软件分类|软件专题|厂商大全

国语自产精品视频在线看

技术教程
您的位置:首页网络编程.Net编程 → ASP.NET MVC中你必须知道的13个扩展点

ASP.NET MVC中你必须知道的13个扩展点

我要评论 2009/06/13 17:19:32 来源:国语自产精品视频在线看 编辑:佚名 [ ] 评论:0 点击:757次

ScottGu在其最新的博【xīn de bó】🥋文中推荐了Simone Chiaretta的文章🚥13 ASP.NET MVC extensibility points you have to know,该文章🔺为我们简单介绍了【shào le】ASP.NET MVC中的【zhōng de】13个扩展点【diǎn】。Keyvan Nayyeri(与Simone合著了Beginning ASP.NET MVC 1.0一书⛽)又陆续♊发表了【fā biǎo le】一些文👶章🔺,对这【duì zhè】🚥13个扩展点【diǎn】分别😋进行深入的讨【rù de tǎo】论。我将在🔂以后的随笔中【suí bǐ zhōng】对这【duì zhè】🚥些文章🔺逐一进【zhú yī jìn】行翻译,希望能【xī wàng néng】对大家【duì dà jiā】有所帮🎧助🌑。

ASP.NET MVC设计的主要原则之一【zé zhī yī】👪是可扩展性【zhǎn xìng】。处理管【chù lǐ guǎn】➿线(processing pipeline)上的所有(或大多【huò dà duō】❌数)东西都是可替【shì kě tì】换的。因此【yīn cǐ】,如果您【rú guǒ nín】不喜欢ASP.NET MVC所使用的约定【de yuē dìng】🗣(或缺乏【huò quē fá】某些约😡定🏃),您可以创建自己的服务来支【wù lái zhī】持您的🎽约定🗣,并将其🤔注入到主管线⛱中🗞。

在本文【zài běn wén】中🤠,我们将【wǒ men jiāng】从管线🍇开始直到视图【dào shì tú】呈现【chéng xiàn】,逐一向【zhú yī xiàng】您展示每个ASP.NET MVC开发者🍼都必须✝了解🌚13个扩展点。

1.RouteConstraint

通常情况下你【kuàng xià nǐ】可以使用正则表达式【biǎo dá shì】对👩url参数【cān shù】🔌进行约【jìn háng yuē】束🚎,但如果您的约束不仅【shù bú jǐn】仅取决📮于单一📷参数【cān shù】🔌,您可以实现👵IRouteConstrains的方法【de fāng fǎ】,并在其中添加你的验🌿证逻辑。

比如对【bǐ rú duì】日期的🎃验证【yàn zhèng】,url中可能会包含【huì bāo hán】🗿年、月【yuè】、日,而你需【ér nǐ xū】要验证【yàn zhèng】这三者是否可以组合♉成一个🕝有效的👘日期。

2.RouteHandler

RouteHandler是在路📨由选择之后进【zhī hòu jìn】行处理的组件,它并不【tā bìng bú】仅仅针🧒对【duì】🐌ASP.NET MVC。显然,如果您🍼改变了RouteHandler,那么对【duì】🐌请求的【qǐng qiú de】处理将【chù lǐ jiāng】不再使用💇ASP.NET MVC,但这在【dàn zhè zài】您使用💇其他HttpHandler或经典🐬的WebForm进行路由处理【yóu chù lǐ】时却是【shí què shì】🤐非常有用的🥚。

3.ControllerFactory

ControllerFactory是基于路由的✨组件,它选择正确的【zhèng què de】controller并对其实例化。default factory会查找【huì chá zhǎo】实现了【shí xiàn le】IController并且以Controller结尾的类【lèi】,然后通【rán hòu tōng】过反射👃使用无🛳参构造🔵函数进🎬行实例【háng shí lì】🦇化。

但如果您希望😃使用依【shǐ yòng yī】赖注入,就不能⏮再使用default factory,而必须使用支【shǐ yòng zhī】持🥫IoC的【de】📊controller factory。MvcContrib和Ninject Controller Factory都包含【dōu bāo hán】支持🥫IoC容器的【róng qì de】🌼controller factory。

4.ActionInvoker

ActionInvoker顾名思🏘义是负💁责调用👃(invoke)action的【de】。默认的【mò rèn de】action invoker通过方法名、action名或其【míng huò qí】🚡他可能的【de】selector attribute来查找action,然后调【rán hòu diào】用action方法以🤙及定义🍜的【de】filter,最终执【zuì zhōng zhí】行得到【háng dé dào】action result。

你会发现大部【xiàn dà bù】分执行管线存👔在于🔦ControllerActionInvoker类的逻辑之中🥣。因此【yīn cǐ】,如【rú】🤓果希望改变这【gǎi biàn zhè】些约定【xiē yuē dìng】,如【rú】🤓action方法的选择逻【xuǎn zé luó】辑、http参数映👕射到action参数的方式【fāng shì】🎥、选择和🚔执行filter的方式【fāng shì】🎥等【děng】🥒,您需要扩展该👽类并重写需要修改的【xiū gǎi de】方法。

可以参🅾阅【yuè】NinjectActionInvoker I developed to allow injection of dependencies inside filters。

5.ActionMethodSelectorAttribute

使用默认的【rèn de】action invoker时【shí】〰,action的选择【de xuǎn zé】📏是基于名称的【míng chēng de】。您也可以实现🚠自己的Method Selector以改善对于action的选择【de xuǎn zé】📏。在框架中已经包含了⛎AcceptVerbs特性,它允许【tā yǔn xǔ】🙆您指定【nín zhǐ dìng】🧗使用哪🍯一个【yī gè】HTTP Verb来处理action的响应。

例如【lì rú】,您也许会希望基于浏🕺览器所支持的🏉语言或【yǔ yán huò】浏览器【liú lǎn qì】类型😲(如移动🔝设备的【shè bèi de】浏览器【liú lǎn qì】或桌面【huò zhuō miàn】浏览器【liú lǎn qì】)来进行action的选取🐞。

6.AuthorizationFilter

这种过滤器是【lǜ qì shì】在【zài】action执行之🃏前执行的💩,用来确保请求【bǎo qǐng qiú】是有效🅰的💩。

框架中已经包👎含了一些【xiē】🆖autorization过滤器🙋,最有名【zuì yǒu míng】的【de】莫过于Authorize特性🐗,它用来检查当前用户🎢是否允许执行该【gāi】action。另一个是用来【shì yòng lái】🏄阻止🏺CSRF攻击的【de】ValidateAntiForgeryToken。如果您👦希望实【xī wàng shí】🍞现自己【xiàn zì jǐ】的【de】authorization,那么必须实现接口。例如【lì rú】,日期中【rì qī zhōng】的【de】小时。

7.ActionFilter

Action Filters在【zài】action执行前后执行。OutputCache过滤器【guò lǜ qì】是几个【shì jǐ gè】🛬核心过滤器【guò lǜ qì】之一🐚。这可能【zhè kě néng】是您最有可能【yǒu kě néng】使用的🖱扩展点,并且在【zài】我看来【wǒ kàn lái】🌸,controller只关心它的主🌝要工作💕,而【ér】🌯view所需要的所有其他数【qí tā shù】❎据都必须从⚡action过滤器【guò lǜ qì】内部获【nèi bù huò】🐚取,这样的【zhè yàng de】实现对于一🐚个组织良🆗好的view来说,是十分【shì shí fèn】关键的。

8.ModelBinder

默认的👳model binder使用参【shǐ yòng cān】数🐁名称进行HTTP参数【cān shù】🐁到action方法参数【cān shù】🐁的映射🐂。例如🦗,http参数【cān shù】🐁user.address.city将映射【jiāng yìng shè】🐂到方法参数【cān shù】🐁user的Address属性的City属性。DefaultModelBinder也同样【yě tóng yàng】🏭适用于【shì yòng yú】数组和【shù zǔ hé】其他列【qí tā liè】🐚表类型。

更进一步来说🕷,例如【lì rú】,您可能希望从🤓数据【jù】库中进行🛬检索【jiǎn suǒ】,直接根据【jù】person的id将其转【jiāng qí zhuǎn】换为【huàn wéi】Person对象🙆。Timothy Khouri(网名🕕SingingEels)在他的文章🚻Model Binders in ASP.NET MVC中更好【zhōng gèng hǎo】的阐述了这种方法🗑。他的代码基于Preview 5,但其理【dàn qí lǐ】念是一【niàn shì yī】📜样的。

9.ControllerBase

所有的【suǒ yǒu de】Controller均继承🏒自基类【zì jī lèi】Controller。要想在action中封装自己的【zì jǐ de】逻辑和⭕约定👘,创建自己的【zì jǐ de】父类使所💗有Controller继承自【jì chéng zì】♍该类【gāi lèi】,是一种很好的👤方式【fāng shì】。

10.ResultFilter

与ActionFilter类似,ResultFilters在🚲ActionResult前后执【qián hòu zhí】行【háng】。OutputCache过滤器【guò lǜ qì】🤩也可以【yě kě yǐ】作为ResultFilter的示例。另外🏨,比较常用的诠【yòng de quán】释这种🍰过滤器【guò lǜ qì】🤩的示例是日志【shì rì zhì】记录。如果您希望在🚲页面返【yè miàn fǎn】🆑回给用户时记录日志,可以编【kě yǐ biān】🏸写自定【xiě zì dìng】🌑义的RenderFilter,在🚲ActionResult执行【háng】之后记录😖日志。

11.ActionResult

ASP.NET MVC提供了🐲很多result用来呈现视图🐞、JSON、纯文本【chún wén běn】、文件并【wén jiàn bìng】🐃重定向🈲到其他【dào qí tā】action。如果您【rú guǒ nín】🖖需要其🐽他类型的result,可以自【kě yǐ zì】🌆定义【dìng yì】ActionResult,并实现ExecuteResult方法。例如,如果您【rú guǒ nín】🖖希望将PDF文件作⏱为结果【wéi jié guǒ】📬发送,您需要【nín xū yào】使用PDF库编写能够生成PDF的ActionResult。又如【yòu rú】RSS feed,可参见how to write a RssResult in this post。

12.ViewEngine

您可能【nín kě néng】不需要【bú xū yào】编写自🕶己的view engine,但您也🔁许可以考虑使🧦用其他【yòng qí tā】引擎来【lái】替代默认的WebForm view engine。在我看来【lái】,最有趣的引擎【de yǐn qíng】🚓就是📣Spark。

如果您确实希🏜望编写【wàng biān xiě】自己的【zì jǐ de】view engine,可以看一下🐟Brad Wilson的文章【de wén zhāng】🤖: Partial Rendering & View Engines in ASP.NET MVC。

13.HtmlHelper

视图必🍍须十分简单整【jiǎn dān zhěng】洁,它们只【tā men zhī】能包含【néng bāo hán】💱html标记并调用【diào yòng】HtmlHelper的辅助方⛓法【fǎ】。视图中【shì tú zhōng】🔵不能包含【néng bāo hán】💱任何代码➗,所以辅助方⛓法必须【fǎ bì xū】十分方便,使您可🔘以将代🌉码从视图中【shì tú zhōng】🔵提取出来【lái】,放到一🍋个可测【gè kě cè】试的环【shì de huán】🤝境中去。正如【zhèng rú】Rob Conery所说💢:如果有if,就构造【jiù gòu zào】辅助方⛓法【fǎ】(If there's an IF, make a Helper)。

什么是HtmlHelper辅助方法【fǎ】🤭?其实就【qí shí jiù】是HtmlHelper类的扩展方法【fǎ】🤭,这是唯🙄一的要求【qiú】🧗。

你可以从Rob的文章【de wén zhāng】Avoiding Tag Soup中了解到为什么说HtmlHelper是封装【shì fēng zhuāng】视图中【shì tú zhōng】😢代码的💳好方法📡。

在您的应用中该使用哪个呢?

正如您所猜测的【de】💴那样,并不是【shì】所有的【de】💴应用都需要扩展以上㊙的【de】💴13个扩展点。最可能🗡在所有🤮应用中进行扩【jìn háng kuò】🌠展的【zhǎn de】💴是【shì】ActionFilter和HtmlHelper。另外【lìng wài】,您很可【nín hěn kě】能会使用其他人编写的【de】扩展➿,如使用了【le】IoC容器的【róng qì de】💺ControllerFactory或用来【huò yòng lái】🗂摆脱😵WebForm的【de】💴ViewEngine。

但是💛,学习这【xué xí zhè】些扩展🥏点并进行尝试是十分🔶重要的【chóng yào de】🤺,这样您【zhè yàng nín】才会做出选择,并随时🐒准备在必要的【bì yào de】时候使【shí hòu shǐ】用这些强大的【qiáng dà de】扩展点🤯。下周我将发表一些文【yī xiē wén】章来阐【zhāng lái chǎn】🤹述如何😇使用这些扩展🥏点。

如果您⛩想详细了解更多关于🚚该话题【gāi huà tí】的内容【de nèi róng】,可以考📓虑购买🎃即将出【jí jiāng chū】版的📉Beginning ASP.NET MVC(我是作者之一)或【huò】Professional ASP.NET MVC(ASP.NET MVC开发团🏅队编写)或【huò】ASP.NET MVC in Action (Jeffrey Palermo和Ben Scheirman著【zhe】)。

我是否遗漏了【yí lòu le】某些您【mǒu xiē nín】🎓认为重要的扩【yào de kuò】展点⚾呢?您是否使用过【shǐ yòng guò】👪我上面提到的【tí dào de】🤑扩展点【kuò zhǎn diǎn】⚾呢?我很想听听您所遇到🛑的场景。

关键词:ASP.NET

阅读本文后您有什么感想? 已有 人给出评价!

  • 1 欢迎喜欢
  • 2 白痴
  • 2 拜托
  • 1 哇
  • 1 加油
  • 1 鄙视