[转自Scott]ASP.NET MVC框架(第三有些): 把ViewData从控制器传到视图

英文原文地址:http://weblogs.asp.net/scottgu/archive/2007/12/06/asp-net-mvc-framework-part-3-passing-viewdata-from-controllers-to-views.aspx
翻原文地址:http://blog.joycode.com/scottgu/archive/2007/12/07/112355.aspx

英文原稿地址: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框架的多元贴子。ASP.NET MVC框架是个你可以用来结构化你的ASP.NET
web应用,使之具有清晰的关切分离,方便你单元测试代码和支撑TDD流程的可选方法。

上个月,我上了我一旦创作之多如牛毛贴子中的第一篇,这些帖子将讨论我们正开发的新ASP.NET
MVC框架。这个系列之率先只贴子盘了一个简单的电子商务产品列表/浏览场景,讨论了MVC后面的强层次的定义,示范了哪开始创建一个新ASP.NET
MVC 项目,实现同测试电子商务产品列表的功用。

夫系列的第一篇修了一个简练的电子商务产品列表/浏览网站。它讨论了MVC后面的大层次之概念,示范了什么开始创建一个新的ASP.NET
MVC项目,实现同测试者电子商务产品列表功能。系列的第二篇对ASP.NET
MVC框架的URL路径选择(routing)架构做了深入探讨,讨论了其的工作规律与若什么利用它们来处理还高级的URL路径选择场景。

每当今天之贴子里,我将深入座谈ASP.NET
MVC框架的路线选择(routing)架构,讨论一些老大死的定制方式,你可拿其用来你以中之有些又高级的气象。

当今日的帖子里,我将讨论控制器是如何跟视图做交互的,具体来说,我用讨论你可以将数量从控制器传到视图以显示返回到客户端的东山再起的各种方法。

首先局部的简约简述

每当是系列的第一片段里,我们创建了一个电子商务网站,呈示了三近乎URL:

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

咱俩透过创建象下这样一个ProductsController类来处理这些URL:

图片 1

当将地方这个类加到我们的利用被后,ASP.NET
MVC框架就会拿上的URL自动导向到我们的控制器上之熨帖的action方法来拍卖要。

每当今天底贴子里,我们用深入座谈这个URL映射是什么来的,以及探讨我们得以ASP.NET
MVC框架中使的重新高级的路选择(routing)场景。我还拿示范你怎么样得以轻松地单元测试URL路径选择场景。

先是有的简单简述

当此系列之率先片,我们创建了一个电子商务网站,实现了着力的成品列表/浏览支持。我们是用ASP.NET
MVC框架实现者网站的,这个方法会很当然地以代码结构变成独特之控制器,模型与视图组件。

当浏览器为我们的网站发送一个HTTP请求时,ASP.NET
MVC框架将运她的URL路径选择引擎,把上的求映射到一个控制器上之action方法来拍卖它。在因MVC的运中之控制器负责处理上的请求,处理用户输入和交互,执行因这些输入和相的应用逻辑(获取或更新存储于数据库中之范数据等等)。

及生成返回到客户端的HTML回复的时段,控制器一般是和“视图”组件合作,这些视图组件是为单身于控制器的独自的切近或模板的款式落实之,其目的是了尊重于封装显示逻辑。

图片 2

视图不应包含其他应用逻辑或数据库访问代码,所有的动/数据逻辑应该由决定器类来拍卖。这么划分的念头是支援强制你的使用/数据逻辑和界面生成代码间的不可磨灭分离。同时就吗造福你独自为你的界面显示逻辑来单元测试你的施用/数据逻辑。

视图应该单独下于控制器传过来的特定于视图的多少来十分成输出。在ASP.NET
MVC框架中,我们遂是一定于视图的数据吧“ViewData”。这个博客的别样部分将讨论你可据此来拿ViewData从控制器传递让视图来扭转显示的有些见仁见智措施。

ASP.NET MVC URL路径选择网都召开来什么?

ASP.NET
MVC框架包括了一个好灵巧的URL路径选择网,它同意而于利用中定义URL映射规则。路径选择网发出2独重点目的:

  1. 把上的URL映射到以,并拿她做导向,这样,正确的Controller和Action方法执行来处理这些请求
  2. 构建可以据此来回调Controllers/Actions的出口及客户端的URL(例如,表单提交,
    <a href=””> 链接, 和 AJAX 调用等等)

能采取URL映射规则来还要处理上的跟输出的URL场景给应用代码添加了许多见风使舵。这意味着,如果我们以后想转使用之URL结构的说话(譬如,把
/Products 改名为
/Catalog),我们得改以层次之均等仿照映射规则即可,而休欲转移控制器或视图模板被之任何代码。

一个简单的出品列表场景

为扶助说明我们好就此来拿ViewData从控制器传递让视图的有些术,让咱来打一个粗略的出品列表网页:

图片 3

俺们以用一个CategoryID整数来过滤我们纪念要展示在页面及的出品。注意点我们是什么样拿CategoryID嵌在URL中之(例如,Products/Category/2
或 /Products/Category/4 )。

下一场,我们的成品列表网页显示了2单例外之动态内容元素。第一只因素是我们如果显示的归类的公文名称(例如,Condiments-调味品),第二单元素是一个HTML
<ul><li/></ul>
产品名字列表。我当面的屏幕截图中对这2个因素用红笔画了围绕。

每当底下,我们以关押一下咱们可以行使的2独不同的章程来兑现ProductsController类,这个看似处理上的请,获取处理要所欲的数量,然后用是数据传给一个List视图来显示。我们而研究的率先个法子是为此底绑定的字典对象传递者数目,第二只点子则采用强类型类的不二法门来传递者数据。

默认的ASP.NET MVC URL路径选择规则

当默认情形下,当你使用Visual Studio用ASP.NET MVC Web
Application模板来创造一个初类型时,它见面往项目里补充加一个ASP.NET
Application类。这是当Global.asax后台代码中贯彻的:

图片 4

ASP.NET
Application类允许开发人员处理利用启动/中止和全局性的错误处理的逻辑。

默认的ASP.NET
MVC项目模板自动为该类添加一个Application_Start方法,在中注册2条URL路径选择规则:

图片 5

地方的率先漫长路选择规则表示,ASP.NET
MVC框架在默认情形下,在支配用谁Controller类来扭转实例,调用哪个Action方法时(以及哪些需要传入的参数时),应该以”[controller]/[action]/[id]”的格式把URL映射到控制器上。

这个默认的途径选择规则就是为何首先部分丁我们的电子商务浏览例程中对URL
/Products/Detail/3
的呼吁自动调用我们的ProductsController类的Detail方法,并且传入3当id参数值的因:

图片 6

点的亚漫漫途径选择规则,是为此来对我们采用之根URL”Default.aspx”做特例处理的(当处理一个用之根URL的求时,这个URL有时见面给服务器代替”/”来传)。这个规则确保对咱们采取的彻底”/Default.aspx”或”/”的乞求,都见面由HomeController类(是当我们应用ASP.NET
MVC Web Application项目模板生成一个新的利用时,由Visual
Studio自动生成的控制器)里之Index() action方法处理。

道 1:使用 Controller.ViewData 字典来传递ViewData

Controller基类有个ViewData字典属性,可以为此来填充你若招给视图的数码。你利用键/值模式将对象在
ViewData 字典。

脚是单ProductsController类,其中的Category
action方法实现了咱地方的制品列表场景。注意,它是怎么样使用分类的ID参数来询问该分类的文件名称,以及获得该分类中之成品列表的。它使“CategoryName”和“Products”两个键将这半单数据存储在Controller.ViewData
集合中:

图片 7 

下一场,我们地方的Category action方法调用 RenderView(“List”)
来表示它如果因此谁模板来开亮。当您相这样调用RenderView时,它见面将ViewData字典传给视图,以显示相应的复。

落实我们的视图

咱俩拿使居于我们项目的\Views\Products目录下的List.aspx文件来贯彻我们的List视图。这个
List.aspx 将继承 \Views\Shared
文件夹着的Site.Master母版页中之布局(在您创造一个初的视图网页经常,你可当
VS 2008 中,右击,选择续加新项->MVC视图内容网页来连续一个母版页):

图片 8

当我们应用MVC视图内容网页模板来创造List.aspx网页经常,它不是于通常的
System.Web.UI.Page 类继承而来,而是打System.Web.Mvc.ViewPage
基类继承而来(是存活的Page类的一个子类):

图片 9

ViewPage基类提供一个ViewData字典属性,我们得以以视图网页里拜访由控制器添加的数对象。然后我们好取出这些数量对象,使用其来展示HTML输出,可以就此服务器控件的措施,或者用
<%= %> 显示代码的艺术。

采用服务器控件来落实我们的视图

下是一个怎样使用现有的<asp:literal> 和
<asp:repeater>服务器控件来贯彻我们的HTML界面的事例:

图片 10

咱俩可以据此脚的后台代码类将 ViewData
绑定到这些控件之上(注意我们是如何下ViewPage的ViewData字典来落实的
):

图片 11

注: 因为页面及没有 <form runat=”server”>,是勿见面输出 view-state
的。上面的控件也非会见自动生成另外ID值,这意味着你针对输出的HTML有了的支配。

用 <%= %> 代码来贯彻我们的视图

而您再度欣赏下行内代码来特别成输出的话,你而运下的 List.aspx
来兑现和方了等同的结果:

图片 12

横流:
因为ViewData的品类是富含“objects”的字典,为了对她应用foreach语句,我们用拿ViewData[“Products”]的类型转换成
List<Product> 或者
IEnumerable<Product>。我在页面上引用了System.Collections.Generic
和 MyStore.Models 命名空间 以避免输入 List<T> 和 Product
类型的共同体名称。

横流: 上面使用了“var”关键词,这是VS 2008面临新的 C# 和 VB
“类型推断”特性的一个事例(在此看自家以前的相关贴子)。因为咱们将ViewData[“Products”]
转换成了 List<Product>,我们于 List.aspx 文件被的 prduct
变量上取了整机的intellisense:

图片 13

理解Route实例

途径选择规则是由此奔System.Web.Mvc.RouteTable的Routes集合添加Route实例来注册的。

Route类定义了过多君得用来配置映射规则之性。你可以由此“传统的” .NET
2.0性质赋值的计来装这些性:

图片 14

抑或利用VS
2008的C#同VB编译器中的新的靶初始化器特色,更简短地安装属性:

图片 15 

Route类的Url属性定义了当用来评估一个途径选择规则是否适用于上的一定请求的Url匹配规则。它还定义了URL应该怎么样分割成(tokenized)不同的参数。URL中而替换的参数,是通过
[参数名称]
的句法来定义之。就象在后文论及的那样,我们连无克受平法固定的“熟知”参数名称,你可于URL使用另外数据的随机参数。例如,我好动用一个”/Blogs/[Username]/Archive/[Year]/[Month]/[Day]/[Title]”的URL规则把上的一个博客贴子的URL进行分,由MVC框架自动分析成UserName,Year,Month,Day
和 Title参数,并把它传播自己之控制器的action方法中。

Route类上的Defaults属性定义了一个默认值的字典,可以于入的URL并无包含有指定的参数值的情形下采取。例如,在地方的URL映射例子中,我们定义了2只默认URL参数值,一个凡”[action]”
,另一个是 “[id]”。这代表,如果使用收到的凡 /Products/
这个URL,在默认情形下,路径选择网会默认使用“Index”作为ProductsController的action的称来推行。同样地,如果指定了/Products/List/
,那么就会动null字符串作为”ID”参数的价值。

Route类的RouteHandler属性定义了当URL被分开成参数,适当的路子选择规则为确定之后,应该为此来拍卖要的
IRouteHandler
实例。在方的例子中,我们表示,我们想只要采取System.Web.Mvc.MvcRounteHandler类来处理我们配备好的URL。这个附加的步调有的因是,我们怀念保URL路径选择网可以用于MVC和非MVC请求的情况。有之IRouteHandler接口,意味着,我们呢能彻底地用来非MVC的要(例如标准的WebForms,Astoria
REST支持等等)。

Route类还有一个Validation属性,在本文的稍后咱们会做讨论。这个特性允许我们指定一个路子选择规则匹配需要满足的先决条件。例如,我们可指定一个路径选择规则应有一味适用于一个特定的HTTP动词(允许我们轻松地映射REST命令),或者我们好针对参数值使用正则表达式,来过滤一个路线选择规则是否配合。

注:在MVC框架的第一个明白预览版中,Route类是未可以扩大的(它就是只数据类),在产一个预览版中,我们在研究管它们做成可扩大的,允许开发人员添加特定情景的路径类(譬如,一个RestRoute子类)来根利索地互补加新的语义和法力。

道 2:使用强类型类来传递ViewData

除去支持后期绑定的字典方法外,ASP.NET
MVC框架还同意而拿强类型的ViewData对象从控制器传递给您的视图。使用这强类型的法来几乎独好处:

  1. 避免下字符串来查询对象,得到针对性您的控制器和视图代码的编译时检查
  2. 避用以运象C#如此的强类型语言中明确转换ViewData对象字典中之价
  3. 当公的视图网页的标识文件和后台代码文件被得到你的ViewData对象的机动代码intellisense
  4. 可以采用代码重构工具来帮忙自动化对整个应用和单元测试代码库的转移

下是一个强类型的ProductsListViewData类,封装了 List.aspx
视图显示我们的出品列表所用的数,它蕴含 CategoryName 和 Products
属性(是透过使用新的C#自行属性支撑来实现的):

图片 16

接下来我们得创新我们的 ProductsController
实现来采取是目标,把一个强类型的ViewData对象传被咱的视图:

图片 17

专注点,我们是什么通过 RenderView()
方法的一个额外的参数,把我们的强类型 ProductsListViewData
对象传为View的。

管视图的ViewData字典与强类型的ViewData对象同下

面前我们编辑的 List.aspx 视图实现会晤持续跟我们创新了的 ProductsController
协作,不需转代码。这是以,当把一个强类型的 ViewData 对象传递给后续自
ViewPage 的视图类时,ViewData
字典会自行使用反射对强类型的对象的属性做询问取值。所以我们模样下这样的视图中之代码:

图片 18

会晤自动使用反射来起强类型的 ProductsListViewData 对象中得 CategoryName
属性,这个目标是咱们以调用 RenderView 方法时传出的。

运用ViewPage<T>基类来对ViewData强类型化

除外支持因字典的ViewPage基类外,ASP.NET MVC框架中还揭示有依据泛型的
ViewPage<T> 实现。如果您的视图是于 ViewPage<T>
继承而来,这里T表示是控制器传为视图的 ViewData 的种类,那么 ViewData
属性就拿是下了之T类的强类型属性。

像,我们得以创新我们的 List.aspx.cs
后台代码类,不是起ViewPage继承来,而是继续自
ViewPage<ProductsListViewData> :

图片 19

这样做下,页面上的 ViewData 属性将会晤于一个字典成属于
ProductsListViewData
类型。这代表,我们现在可以不再用基于字符串的字典来查获取数据,而是可以利用强类型的属性了:

图片 20

接下来,我们得行使服务器控件的法,或者 <%= %>
显示的道来变化基于这ViewData的HTML。

运用服务器控件来兑现
ViewPage<T>视图

脚是一个例证,我们可使用<asp:literal> 和
<asp:repeater>服务器控件来兑现我们的HTML界面。这是咱们采取持续自
ViewPage 的 List.aspx 网页时所使用的通通等同的标识:

图片 21

下面是对应的后台代码。注意,因为我们是由
ViewPage<ProductsListViewData>
继承而来之,我们可以直接访问它的性,而并非对任何东西做类型转换(什么时候我们决定对内部一个性能改名的话,我们还拿获取重构工具的支撑):

图片 22

使 <%= %> 代码实现我们的
ViewPage<T> 视图

如果您又爱好用行内代码来充分成输出的话,你得形象下这样以 List.aspx
中及跟方一样的结果:

图片 23

用 ViewPage<T> 方法,我们本不再用对 ViewData
使用字符串查阅了。更要之是,注意点,我们不再用针对其余性质做类型转换了,因为她都是强类型的。这意味着,我们可编写
foreach (var product in ViewData.Products) ,而不用对 Products
做类型转换。我们还在循环中之 product 变量上获取了整的intellisense:

图片 24

路线规则之评估

当一个进来的URL被ASP.NET MVC Web应用收到时,
MVC框架会指向RouteTable.Routes集合中之路线选择规则进行评估,以决定适当的Controller来处理该要。

MVC框架是按RouteTable规则注册的次做评估来摘取下谁Controller的。将跻身的URL对各级条Route规则做检测,看它们是否配合,如果一个Route规则匹配的语,那么该规则(以及互动关联的RouteHandler)将吃用来拍卖上的呼吁(所有后面的规则都稍过不计算)。这表示你相似要遵照“最奇特到无限无异(most
specific to least
specific,从突出到一般)”的程序来团而的不二法门选择规则。

结语

要以贴子提供了关于控制器如何将数量传递给视图以展示返回到客户端的复的有些细节。你可采取后期绑定的字典,或者使强类型的不二法门来达成这目的。

第一蹩脚试跳着建MVC应用时,你老可能发现将施用控制器的逻辑和生成界面的代码分离开来之概念有点大。你大概要花费上一致截专门的岁月来基本上建些应用,你才见面发习惯,把温馨之思路转向到拍卖一个请求,执行有的应用逻辑,把修建界面回复所需要的
viewdata 包装起来,然后交由单独的一个视图页面去显得的价值观上。
重点事项:如果是模型对你的话并无感到舒适,那么别用她,MVC的方纯粹是可选的,我们并不认为这是每个人且想只要因此之物。

只是这个分应用的裨益和之后的对象在,它同意你独自为公的界面显示代码,来运转和测试你的运用与数量逻辑。这庞大地好而啊汝的运开发到的单元测试,以及当建筑应用时采用TDD(测试驱动开发)的流水线。在此后的贴子里,我会对这个做还深入之座谈,以及讨论你可用来轻松测试代码的极品实践。

意在本文对而有着助,

Scott

路线选择场景:自定义查询URL

让咱们利用一下切实状况中之自定义路径选择规则来针对之举行一流程示范,以贯彻我们的电子商务网站的查询功能吗例。

起,我们于我们项目蒙上加一个初的SearchController类:

图片 25

下一场,我们于SearchController类中定义2只Action方法。Index()方法用来显示一个询问网页,上有一个文本框,让用户来输入和交给查询文字。Results()
action方法则用来拍卖相应的表单提交,对数据库做询问,然后将结果显示给用户:

 图片 26

用默认的/[controller]/[action]/[id]
URL路径映射规则,我们得现成使用形态下这样的URL来调用我们的SearchController的所作所为:

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

顾,根URL /Search 默认映射到Index() action方法的原因是以以Visual
Studio创建一个初品类时,默认添加的 /[controller]/[action]/[id]
的门径定义将默认的action自动安装及“Index”上之(通过Defaults属性):

图片 27

虽然象 /Search/Results?query=Beverages
这样的URL是全可行之,我们兴许决定针对查询结果我们怀念如果稍好看些的URL。具体来说,我们或许想去丢URL中的“Results”action名称,把要询问的仿作为URL的相同部分传入,而非是作为URL的询问字符串的价值。例如:

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

俺们好透过当默认的 /[controller]/[action]/[id] 规则之前补偿加2长由定义之URL路径映射规则来启用这些比尴尬的询问结果URL,象下这样:

图片 28

在前边2长达规则中,我们今天判地指定了对诺 /Search/
URL的控制器和Action参数。我们表明,”/Search”
应该总是由SearchController上的“Index”
action来处理。而其余具有子URL层次结构的URL (/Search/Foo,
/Search/Bar等等 )则连续由SearchController上之 “Results” action 来拍卖。

点的老二久路子选择规则表明,在 /Search/
前缀之后的其他字符应该当作名为”[query]”的参数来拍卖,这个参数将用作艺术参数来传播SearchController上的Results
action方法被:

图片 29

无限有或的,我们尚见面针对查询结果启用分页(我们每次仅显示10个查询结果)显示。我们得以经查询字符串值的艺术来贯彻(譬如,/Search/Beverages?page=2),或者我们也足以管页号嵌在URL中(譬如/Search/Beverages/2)。要支持后是做法吧,我们需要开的凡,给咱们的次久路选择规则更加一个附加的可省参数:

图片 30

顾,上面的新URL规则现在配合的是“Search/[query]/[page]”。我们还将默认的页号配置也1,万一页号没有包含在URL之中的话(这是通过当“Defaults”属性值的匿名类型传入的)。

下一场我们得拿咱的SearchController.Results
action方法创新为接受页号参数作为一个术参数:

图片 31 

如此,我们尽管有于为难的查询URL了(剩下的就是是落实之查询算法,我拿将其看做练兵留给读者来完成
<g>)。

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

就是象自在这个贴子前面提到的,Route类有个Validation属性,允许而长为要路径选择规则匹配,必须也真印证先决条件规则(除了URL过滤外)。ASP.NET
MVC框架允许而以正则表达式来验证URL中之参数值,也允许你针对HTTP
Headers进行评估(根据HTTP动词的异进行不同的URL路径选择)。

脚是一个我们得以就此到象 /Products/Detail/43
这样的URL身上的自定义的征规则,它指定了里面的ID参数必须是数字(不允字符串),而且它们的长度要以1交8里边:

图片 32

若是我们于下中传象 /Products/Detail/12
这样的URL,上面的路选择规则是法定的,但如若传入 /Products/Detail/abc 或
/Products/Detail/23232323232,它便无见面配合。

自从路径选择网构建输出的URL

在本文的前头,我说过ASP.NET MVC框架中之URL路径选择网负责两起事情:

  1. 把上的URL映射到处理的Controllers/Actions上
  2. 救助着构建可以在后用来回调Controllers/Actions的出口及客户端的URL(例如,表单提交,
    <a href=””>链接, 和 AJAX 调用等等)

URL路径选择网出为数不少援手方法与类似,方便你当运转时动态查看和构建URL(你呢得以直接指向RouteTable的Route集合进行操作来查阅URL)。

Html.ActionLink

于本博客系列的第一片段,我概括地谈论了Html.ActionLink()视图辅助方法。它可以视图里以,允许而动态地扭转
<a href=””>
超链接。比较深的是,它可行使MVC路径选择网里定义的URL映射规则来十分成这些URL。例如,下面2单Html.ActionLink
调用:

图片 33

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属性反映了是情景:

图片 34

特意地,注意点,Html.ActionLink的次只调用自动地将page参数映射成URL的平有的(也留意,第一个调用省略了page参数值,因为它掌握服务器端会自动提供默认值)。

Url.Action

除却用Html.ActionLink外,ASP.NET
MVC还发只Url.Action()视图辅助方法。该方法生成原生的字符串URL,然后你可另外方式来行使它们。例如,下面的代码有:

图片 35

会动用URL路径选择网返回下这个原生的URL(而休是包裹在 <a
href=””> 元素里):

图片 36

Controller.RedirectToAction

ASP.NET
MVC还提供了Controller.RedirectToAction()辅助方法,你可以控制器里采取来拓展中转操作(URL是用URL路径选择网计算出来的)。

像,当当控制器里调用下面代码时:

图片 37 

每当里边,它见面变一个对准Response.Redirect(“/Search/Beverages”)的调用。

DRY (别重复自己)

上述所有的助方法的益处在让她允许我们避免在我们的控制器和视图逻辑中硬写URL。如果在新生我们决定改变查询URL路径映射规则,从”/Search/[query]/[page]”
改回到 “/Search/Results/[query]/[page]” 或者
“/Search/Results?query=[query]&page=[page]”
,我们而在一个地方(我们的路子注册代码中)做编辑,就好轻松搞定。我们不欲改视图或控制器中之任何代码,就可以捡拾起新的URL(这就坚持了“DRY原则”)。

用Lambda表达式从路径选择网构建输出的URL

面前的URL辅助方法例子使用了VS
2008中VB和C#本支持的新的匿名类型。在点的例证中,我们采用了匿名类型来有效地传一失误名称/数值对,用以帮助映射URL(你可把当时想像为变化字典的一个较干净的法门)。

除去利用匿名类型为动态方式传递参数外, ASP.NET
MVC框架还支持采取强类型机制创建action路径的力量,这些强类型机制也URL辅助方法供了编译时检查及intellisense。这是经下泛型和初的VB和C#本着Lambda表达式的支持来实现之。

譬如,下面这匿名类型 ActionLink 调用:

图片 38

否可形容成:

图片 39

除此之外写起来简单外,这第二独挑选还有种安全之补,这象征你沾针对性表达式的编译时检查与Visual
Studio的代码intellisense(你还可动用重构工具对它们进行重构):

图片 40

小心点,我们是哪些用intellisense挑选有我们想就此底SearchController的Action方法的,以及参数是强类型的。生成的URL都是由ASP.NET
MVC URL路经过选择网让的。

您恐怕在怀念,这究竟是怎么回事呢?如果您还记得,8独月前,我以博客里讨论Lambda表达式每每,我摆到了Lambda表达式既好编译出成代码代理(delegate),也足以编译成表达式树对象,然后在运转时好就此来分析Lambda表达式。对于Html.ActionLink<T>
辅助方法,我们用这表达式树选项,然后在运转时分析对应之lambda,查出其调用的action方法和相关的参数类型,在表达式中指定的名称及价值当。然后我们得当MVC
URL路径选择网遭到采用这些信, 返回合适的URL和互相关联的HTML。

关键注意事项:
当使用即时Lambda表达式方法时,我们实际上没有运行对应的Controller
action方法。例如,下面的代码并不调用我们的SearchController中”Results”
action方法:

图片 41

事实上,它就是回来这个HTML超链接:

图片 42

要是此超链接被用户点击的言辞,它会朝着服务器发回一个央,该请求会调用SearchController的Results
action方法。

单元测试路径

ASP.NET MVC框架的一个主干设计基准是推动充分好的测试支持。
跟MVC框架的别组成部分雷同,你可轻松地单元测试路径和路径匹配规则。MVC路径选择网可以单独为ASP.NET生成实例和周转,这象征你可在其他单元测试库里装载和单元测试路径模式(而休用启动web服务器),可以利用其他单元测试框架(NUnit,
MBUnit, MSTest等等)。

虽说您得以公的单元测试中直接单元测试一个ASP.NET
MVC应用之大局RouteTable映射集合,但貌似的话,让单元测试改变或靠让一个大局的状态不是一个十分好的意见。一个您得应用的比较好之模式是,把你的路线注册逻辑在一个样子下这样的RegisterRoutes()辅助方法被,对作为参数传入的RouteCollection进行操作(注:我们也许会管这模式于产只预览版更新中做成默认的VS模板模式):

图片 43

然后,你可以编写单元测试,创建和谐的RouteCollection实例,调用Application的RegisterRoutes辅助方法,在中注册下的不二法门选择规则。然后,你可以为以来模拟请求,核实这些请求确有注册了底是的控制器和action方法,而未用担心另外副作用:

图片 44

结语

希望是贴子提供了关于ASP.NET
MVC路径选择架构工作原理的组成部分细节,以及若如何可以使用它来定制发布于您的ASP.NET
MVC应用被的URL的组织及布局。

以默认情形下,在公创造一个初的ASP.NET MVC
Web应用时,它见面先定义一个您得用的默认的
/[controller]/[action]/[id]
路径选择规则,而不必手工配置或者启用什么。这该允许而绝不登记你协调的自定义路径选择规则,就可打许多以。但想上面的内容示范了,如果您想对您协调的URL格式做打定义结构吧,做起来并无为难,
MVC框架对之提供了重重的功能和灵活性。

盼望本文对而具备助,

Scott

 

 

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

Leave a Comment.