ULX570L路径选用

英文原稿地址:http://weblogs.asp.net/scottgu/archive/2007/12/03/asp-net-mvc-framework-part-2-url-routing.aspx
翻译原作地址:http://blog.joycode.com/scottgu/archive/2007/12/04/112249.aspx

上个月,小编宣布了自己要创作的层层贴子中的第一篇,那几个帖子将商量大家正在开发的新ASP.NET
MVC框架。那几个种类的先是个贴子建筑了3个归纳的电子商务产品列表/浏览场景,切磋了MVC前边的高层次的定义,示范了怎么起初创制三个新ASP.NET
MVC 项目,达成和测试电子商务产品列表的效用。

在先天的贴子里,笔者将深远座谈ASP.NET
MVC框架的不二法门选用(routing)架构,研商一些很酷的定制模式,你能够将其用来你采用中的一些更尖端的景色。

首先部分的不难简述

在这几个种类的先是片段里,大家创制了八个电子商务网站,呈示了三类ULacrosseL:

URL格式 行为 URL例子
/Products/Categories 浏览所有的产品分类 /Products/Categories
/Products/List/Category 列出一个分类中的产品 /Products/List/Beverages
/Products/Detail/ProductID 显示一个特定产品的细节 /Products/Detail/34

大家经过创立象上面那样一个ProductsController类来拍卖那个U福特ExplorerL:

皇冠直营现金网官方网 1

在把地点那么些类加到大家的利用中后,ASP.NET
MVC框架就会把进来的UPRADOL自动导向到我们的控制器上的熨帖的action方法来拍卖请求。

在前几天的贴子里,大家将深入座谈那几个U中华VL映射是怎么着爆发的,以及探索大家能够在ASP.NET
MVC框架中采纳的更尖端的门路采用(routing)场景。作者还将示范你什么得以轻松地单元测试U大切诺基L路径选拔场景。

ASP.NET MVC UOdysseyL路径采取系统都做些什么?

ASP.NET
MVC框架包涵了三个很灵巧的UPAJEROL路径选拔系统,它同意你在行使中定义U凯雷德L映射规则。路径选拔系统有1个重点指标:

  1. 把进来的U中华VL映射到应用,并把它们做导向,那样,正确的Controller和Action方法执行来处理这么些请求
  2. 创设能够用来回调Controllers/Actions的出口到客户端的UCR-VL(例如,表单提交,
    <a href=””> 链接, 和 AJAX 调用等等)

可见利用URubiconL映射规则来还要处理进来的和输出的U福特ExplorerL场景给应用代码添加了过多见风转舵。那表示,假设我们以往想改变使用的UPAJEROL结构的话(譬如,把
/Products 改名为
/Catalog),大家可以修改应用层次的一套映射规则即可,而不须求改变控制器或视图模板中的皇冠直营现金网官方网,任何代码。

暗中认可的ASP.NET MVC UEnclaveL路径选用规则

在暗中认可景况下,当你采纳Visual Studio用ASP.NET MVC Web
Application模板来创建一个新品类时,它会往项目里添加二个ASP.NET
Application类。那是在Global.asax后台代码中贯彻的:

皇冠直营现金网官方网 2

ASP.NET
Application类允许开发人员处理利用运维/中止以及全局性的错误处理的逻辑。

暗许的ASP.NET
MVC项目模板自动向该类添加3个Application_Start方法,在里边注册2条U本田CR-VL路径选取规则:

皇冠直营现金网官方网 3

上边的首先条路子选用规则表示,ASP.NET
MVC框架在暗许情况下,在决定用哪个Controller类来扭转实例,调用哪个Action方法时(以及怎么着需求传入的参数时),应该运用”[controller]/[action]/[id]”的格式把UTucsonL映射到控制器上。

本条私下认可的门路接纳规则正是为啥率先片段中大家的电子商务浏览例程中对UKugaL
/Products/Detail/3
的呼吁自动调用大家的ProductsController类的Detail方法,并且传入3当做id参数值的因由:

皇冠直营现金网官方网 4

地方的第1条路径选拔规则,是用来对大家利用的根U库罗德L”Default.aspx”做特例处理的(当处理1个行使的根U安德拉L的伸手时,这几个U奥迪Q3L有时会棉被和衣服务器代替”/”来传播)。这么些规则确定保证对我们使用的根”/Default.aspx”或”/”的央浼,都会由HomeController类(是在我们应用ASP.NET
MVC Web Application项目模板生成多个新的使用时,由Visual
Studio自动生成的控制器)里的Index() action方法处理。

理解Route实例

路线选取规则是经过向System.Web.Mvc.RouteTable的Routes集合添加Route实例来注册的。

Route类定义了不少你能够用于配置映射规则的质量。你能够由此“古板的” .NET
2.0性质赋值的格局来安装那几个属性:

皇冠直营现金网官方网 5

照旧选择VS
二零零六的C#和VB编写翻译器中的新的对象开首化器特征,更简单地安装属性:

皇冠直营现金网官方网 6 

Route类的Url属性定义了应该用来评估1个门路采纳规则是还是不是适用于进入的一定请求的Url匹配规则。它还定义了U大切诺基L应该如何划分成(tokenized)不相同的参数。U福睿斯L中可替换的参数,是通过
[参数名称]
的句法来定义的。就象在后文论及的那样,大家并不限量于一套固定的“熟识”参数名称,你能够在U汉兰达L使用其余数据的肆意参数。例如,作者得以行使二个”/Blogs/[Username]/Archive/[Year]/[Month]/[Day]/[Title]”的U奔驰G级L规则把进来的3个博客贴子的U大切诺基L举办私分,由MVC框架自动分析成UserName,Year,Month,Day
和 Title参数,并把它们传播本身的控制器的action方法中。

Route类上的Defaults属性定义了二个暗许值的字典,能够在进入的U本田CR-VL并不含有有个别钦定的参数值的动静下行使。例如,在地方的U奥德赛L映射例子中,大家定义了二个私下认可U昂CoraL参数值,贰个是”[action]”
,另叁个是 “[id]”。那象征,假如应用收到的是 /Products/
这一个ULacrosseL,在私下认可情况下,路径选择系统会暗许使用“Index”作为ProductsController的action的称呼来举办。同样地,如若钦点了/Products/List/
,那么就会利用null字符串作为”ID”参数的值。

Route类的RouteHandler属性定义了在UTiguanL被细分成参数,适当的不二法门选拔规则被明确之后,应该用来拍卖请求的
IRouteHandler
实例。在上面的事例中,大家代表,大家想要使用System.Web.Mvc.MvcRounteHandler类来拍卖我们配备好的ULANDL。那些附加的手续存在的来由是,大家想确认保证U奥迪Q3L路径选拔系统能够而且用于MVC和非MVC请求的场馆。有其一IRouteHandler接口,意味着,我们也能够彻底地用于非MVC的乞请(例如标准的WebForms,Astoria
REST援救等等)。

Route类还有3个Validation属性,在本文的稍后我们会做讨论。那么些性情允许大家钦点三个途径选拔规则匹配要求知足的先决条件。例如,大家得以钦命1个门路选拔规则应有只适用于二个特定的HTTP动词(允许我们轻松地映射REST命令),或许大家能够对参数值使用正则表达式,来过滤2个路子选用规则是或不是同盟。

注:在MVC框架的第二个驾驭预览版中,Route类是无法扩充的(它只是个数据类),在下三个预览版中,大家正在研究把它做成可扩大的,允许开发职员添加特定情景的路径类(譬如,四个RestRoute子类)来根本金和利息索地添加新的语义和效劳。

途径规则的评估

当1个进去的U大切诺基L被ASP.NET MVC Web应用收到时,
MVC框架会对RouteTable.Routes集合中的路径选取规则实行评估,以决定适当的Controller来处理该请求。

MVC框架是按RouteTable规则注册的次第做评估来摘取使用哪个Controller的。将进入的U帕杰罗L对每条Route规则做检查和测试,看它是不是同盟,假若贰个Route规则匹配的话,那么该规则(以及相关联的RouteHandler)将被用来处理进来的哀告(全部后边的规则都略过不计)。那象征你相似要按“最特异到最不特殊(most
specific to least
specific,从特出到一般)”的程序来公司你的不二法门接纳规则。

途径选用场景:自定义查询U哈弗L

让我们运用一下有血有肉情形中的自定义路径选择规则来对此做顶级程示范,以促成大家的电子商务网站的查询功能为例。

开班,大家往大家项目中添加3个新的SearchController类:

皇冠直营现金网官方网 7

然后,大家在SearchController类中定义三个Action方法。Index()方法用来显示三个查询网页,上有二个文本框,让用户来输入和交由查询文字。Results()
action方法则用来拍卖相应的表单提交,对数据库做询问,然后把结果突显给用户:

 皇冠直营现金网官方网 8

采用暗中认可的/[controller]/[action]/[id]
UCRUISERL路径映射规则,大家能够现成使用象上边那样的U揽胜极光L来调用大家的SearchController的作为:

场景 URL Action方法
查询表单: /Search/ Index
查询结果: /Search/Results?query=Beverages Results
  /Search/Results?query=ASP.NET Results

专注,根ULANDL /Search 私下认可映射到Index() action方法的原委是因为在Visual
Studio创立三个新品类时,暗中认可添加的 /[controller]/[action]/[id]
的门路定义将暗中同意的action自动安装到“Index”上的(通过Defaults属性):

皇冠直营现金网官方网 9

虽然象 /Search/Results?query=Beverages
那样的U卡宴L是截然可行的,大家恐怕决定对查询结果我们想要稍微美观些的U哈弗L。具体来说,我们兴许想去掉U中华VL中的“Results”action名称,把要查询的文字作为URAV4L的一有些传入,而不是作为U中华VL的查询字符串的值。例如:

场景 URL Action方法
查询表单: /Search/ Index
查询结果: /Search/Beverages Results
  /Search/ASP.NET Results

我们得以经过在暗中同意的 /[controller]/[action]/[id] 规则之前添加2条自定义的UENCOREL路径映射规则来启用那个相比较为难的询问结果U景逸SUVL,象下边那样:

皇冠直营现金网官方网 10

在前2条规则中,大家未来明白地钦点了对应 /Search/
UTucsonL的控制器和Action参数。大家申明,”/Search”
应该总是由SearchController上的“Index”
action来处理。而其他具有子UOdysseyL层次结构的U福睿斯L (/Search/Foo,
/Search/Bar等等 )则连年由SearchController上的 “Results” action 来处理。

下面的第③条路线选拔规则申明,在 /Search/
前缀之后的别的字符应该当作名为”[query]”的参数来处理,那个参数将用作艺术参数来传播SearchController上的Results
action方法中:

皇冠直营现金网官方网 11

最有或许的,大家还会对查询结果启用分页(大家每一遍只呈现1二个查询结果)展现。大家能够通过查询字符串值的艺术来贯彻(譬如,/Search/Beverages?page=2),或许我们也足以把页号嵌在UTucsonL中(譬如/Search/Beverages/2)。要扶助前面这几个做法的话,大家须求做的是,给我们的第1条途径采纳规则再加一个万分的可省参数:

皇冠直营现金网官方网 12

注意,上边包车型客车新UCR-VL规则今后十分的是“Search/[query]/[page]”。我们还将私下认可的页号配置为1,万一页号没有包涵在U翼虎L之中的话(那是经过作为“Defaults”属性值的匿名类型传入的)。

下一场我们能够把大家的SearchController.Results
action方法革新为接受页号参数作为二个办法参数:

皇冠直营现金网官方网 13 

那般,大家就有比较为难的查询U逍客L了(剩下的便是实现这一个查询算法,小编将把它当作练兵留给读者来形成
<g>)。

途径选用规则的辨证先决条件

就象小编在这几个贴子后边提到的,Route类有个Validation属性,允许你添加为使路径采取规则匹配,必须为实在印证先决条件规则(除了U宝马X3L过滤外)。ASP.NET
MVC框架允许你利用正则表达式来验证U奥迪Q7L中的参数值,也允许你对HTTP
Headers进行业评比估(依照HTTP动词的不一样进行不一样的U凯雷德L路径选用)。

上边是三个咱们得以用到象 /Products/Detail/43
那样的UTiggoL身上的自定义的求证规则,它钦定了里面包车型客车ID参数必须是数字(分歧意字符串),而且它的长度必须在1到8时期:

皇冠直营现金网官方网 14

假使大家往应用中传来象 /Products/Detail/12
那样的ULacrosseL,上边的路线选拔规则是合法的,但若是传入 /Products/Detail/abc 或
/Products/Detail/23232323232,它就不会合作。

从路径选择系统创设输出的UTucsonL

在本文的前头,小编说过ASP.NET MVC框架中的U卡宴L路径采取系统承担两件事情:

  1. 把进来的U锐界L映射四处理的Controllers/Actions上
  2. 帮着构建能够在其后用来回调Controllers/Actions的出口到客户端的U瑞鹰L(例如,表单提交,
    <a href=””>链接, 和 AJAX 调用等等)

U安德拉L路径采纳系统有成都百货上千声援方法和类,方便你在启动时动态查看和创设U智跑L(你也得以直接对RouteTable的Route集合举行操作来查看U奇骏L)。

Html.ActionLink

在本博客种类的首先有的,笔者回顾地谈论了Html.ActionLink()视图扶助方法。它能够在视图里选拔,允许你动态地转移
<a href=””>
超链接。比较酷的是,它能够使用MVC路径选拔系统里定义的UCR-VL映射规则来生成那些U揽胜极光L。例如,下边2个Html.ActionLink
调用:

皇冠直营现金网官方网 15

automatically pick up the special Search results route rule we
configured earlier in this post, and the “href” attribute they generate
automatically reflect this:
会自动地接纳咱们在本贴子后边配置的的特有查询结果路径规则,它们自动生成的href属性反映了这么些情况:

皇冠直营现金网官方网 16

尤其地,注意下边,Html.ActionLink的第③个调用自动地把page参数映射成ULX570L的一片段(也留意,第③个调用省略了page参数值,因为它通晓服务器端会自行提供默许值)。

Url.Action

除外使用Html.ActionLink外,ASP.NET
MVC还有个Url.Action()视图支持方法。该方法生成原生的字符串U奥迪Q3L,然后你能够其它方法来接纳它们。例如,上面包车型客车代码片段:

皇冠直营现金网官方网 17

会利用U中华VL路径选拔系统再次来到上面那几个原生的U大切诺基L(而不是包裹在 <a
href=””> 成分里):

皇冠直营现金网官方网 18

Controller.RedirectToAction

ASP.NET
MVC还提供了Controller.RedirectToAction()协助方法,你能够在控制器里应用来展开转向操作(U帕杰罗L是选择U凯雷德L路径选取系统总括出来的)。

譬如说,当在控制器里调用下边代码时:

皇冠直营现金网官方网 19 

在其间,它会扭转八个对Response.Redirect(“/Search/Beverages”)的调用。

D帕杰罗Y (别重复自身)

上述全体的增援方法的利益在于它们允许咱们防止在大家的控制器和视图逻辑中硬写UENVISIONL。假如在后来我们决定改变查询U翼虎L路径映射规则,从”/Search/[query]/[page]”
改回到 “/Search/Results/[query]/[page]” 或者
“/Search/Results?query=[query]&page=[page]”
,我们如若在三个地点(大家的不二法门注册代码中)做编辑,就能够轻松消除。大家不须要变更视图或控制器中的任何代码,就足以捡起新的U本田CR-VL(那就百折不挠了“DRY原则”)。

行使Lambda表明式从路径选择系统营造输出的UPAJEROL

前边的U路虎极光L辅助方法例子使用了VS
二〇〇九中VB和C#如今匡助的新的匿名类型。在上边的事例中,大家选取了匿名类型来有效地传来一串名称/数值对,用以协助映射USportageL(你能够把那想像为浮动字典的一个比较根本的措施)。

除了使用匿名类型以动态情势传送参数外, ASP.NET
MVC框架还支持使用强类型机制创造action路径的能力,那么些强类型机制为U福特ExplorerL帮忙方法提供了编写翻译时检查和intellisense。那是通过运用泛型和新的VB和C#对拉姆da表明式的支撑来兑现的。

诸如,上面那些匿名类型 ActionLink 调用:

皇冠直营现金网官方网 20

也能够写成:

皇冠直营现金网官方网 21

除去写起来大致外,那第四个选拔还有项目安全的裨益,这表示你得到对表明式的编写翻译时检查以及Visual
Studio的代码intellisense(你还足以选用重构工具对它实行重构):

皇冠直营现金网官方网 22

只顾上边,大家是怎么着行使intellisense挑选出我们想用的SearchController的Action方法的,以及参数是强类型的。生成的USportageL都以由ASP.NET
MVC U福特ExplorerL路经选择系统驱动的。

您或者在想,那究竟是怎么回事呢?假如您还记得,三个月前,小编在博客里商讨Lambda表达式时,笔者谈到了Lambda表达式既可以编写翻译出成代码代理(delegate),也能够编写翻译成表达式树对象,然后在运转时得以用来分析Lambda表明式。对于Html.ActionLink<T>
帮忙方法,大家使用这些表达式树选项,然后在运维时解析对应的lambda,查出它调用的action方法以及相关的参数类型,在表达式中内定的称号和值等。然后大家得以在MVC
UKoleosL路径选用系统中动用这么些新闻, 再次回到合适的URubiconL和相关联的HTML。

驷不及舌注意事项:
当使用那拉姆da表明式方法时,大家其实没有运转对应的Controller
action方法。例如,上边包车型地铁代码并不调用大家的SearchController中”Results”
action方法:

皇冠直营现金网官方网 23

实在,它只是回去那一个HTML超链接:

皇冠直营现金网官方网 24

万一那个超链接被用户点击的话,它会向服务器发回多个伸手,该请求会调用SearchController的Results
action方法。

单元测试路径

ASP.NET MVC框架的三个着力设计原则是带动很好的测试协理。
跟MVC框架的别的部分雷同,你能够轻松地单元测试路径和路径匹配规则。MVC路径选取系统能够独立于ASP.NET生成实例和平运动作,那意味着你能够在任何单元测试Curry装载和单元测试路径情势(而不用运营web服务器),能够行使其余单元测试框架(NUnit,
MBUnit, MSTest等等)。

虽说您能够在您的单元测试中向来单元测试贰个ASP.NET
MVC应用的全局RouteTable映射集合,但一般的话,让单元测试改变照旧重视于贰个大局的事态不是二个很好的呼声。三个您能够应用的较好的方式是,把你的门径注册逻辑放在二个象下边那样的RegisterRoutes()协理方法中,对作为参数字传送入的RouteCollection实行操作(注:我们大概会把这些形式在下个预览版更新中做成暗许的VS模板形式):

皇冠直营现金网官方网 25

接下来,你能够编写单元测试,创设自身的RouteCollection实例,调用Application的RegisterRoutes帮助方法,在里边注册应用的路子选拔规则。然后,你能够向利用发出模拟请求,核实那么些请求确有注册了的正确的控制器和action方法,而不用担心其它副功能:

皇冠直营现金网官方网 26

结语

期待那些贴子提供了关于ASP.NET
MVC路径选拔架构工作原理的一些细节,以及你怎么样能够使用它来定制公布在您的ASP.NET
MVC应用中的URAV4L的构造和布局。

在暗许意况下,在您成立2个新的ASP.NET MVC
Web应用时,它会优先定义1个您能够选择的暗许的
/[controller]/[action]/[id]
路径接纳规则,而无需手工业配置或启用什么。那应该允许你不用登记你本身的自定义路径选拔规则,就足以建造许多利用。但愿意上面的内容示范了,如若您想对您协调的U昂CoraL格式做自定义结构来说,做起来并不难,
MVC框架对此提供了广大的职能和灵活性。

瞩望本文对您抱有援救,

Scott

 

 

【译注】 route: n. 航空线,路线 vt. 按路线发送                            
routing: 路由精选,路线采取

相关文章