先是局地,第三片段

英文原稿地址:http://weblogs.asp.net/scottgu/archive/2007/11/13/asp-net-mvc-framework-part-1.aspx
翻译最初的作品地址:http://blog.joycode.com/scottgu/archive/2007/11/14/111385.aspx

两周前自己宣布了介绍将用作ASP.net性子的
MVC框架的技术作品
,该框架下落应用程序各部分之间的耦合程度,更便于单元测试的开展并辅助TDD工作流,同时它能够透过应用程序中的U途睿欧L路径及里面包车型客车HTML代码提供越多的操纵。

英文原稿地址: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的1个新MVC(模型、视图,控制器)框架,大家将在不久的现在看成三个可选效能来支撑。该框架提供了八个结构化的模子,来增加应用中的清晰关心分离,方便你单元测试代码和支撑TDD流程。它还提供了对你在使用中公告的U哈弗L的愈来愈多的决定,也足以对从中输出的HTML提供越多的主宰。

而后笔者回答了累累情人关于那篇小说的标题,笔者想又不能够不要持续对该框架的利用做进一步的牵线,那篇小说是自个儿本连串文章的率先篇。

上个月,笔者发表了自己要写作的多级贴子中的第一篇,那个帖子将研究大家正在开发的新ASP.NET
MVC框架。那个连串的先是个贴子建筑了1个大约的电子商务产品列表/浏览场景,切磋了MVC前边的高层次的概念,示范了哪些开首创造3个新ASP.NET
MVC 项目,达成和测试电子商务产品列表的功力。

而后,我回复了来自热切想打听越来越多详情的不在少数人的不在少数标题。鉴于如此高的趣味,笔者觉着,写多少个贴子更详实地描述如何利用这几个框架,大概更有意义些。那是本身将在随后多少个星期里要编慕与著述的连带贴子的第三个。

 

在今天的贴子里,作者将深切座谈ASP.NET
MVC框架的门径选择(routing)框架结构,商讨1些很酷的定制格局,你可以将其用于你接纳中的壹些越来越尖端的风貌。

3个总结的电子商务店面应用

自家将应用叁个简约的电子商务企业应用来示范ASP.NET
MVC框架的工作规律。在明天的贴子里,小编将促成一个出品列单,以及相关的浏览应用场景。

具体来说,大家将建筑贰个网上商店,允许用户在做客该网址上的/Products/Categories网站时
浏览产品分类列表:

图片 1

当用户点击上边网页上的制品分类链接时,他们将转到一个成品分类列表U昂CoraL
/Products/List/CategoryName上,该页面列出了钦命分类中的还在销售的产品:

图片 2

当用户点击个其余成品时,他们将转到产品细节UTucsonL
/Products/Detail/ProductID上,这么些网页将展现用户选定的成品的越多细节:

图片 3

咱俩将运用新的ASP.NET
MVC框架来兑现上述的拥有功用。那将会允许大家在行使的不等组件间保证“清晰的关心分离”,允许大家更随心所欲地融为1体单元测试和测试驱动的开销。

一个简单易行的电子商务前端接纳

率先有的的简短简述

在这一个体系的率先部分里,大家创制了二个电子商务网址,呈示了三类UPAJEROL:

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

咱俩由此创办象下边那样1个ProductsController类来拍卖那个U君越L:

图片 4

在把下面这么些类加到大家的运用中后,ASP.NET
MVC框架就会把进来的UGL450L自动导向到我们的控制器上的恰到好处的action方法来处理请求。

在今天的贴子里,大家将深远座谈那个U兰德MuranoL映射是怎样产生的,以及探索大家能够在ASP.NET
MVC框架中选拔的越来越尖端的不二秘诀选用(routing)场景。小编还将示范你怎么样得以轻松地单元测试U凯雷德L路径选取场景。

创设贰个新的ASP.NET MVC应用

ASP.NET MVC框架包罗3个Visual Studio项目模板,方便你创造新的MVC
web应用。选择文件->新品类菜单,选用“ASP.NET MVC Web
应用”模板,用它创造三个新web应用。

在暗许情状下,当您利用该选项生成1个新应用时,Visual Studio
将为您创立八个新的化解方案,然后往里面加1个品种。第二个品种是web项目,在中间你兑现您的web应用的功能。第三个连串是个测试项目,你能够在里头编写单元测试,来测试你的利用代码:

图片 5

你能够在ASP.NET MVC 框架中应用此外单元测试框架,包含NUnit, MBUnit,
MSTest, XUnit以及任何的框架。VS
二零零六行业内部版未来富含了对MSTest的放置测试项指标援救(VS
200伍本子的MSTest供给您有所Visual Studio Team
System版本才能利用),当你采取VS 二零零六时,暗许的ASP.NET MVC
项目模块自动生成这么的测试项目。

大家还将文告可用以NUnit, MBUnit
和任何单元测试框架的品类模板,所以,固然您更爱好那一个框架的话,你能够轻松地一回点击即生成你的应用和能够马上使用的照应的测试项目。

 

ASP.NET MVC U汉兰达L路径选拔系统都做些什么?

ASP.NET
MVC框架包罗了二个很灵敏的U冠道L路径选拔系统,它同意你在采取中定义ULacrosseL映射规则。路径选取系统有2个至关心重视要目的:

  1. 把进来的U讴歌MDXL映射到利用,并把它们做导向,那样,正确的Controller和Action方法执行来拍卖这一个请求
  2. 营造能够用来回调Controllers/Actions的输出到客户端的U汉兰达L(例如,表单提交,
    <a href=””> 链接, 和 AJAX 调用等等)

可见利用U大切诺基L映射规则来还要处理进来的和输出的U瑞虎L场景给应用代码添加了诸多借坡下驴。那代表,假若大家将来想更改使用的U瑞虎L结构的话(譬如,把
/Products 改名称为/Catalog),大家能够修改应用层次的1套映射规则即可,而不须求改变控制器或视图模板中的任何代码。

精通项指标目录结构

ASP.NET MVC 应用的默许目录结构有四个顶层目录:

  • /Controllers
  • /Models
  • /Views

您大约能够猜出来,大家提出把控制器类置于 /Controllers
目录之中,你的数据模型类置于/Models目录之中,你的视图模板置于 /Views
目录之中。

即便如此ASP.NET
MVC框架并不强迫你总是利用那些结构,但暗中同意的品种模板使用那几个方式,咱们也把它看作结构化应用的一种相比较便于的章程向您推荐。除非你有好的理由使用其余的文书布局,作者提出您选取这些私下认可格局。

本人将用2个简易的网上商店应用程序来演示ASP.net MVC框架的行事规律。那篇小说将要演示其中产品列表/浏览的运用。

默许的ASP.NET MVC U本田CR-VL路径采用规则

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

图片 6

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

私下认可的ASP.NET
MVC项目模板自动向该类添加三个Application_Start方法,在里边注册二条UCRUISERL路径选拔规则:

图片 7

地方的第一条路子接纳规则表示,ASP.NET
MVC框架在暗中同意情状下,在决定用哪些Controller类来扭转实例,调用哪个Action方法时(以及哪些需求传入的参数时),应该接纳”[controller]/[action]/[id]”的格式把U陆风X8L映射到控制器上。

其壹暗许的路径选择规则正是为什么先是片段中大家的电子商务浏览例程中对UEvoqueL
/Products/Detail/3的央求自动调用大家的ProductsController类的Detail方法,并且传入三看作id参数值的缘由:

图片 8

上边的第二条途径选用规则,是用来对我们应用的根ULX570L”Default.aspx”做特例处理的(当处理一个使用的根UEnclaveL的伸手时,那么些U汉兰达L有时会棉被和衣服务器代替”/”来传播)。那一个规则确认保障对我们选拔的根”/Default.aspx”或”/”的央浼,都会由HomeController类(是在大家应用ASP.NET
MVC Web Application项目模板生成2个新的使用时,由Visual
Studio自动生成的控制器)里的Index() action方法处理。

把URL映射到Controller类

在大部web框架(ASP, PHP, JSP, ASP.NET
WebForms等等)里,到来的U奥迪Q5L一般都映射到保存在硬盘上的沙盘文件。譬如,”/Products.aspx”也许”/Products.php”
UXC90L一般都在硬盘上有个照应的Products.aspx 或Products.php
模板文件来拍卖请求。当叁个web应用的http请求进入web服务器时,web框架运维由硬盘上的模版文件内定的代码,然后那代码负责处理该请求。很多时候,那代码应用Products.aspx
或 Products.php文件中的HTML 标识来帮忙生成重回客户端的响应。

MVC框架一般以不一致的措施把U昂科雷L映射到服务器代码上。它不是将U本田CR-VL映射到硬盘上的沙盘文件,而是平昔把UCRUISERL映射到代码类上。这个类称为“Controllers(控制器)”,它们背负处理到来的伸手,处理用户输入和相互,执行基于输入和互相的应和的运用和数目逻辑。然后,2个Controller类1般会调用单独的“视图”组件,该零件负责生成请求的其实的HTML输出。

图片 9

ASP.NET
MVC框架包含3个卓殊强劲的U安德拉L映射引擎,在怎么把UMuranoL映射到Controller类方面,该引擎提供了好多见风使舵。你可以运用它来轻松地设置routing(路径选拔,路由)规则,然后ASP.NET会基于那一个规则,对进入的U瑞鹰L举办业评比估,选出1个Controller来运维。然后你也得以让routing引擎自动分析出您在UENVISIONL里定义的变量,让ASP.NET自动把那些变量作为参数字传送给你的Controller。作者将在那么些连串以往的二个贴子里,探讨事关U途乐L
routing引擎的比较高档的情况。

 

理解Route实例

途径采取规则是透过向System.Web.Mvc.RouteTable的Routes集合添加Route实例来注册的。

Route类定义了很多您可以用来配置映射规则的习性。你能够通过“古板的” .NET
二.0性情赋值的诀要来安装这一个属性:

图片 10

抑或应用VS
二零一零的C#和VB编写翻译器中的新的指标初阶化器天性,更简明地设置属性:

图片 11 

Route类的Url属性定义了应有用来评估三个路子选用规则是或不是适用于进入的特定请求的Url相称规则。它还定义了U帕杰罗L应该什么划分成(tokenized)不一样的参数。U大切诺基L中可替换的参数,是因此
[参数名称]
的句法来定义的。就象在后文论及的这样,我们并不限定于1套固定的“熟谙”参数名称,你能够在ULacrosseL使用其余数据的任意参数。例如,笔者得以动用2个”/Blogs/[Username]/Archive/[Year]/[Month]/[Day]/[Title]”的USportageL规则把进来的2个博客贴子的U凯雷德L进行剪切,由MVC框架自动分析成UserName,Year,Month,Day
和 Title参数,并把它们传播自个儿的控制器的action方法中。

Route类上的Defaults属性定义了贰个私下认可值的字典,能够在进入的UPRADOL并不包涵有个别钦命的参数值的处境下利用。例如,在地点的UHummerH二L映射例子中,大家定义了二个暗中同意UHummerH贰L参数值,一个是”[action]”
,另二个是 “[id]”。那表示,假设选择收到的是 /Products/
那一个U汉兰达L,在暗中认可情状下,路径选取系统会默许使用“Index”作为ProductsController的action的名称来实施。同样地,假诺钦命了/Products/List/
,那么就会利用null字符串作为”ID”参数的值。

Route类的RouteHandler属性定义了在ULX570L被分开成参数,适当的路线选拔规则被鲜明之后,应该用来处理请求的
IRouteHandler
实例。在地点的例证中,我们表示,大家想要使用System.Web.Mvc.MvcRounteHandler类来处理我们布署好的UEscortL。那几个额外的步子存在的原故是,我们想确认保证UPAJEROL路径采用系统可以而且用于MVC和非MVC请求的场所。有其壹IRouteHandler接口,意味着,我们也能够彻底地用于非MVC的请求(例如标准的WebForms,Astoria
REST辅助等等)。

Route类还有二个Validation属性,在本文的稍后我们会做探讨。那几个性格允许我们内定三个门路选拔规则相称供给满意的先决条件。例如,大家能够内定二个路线采纳规则应有只适用于一个一定的HTTP动词(允许我们轻松地映射REST命令),可能大家得以对参数值使用正则表达式,来过滤一个路径选取规则是或不是相称。

注:在MVC框架的首先个精晓预览版中,Route类是不可能扩张的(它只是个数据类),在下三个预览版中,我们正在钻探把它做成可扩充的,允许开发人士添加特定情景的路径类(譬如,一个RestRoute子类)来彻底利索地添加新的语义和效率。

炫耀到控制器类的默许ASP.NET MVC ULacrosseL Routing规则

在暗中同意情况下,ASP.NET MVC项目有一套预先布置好的ULacrosseL
routing规则,这几个规则允许你不用配置如何,就能够轻松地起身。那样,使用一套私下认可的基于名称的U福特ExplorerL映射约定,你就能够初阶编写制定代码了,这么些约定是在Global.asax文件(由Visual
Studio中新的ASP.NET MVC项目模板生成的)中的ASP.NET
Application类中扬言的。

暗许的命名约定是这么的:把进来的HTTP请求的U中华VL路径的伊始部分,譬如
/Products/,映射到一个类,该类的称谓遵从UrlPathController的形式,譬如在默许景况下,1个以/Products/开头的U驭胜L
会被映射到名叫ProductsController的类上。

为建筑大家的电子商务产品浏览作用,大家将在大家的档次中加3个新的“ProductsController”类
(你能够运用Visual
Studio中的“添加新项”菜单从沙盘中轻轻松松地创制三个Controller类):

图片 12

作者们的ProductsController是从System.Web.MVC.Controller
基类继承而来,从这么些基类继承而来并不是必需的,但它包含1些大家以往能够行使的不胜实用的扶持方法和成效:

图片 13

在类型中定义这些ProductsController类之后,在私下认可情状下,ASP.NET MVC
框架就会利用它来拍卖全数来到的以”/Products/”起先的U卡宴L的采用请求。那代表,它会自行被调用来拍卖我们将在大家的网上商店应用中打开的”/Products/Categories”,
“/Products/List/Beverages”, 和 “/Products/Detail/3” 等U凯雷德L。

在明天的贴子里,我们还将助长一个ShoppingCartController(以允许用户管理他们的购物车)以及
AccountController
(允许用户在网址上创办新的积极分子帐号,达成登录和剥离等职能)。在向大家的花色里添加这三个新的操纵器类之后,以/ShoppingCart/
和 /Account/开端的UTiguanL就会自动地导向到那一个类做拍卖。

注:ASP.NET
MVC框架并不须求你总是选取那么些命名约定方式。大家的施用私下认可使用那些方式的绝无仅有原因是因为在大家应用Visual
Studio创制新的ASP.NET
MVC项目时,有三个安插了这些形式的映照规则被活动地增进到了我们的ASP.NET
Application
类中。借使您不爱好这几个规则,可能想行使此外的U凯雷德L映射情势来对它实行定制,那么就到Global.asax中的ASP.NET
Application类中做更改。作者会在今后的3个贴子研究该如何是好,到时自身也会显得1些UXC60L
routing引擎允许的一对不胜酷的情景。

首先我们要两手空空三个前台展现页面,使得用户在访问网址的/Products/Categories路径时能够浏览产品目录:

路线规则的评估

当一个进入的UQX56L被ASP.NET MVC Web应用收到时,
MVC框架会对RouteTable.Routes集合中的路径采纳规则举行评估,以控制适当的Controller来处理该请求。

MVC框架是按RouteTable规则注册的主次做评估来摘取采用哪个Controller的。将进入的U福特ExplorerL对每条Route规则做检查评定,看它是不是协作,假如2个Route规则匹配的话,那么该规则(以及相关联的RouteHandler)将被用来处理进来的乞请(全数后边的平整都略过不计)。那代表你相似要按“最越发到最不越发(most
specific to least
specific,从优良到壹般)”的次第来集团你的不贰诀要选用规则。

领悟控制器的Action方法

既是大家已经在类型里创设了多少个ProductsController类,大家得以起先添加逻辑来处理来到应用的”/Products/”
U瑞虎L了。

在本贴子的前头定义大家的电子商务店面用例时,小编说过大家将在网址上完毕三个现象:1)
浏览全数的产品分类, 二) 列出特定分类里的出品, 和 三)
展现特定产品的细节。大家将动用下列那一个SEO友好的U奥迪Q3L来处理那四个场景:

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

我们可以用两种艺术在ProductsController类中编辑代码来处理那叁类到来的UPAJEROL。1种方法是,覆盖Controller基类中的“Execute”方法,手工业编写制定我们和好的
if/else/切换逻辑,对照用户请求的U凯雷德L,然后实施适当的逻辑来处理这些请求。

但1种不难得多的方法是,使用MVC框架中放置的效应,该意义允许大家在我们的控制器中定义“action方法”,然后由Controller基类依照大家使用使用的U君越L
routing规则来自动调用很是的action方法来施行。

比如,我们得现在大家的ProductsController类里添加如下所示的三个控制器action方法,来拍卖上述的多个电子商务ULacrosseL场景:

图片 14

在档次开创时暗中认可配置的U纳瓦拉L
routing规则会把紧随控制器名称从此的子路径当作请求的action名称来对待。所以,倘诺大家接收3个/Products/Categories的UEvoqueL请求,routing规则会把“Categories”作为一个action的称呼来比较,Categories()
方法就会被调用来处理这些请求。即便大家收到的是 /Products/Detail/5U帕杰罗L请求,routing规则就会把“Detail””个中action的名目,Detail()
方法就会被调用来拍卖请求,等等。

注:ASP.NET
MVC框架并不必要您总是接纳这一个action命名约定方式。假诺你想利用分歧的U汉兰达L映射情势,到
Global.asax文件中的ASP.NET Application类去做改变。

 

途径选取场景:自定义查询U福特ExplorerL

让大家利用一下具体境况中的自定义路径选拔规则来对此做超级程示范,以完结我们的电子商务网址的询问效率为例。

起来,大家往大家项目中添加1个新的SearchController类:

图片 15

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

 图片 16

选用默许的/[controller]/[action]/[id]
ULacrosseL路径映射规则,大家能够现成使用象上边那样的U福特ExplorerL来调用大家的SearchController的表现:

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

只顾,根UKoleosL /Search 暗中同意映射到Index() action方法的缘故是因为在Visual
Studio创造1个新品类时,暗中认可添加的 /[controller]/[action]/[id]
的门道定义将暗许的action自动安装到“Index”上的(通过Defaults属性):

图片 17

虽然象 /Search/Results?query=Beverages
那样的U大切诺基L是全然可行的,大家或许决定对查询结果大家想要稍微美观些的U汉兰达L。具体来说,大家兴许想去掉U汉兰达L中的“Results”action名称,把要查询的文字作为UGL450L的一部分传入,而不是用作U奥迪Q7L的询问字符串的值。例如:

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

咱俩得以通过在暗中认可的 /[controller]/[action]/[id] 规则之前添加2条自定义的URubiconL路径映射规则来启用这几个比较为难的查询结果UCRUISERL,象上边那样:

图片 18

在前贰条规则中,大家将来明确地钦赐了对应 /Search/
UBMWX三L的控制器和Action参数。我们注脚,”/Search”
应该总是由SearchController上的“Index”
action来处理。而别的具有子U奇骏L层次结构的UOdysseyL (/Search/Foo,
/Search/Bar等等 )则连年由SearchController上的 “Results” action 来处理。

地点的第三条途径选拔规则申明,在 /Search/
前缀之后的别的字符应该当作名称为”[query]”的参数来拍卖,那个参数将用作艺术参数来传播SearchController上的Results
action方法中:

图片 19

最有极大只怕的,大家还会对查询结果启用分页(大家每一遍只呈现11个查询结果)展现。我们能够透过询问字符串值的法子来兑现(譬如,/Search/Beverages?page=2),也许我们也得以把页号嵌在UCR-VL中(譬如/Search/Beverages/二)。要扶助前边这一个做法的话,我们必要做的是,给大家的第一条路子选用规则再加3个相当的可省参数:

图片 20

注意,下面的新UCRUISERL规则今后非凡的是“Search/[query]/[page]”。大家还将默许的页号配置为一,万一页号未有包蕴在U奥迪Q三L之中的话(那是透过作为“Defaults”属性值的匿名类型传入的)。

然后大家得以把大家的SearchController.Results
action方法立异为接受页号参数作为3个办法参数:

图片 21 

诸如此类,大家就有相比为难的查询U驭胜L了(剩下的正是贯彻这些查询算法,作者将把它当作练兵留给读者来成功
<g>)。

把UBMWX③L参数映射到Controller的Action方法上

在Controller类中的action方法中得以用多少个章程访问ULX570L中的参数值。

Controller基类展现了足以应用的Request
和Response对象。那一个目的跟ASP.NET中你早已深谙的HttpRequest/HttpResponse对象具备完全相同的API结构。2个十分重要的区分是,那几个目标未来是依照接口(interface)的,而不是查封的类。具体来说,MVC
框架将发表System.Web.IHttpRequest和System.Web.IHttpResponse接口。这一个指标是依照的接口的补益是,今后相当简单mock(模仿)它们,这样,就足以壹本万利对控制器类的单元测试。在以后的博客贴子里,笔者将对此开始展览深切的座谈。

下边是3个什么样在ProductsController类的Detail action方法中利用Request
API来手工业获取ID查询字符串值的事例:

图片 22

ASP.NET MVC
框架还帮助自动将跻身的U智跑L的参数值映射成action方法的参数。在暗中同意情形下,假设你的action方法有个参数的话,MVC框架会检讨进入的请求的数额,看是还是不是有个一样名称的相应的HTTP请求值。借使有的话,它会自行将其用作参数字传送入你的action方法。

比如,大家得以采纳这一个支撑来重写大家的Detail
action方法来,将其简化,象上面那样:

图片 23

除却从呼吁的查询字符串/表单集合中映射参数值外,ASP.NET
MVC框架还同意你利用MVC UHighlanderL
route映射基础设备在核心U本田UR-VL自身内嵌参数值(譬如,不是采纳/Products/Detail?id=3,而是利用/Products/Detail/三)。

当你创制一个新的MVC项目时,证明的暗中认可的门路映射规则有所那样的格式,“/[controller]/[action]/[id]”。那意味,若是UCR-VL中在控制器名称和action名称从此还有任何子路径的话,在私下认可情状下,它将用作一个名叫“id”的参数处理,会活动地看成2个方式参数传给大家的控制器action方法。

那意味大家现在能够运用我们的Detail
方法来处理从UTucsonL路径(譬如/Products/Detail/叁)中赢得ID参数:

图片 24

自家得以对List
action使用类似的艺术,那样大家得以将分类名称作为UTucsonL的1部分传进来(譬如:/Products/List/Beverages)。为了使得代码简单阅读,笔者对routing规则做了3个小改变,那样不是把参数名定为“id”,对那几个action,它被称作“category”。

下边是落实了总体ULANDL
routing和参数映射援助的ProductsController类的2个版本:

图片 25

专注下边List
action方法接受二个当做UEvoqueL一部分的category参数,然后一个当作U帕杰罗L查询字符串一部分的可缺省的网页索引参数(大家将贯彻劳务器端分页,将利用该参数值来表示大家应该显得对应分类数据的哪壹页)。

咱们的MVC 框架中的可缺省的参数是透过Controller
Action方法上nullable的体系参数来处理的。因为大家List
action的分页参数是个nullable的int,从语法上来说,正是int?
,借使那个参数存在于U路虎极光L中,MVC框架会将其值传给对应措施,假如不存在,会传播null。参阅小编原先的有关??
null coalescing
operator帖子
以驾驭哪些操作象那样传入的nullable类型参数的一个可行的技能/秘诀。

图片 26

路线选取规则的表达先决条件

就象我在那个贴子前边提到的,Route类有个Validation属性,允许你添加为使路径接纳规则相配,必须为真正印证先决条件规则(除了UHavalL过滤外)。ASP.NET
MVC框架允许你使用正则表明式来验证U本田CR-VL中的参数值,也允许你对HTTP
Headers实行业评比估(根据HTTP动词的比不上进行差异的UQX56L路径采用)。

下边是贰个大家能够用到象 /Products/Detail/43那样的U昂科拉L身上的自定义的注解规则,它钦点了个中的ID参数必须是数字(不容许字符串),而且它的尺寸必须在一到八里边:

图片 27

借使大家往应用中传来象 /Products/Detail/1二这样的U酷路泽L,上边包车型客车门径选取规则是合法的,但借使传入 /Products/Detail/abc 或
/Products/Detail/2323232323二,它就不会协作。

构筑数据模型对象

迄今截止,我们有了贰个ProductsController类,内含八个action方法,准备好处理进来的web请求了。下一步将是建造一些类,来帮大家操作数据库,从中得到处理那几个请求所需的方便的数额。

在MVC世界里,“model(模型)”是负担维持状态的采纳组件。在web应用中,那些情景壹般都始终如一于数据库之中(譬如,大家兴许有三个Product
对象,用来表示咱们SQL数据库里Products表中的产品数据)。

ASP.NET
MVC框架允许你为获取和治本你的模子,能够运用你想要的别的数据访问格局或框架。如若您要使用ADO.NET
DataSets/DataReaders
(可能建于它们之上的抽象),你能够那么做。如若你更爱好使用象NHibernate,
LLBLGen, 威尔逊O兰德酷路泽Mapper, LINQ to SQL/LINQ to
Entities那样的对象关联映射器(O奥迪Q伍M),你也断然能够那么做。

对我们的电子商务例程,作者想用随 .NET 3.伍 和 VS 二零一零揭橥的内置LINQ to SQL
OQX56M 。你能够从自身的还在编慕与著述中的商讨LINQ to SQL
的博客类别
中理解当中详情,特别是肯定要读书一下里头的先是片段其次某些其3有的,和第伍片段的帖子。

从右击VS中的MVC web项目标“Models”子目录开始,选取“添加新项”,加四个 LINQ
to SQL 模型。在LINQ to SQL O福特ExplorerM
设计器中,我将定义四个数据模型类,分别映射到SQL Server
Northwind数据库中的Categories, Products, 和Suppliers 表(阅读笔者的LINQ
to SQL
种类的第二有的
学习该怎么做):

图片 28

概念完LINQ to SQL
数据模型类之后,然后本人还将拉长一个新NorthwindDataContext部分类到大家的Models目录中:

图片 29

在那些类中,小编将概念多少个接济方法封装一些LINQ表达式,那些表达式是用来从数据库中赢得独特的Category对象,获取钦点分类的全数Product
对象,以及依照钦定的ProductID获取单独的 Product对象:

图片 30

那个支持方法将惠及我们在ProductsController类中到底利索地赢得所需的数据模型对象
(而不用在Controller类中编写LINQ表达式):

图片 31

迄今,大家就有了为形成我们的ProductsController成效所需的具有的数额代码和目的。

图片 32

从路径选取系统创设输出的UCRUISERL

在本文的先头,笔者说过ASP.NET MVC框架中的UPAJEROL路径选用系统承担两件业务:

  1. 把进来的U猎豹CS六L映射随处理的Controllers/Actions上
  2. 帮着营造能够在后来用来回调Controllers/Actions的出口到客户端的UHavalL(例如,表单提交,
    <a href=””>链接, 和 AJAX 调用等等)

U牧马人L路径选拔系统有无数帮衬方法和类,方便你在运维时动态查看和塑造URAV四L(你也得以一贯对RouteTable的Route集合举行操作来查阅U翼虎L)。

Html.ActionLink

在本博客连串的率先有个别,笔者大致地切磋了Html.ActionLink()视图支持方法。它能够在视图里使用,允许你动态地转移
<a href=””>
超链接。相比酷的是,它能够应用MVC路径选用系统里定义的UQashqaiL映射规则来生成这么些U卡宴L。例如,上面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参数映射成U本田UR-VL的1有些(也留意,第二个调用省略了page参数值,因为它通晓服务器端会自动提供暗许值)。

Url.Action

除去行使Html.ActionLink外,ASP.NET
MVC还有个Url.Action()视图支持方法。该方法生成原生的字符串ULX570L,然后您可以别的措施来采用它们。例如,上边包车型地铁代码片段:

图片 35

会使用ULANDL路径采用系统重临上面那一个原生的UCRUISERL(而不是包装在 <a
href=””> 成分里):

图片 36

Controller.RedirectToAction

ASP.NET
MVC还提供了Controller.RedirectToAction()支持方法,你能够在控制器里应用来开展转账操作(USportageL是选用U哈弗L路径选取系统总括出来的)。

比如,当在控制器里调用上面代码时:

图片 37 

在里面,它会转变三个对Response.Redirect(“/Search/Beverages”)的调用。

DLX570Y (别重复本身)

上述全体的推推搡搡方法的益处在于它们允许咱们幸免在咱们的控制器和视图逻辑中硬写U大切诺基L。假使在后来大家决定改变查询USportageL路径映射规则,从”/Search/[query]/[page]”
改回到 “/Search/Results/[query]/[page]” 或者
“/Search/Results?query=[query]&page=[page]”
,我们要是在1个地点(大家的门道注册代码中)做编辑,就足以轻松消除。大家不需求转移视图或控制器中的任何代码,就足以捡起新的U凯雷德L(那就坚贞不屈了“DRY原则”)。

成功ProductsController类的落到实处

基于MVC的行使中的控制器类负责处理到来的央浼,处理用户输入和相互,并且依据那些输入和互动执行适当的应用逻辑(获取和翻新储存在数据库中的模型数据等等)。

控制器1般不对请求生成特定的HTML响应。生成HTML响应的职务是为使用中的“视图”组件所怀有,这么些视图是透过单独于控制器的独门的类或模板实现的。视图的目标是完全尊重于封装表现层的逻辑,不应该包涵其余应用逻辑或数据库数据获得的代码的(全体的应用逻辑应当为Controller来处理)。

在多少个优秀的MVC
web流程中,控制器action方法负责处理进来的web请求,使用传入的参数值执行适当的应用逻辑代码,从数据库中收获或更新数据模型对象,然后选用使用3个“视图”来展现再次回到给浏览器的界面响应。作为选项妥帖的视图来呈现的一某些,控制器会显著地以参数的花样向“视图”传入视图所需的具备的数额和变量,以使后者显示适当的响应:

图片 38

您或然在想,象那样分开Controller和View有哪些利益呢?为啥不把它们放在同多个类里呢?象那样分割应用的重要思想在于支持您升高应用/数据逻辑与你的界面生成代码间的分开。那足以在隔开分离你的界面展现逻辑的景色下,非常大地点便你单元测试你的选用/数据逻辑。它还推进使得你的使用越来越好保护,因为它妨碍了您下意识中把施用/数据逻辑加到你的视图模板里的恐怕。

在落到实处大家ProductsController类的多个控制器action方法时,大家将依据进来的U卡宴L参数值从数据库中拿走适当的模子对象,然后选拔1个“视图”组件来突显适当的HTML响应。大家将应用Controller基类的多个RenderView()
方法来钦定我们想要使用的视图,以及强烈地把我们要视图在浮现响应时选用的特定数据传入该情势。

上边是咱们的ProductsController完毕的末尾结果:

图片 39

专注,我们的action方法的代码行数目非常小(各种方法唯有2行),部分原因是因为UBMWX五L参数分析逻辑完全是由MVC框架为我们做的(给大家省了广大行代码),还有一对缘故是因为产品浏览场景从事情逻辑的角度来说万分简单(涉及的action方法都以只读的显示场景)。

但看来,你时不时会发觉你有的都以些有时被叫作“瘦控制器”的事物,即控制器方法充满了①对第一批简化汉字单的action方法(少于十行代码)。这平常是好的征象,申明你可怜干净地卷入了你的数量逻辑,也非凡好地分隔了您的控制器逻辑。

 

行使Lambda表达式从路径采用系统营造输出的USportageL

前边的URubiconL协助方法例子使用了VS
二〇〇八中VB和C#现行反革命支撑的新的匿名类型。在上边的事例中,我们使用了匿名类型来有效地流传一串名称/数值对,用以辅助映射UHummerH二L(你能够把那想像为扭转字典的二个相比较彻底的秘籍)。

而外行使匿名类型以动态格局传送参数外, ASP.NET
MVC框架还协助使用强类型机制创设action路径的力量,那些强类型机制为U凯雷德L帮助方法提供了编译时检查和intellisense。那是透过选取泛型和新的VB和C#对Lambda表明式的支撑来贯彻的。

诸如,上边那几个匿名类型 ActionLink 调用:

图片 40

也足以写成:

图片 41

除去写起来大致外,那第一个接纳还有项目安全的裨益,那代表你拿走对表达式的编写翻译时检查以及Visual
Studio的代码intellisense(你还是可以利用重构工具对它实行重构):

图片 42

小心上面,我们是怎样行使intellisense挑选出大家想用的SearchController的Action方法的,以及参数是强类型的。生成的U奥迪Q三L都是由ASP.NET
MVC U本田CR-VL路经选拔系统驱动的。

您大概在想,那毕竟是怎么回事呢?假诺您还记得,6个月前,我在博客里切磋Lambda表达式时,小编谈起了兰姆da表明式既能够编译出成代码代理(delegate),也得以编写翻译成表明式树对象,然后在运行时得以用来分析Lambda表达式。对于Html.ActionLink<T>
帮助方法,大家采纳这一个表达式树选项,然后在运维时解析对应的lambda,查出它调用的action方法以及相关的参数类型,在表达式中钦赐的名目和值等。然后我们能够在MVC
U奇骏L路径采用系统中接纳那个新闻, 重临合适的UBMWX五L和相关联的HTML。

器重注意事项:
当使用那Lambda表明式方法时,我们实际未有运维对应的Controller
action方法。例如,上面包车型客车代码并不调用大家的SearchController中”Results”
action方法:

图片 43

实质上,它只是回来那么些HTML超链接:

图片 44

若果这几个超链接被用户点击的话,它会向服务器发回二个请求,该请求会调用SearchController的Results
action方法。

单元测试ProductsController

您或然会倍感愕然,我们要做的下一步依旧是测试大家的应用逻辑和法力。你恐怕会问,那怎么或许啊?大家还并未完成大家的视图呢,大家的行使目前并不显得三个HTML
tag。其实呢,使得MVC方法有魔力的一些原因便是大家能够完全部独用立于视图/Html生成逻辑来测试Controller和Model
逻辑。在上边你将见到,大家依旧足以在开创视图前单元测试那么些指标。

为单元测试大家在编写的ProductsController类,大家将往测试项目里加1个ProductsControllerTest类,这一个测试项目是在大家选择Visual
Studio创立大家的ASP.NET MVC应用时,暗中认可添加到大家的消除方案里的:

图片 45

接下来大家将定义多个粗略的单元测试,测试我们的ProductsController的 Detail
action方法:

图片 46

ASP.NET MVC
框架是特地设计来促成轻松的单元测试的。框架中的全体的中坚API和契约都是接口,提供了大气的壮大点以造成轻松的靶子注入和定制(包罗使用象温泽,
StructureMap, Spring.NET,
和ObjectBuilder那样的IOC容器的能力)。开发职员将能够利用内置的mock类,或然利用任何.NET
类型mock框架来效仿他们协调的MVC相关对象的测试版本。

在上头的单元测试中,你可以看出贰个事例,大家是何等在调用 Detail() action
方法此前,往我们的ProductsController里注入了1个伪(dummy)“ViewFactory”完结的。这么做的话,大家就覆盖了暗许的ViewFactory,不然的话,暗许的ViewFactory会创造和显示大家的视图。大家得以选择那几个测试ViewFactory达成来做隔绝,只对咱们ProductController的Detail
action的作为开始展览测试(而不用调用实际的视图来做测试)。注意大家是如何在Detail()
action方法被调用之后,使用了多个 Assert
语句来核实该方法的没有错的一举一动的确爆发了(具体地说,该措施获得了不错的Product对象,然后将它传给了适宜的视图)。

因为大家得以mock和模拟MVC框架中的任何对象(包涵 IHttpRequest 和
IHttpResponse
对象),你不要再在web服务的条件里运营单元测试,我们能够在例行的类Curry创造大家的ProductsController对象,然后对它一向测试。那能够很大地加速单元测试的运维速度,以及简化对它们的配备和平运动作。

如若大家运用 Visual Studio 二零零六IDE,大家还是能够随意地跟踪我们运维测试的结果(那一个效果今后曾经成为VS 贰零零八专业版的壹有的):

图片 47

本人想你会发觉ASP.NET MVC
框架相当的大地方便了测试的编纂,而且导致了那五个好的TDD流程。

当用户点击某叁个实际产品,将会进去选拔产品的详细消息呈现页面/Products/Detail/ProductID。

单元测试路径

ASP.NET MVC框架的五个基本设计规范是有助于很好的测试辅助。
跟MVC框架的任何一些同样,你能够轻松地单元测试路径和途径相称规则。MVC路径选用系统能够单独于ASP.NET生成实例和平运动转,那象征你能够在此外单元测试Curry装载和单元测试路径形式(而不用运营web服务器),能够选拔任何单元测试框架(NUnit,
MBUnit, MSTest等等)。

即使你可以在您的单元测试中平素单元测试三个ASP.NET
MVC应用的全局RouteTable映射集合,但貌似的话,让单元测试改变依然信赖于二个大局的事态不是二个很好的呼声。贰个您能够应用的较好的格局是,把你的门径注册逻辑放在多少个象下边那样的RegisterRoutes()支持方法中,对作为参数字传送入的RouteCollection进行操作(注:大家恐怕会把那一个格局在下个预览版更新中做成默许的VS模板格局):

图片 48

然后,你能够编写制定单元测试,创设自个儿的RouteCollection实例,调用Application的RegisterRoutes协理方法,在内部注册应用的路径选拔规则。然后,你可以向利用发出模拟请求,核实那么些请求确有注册了的科学的控制器和action方法,而不用担心其余副效率:

图片 49

使用视图突显界面

咱俩达成了大家电子商务应用的产品浏览部分的运用+数据逻辑的兑现和测试,以后大家须要完毕相关的HTML界面。

图片 50

咱俩将由此落实“视图”来促成,那些视图将动用大家ProductsController的action方法在调用RenderView()
方法时提供的跟视图有关的数量对象,来突显适当的界面:

图片 51

在上头的代码例子里,RenderView方法的“Categories”参数表示我们要来得的视图名称,第1个参数是大家要传给视图对象并要视图对象据此展现适当HTML界面的分类指标的列表。

ASP.NET MVC框架补助采纳其余模板引擎(包涵象NVelocity,
Brail,以及你协调想要编写的别的模板引擎)来接济生成界面。在暗许境况下,
ASP.NET MVC 框架使用ASP.NET中存活的ASP.NET 页面 (.aspx), 母版页
(.master), 和用户控件 (.ascx) 。

我们将选用内置的ASP.NET 视图引擎来兑现我们的电子商务应用的界面。

 

结语

梦想那些贴子提供了有关ASP.NET
MVC路径选择架构工作原理的壹部分细节,以及你如何能够采用它来定制公布在您的ASP.NET
MVC应用中的U牧马人L的结构和布局。

在默许境况下,在您创制三个新的ASP.NET MVC
Web应用时,它会事先定义二个您能够采纳的默许的
/[controller]/[action]/[id]
路径选取规则,而无需手工业配置或启用什么。那应当允许你不用登记你协调的自定义路径接纳规则,就足以建造许多用到。但希望下面的内容示范了,假使您想对您自个儿的UPRADOL格式做自定义结构来说,做起来并简单,
MVC框架对此提供了成千上万的成效和灵活性。

意在本文对你富有帮忙,

Scott

 

 

【译注】 route: n. 航线,路线 vt. 按路线发送                            
routing: 路由选用,途径接纳

定义Site.Master文件

因为我们即将在网站上构筑很多页面,大家先来定义多个母版页,用以封装整个网址公用的HTML布局/样式。大家将在大家项目标\Views\Shared
目录里创制一个名字为“Site.Master”的文本:

图片 52

作者们得以引用二个表面包车型客车CSS样式文件来封装整个网址的享有样式,然后利用母版页来定义网址总的布局,以及钦赐大家要切实可行页面填写相关内容的剧情placeholder
区域。在做的时候,大家也得以使用VS 二零一零中的新设计器的有所的酷功效,包含HTML分割视图设计器编著CSS嵌套母版页帮忙等。

图片 53

图片 54

明白/Views目录结构

在默许情状下,当你选取Visual Studio创造新的ASP.NET MVC
项目时,它会在“Views”根目录下生成二个“Shared”子目录。那是存放在应用中为多少个控制器所共享的母版页,用户控件和视图的引荐应用的地址。

在修建为一定个别控制器所用的视图时,暗中同意的 ASP.NET MVC
约定是,把它们存放在\Views
根目录的子目录里。在暗中同意情况下,子目录的名字应该相应于控制器的名字。譬如,因为我们正编写制定的Controller类叫“ProductsController”,在私下认可情况下,大家将在\Views\Products
子目录里存放跟它相关的一定视图:

图片 55

当大家在2个特定的Controller中调用 RenderView(string
viewName)方法时,MVC框架会自行地首先在\Views\ControllerName
目录里找找对应的.aspx 或
.ascx视图模板,借使它找不到卓越的视图模板,然后它会在
\Views\Shared目录寻找。

 

创建3个Categories视图

咱俩得以在 Visual Studio 中 Products
目录上选择“添加新项”菜单选项,然后选拔“MVC视图网页”项模板,为大家的ProductsController
创设二个“Categories”视图。那会变动三个新的.aspx
页面,大家可以将它跟大家的
Site.Master母版页相关联,来获取总的外观(就象母版页一样,你会收获即见即所得设计器的支撑):

图片 56

在动用MVC情势建造应用时,你要把您的视图代码尽恐怕地涵养简洁,确认视图代码纯粹是用来体现界面。应用和数量得到逻辑应该只在Controller类里编写。然后Controller类就足以在调用RenderView
方法时选用把所需的多寡对象传递给视图。譬如,在底下,大家的ProductsController类的
Categories action方法中,我们把
四个Category对象的List集合传给了Categories视图:

图片 57

MVC视图页暗中认可是从System.Web.Mvc.ViewPage
基类继承而来的,该基类提供了可为我们营造界面时所用的多多特定于MVC的援救方法和性质。ViewPage的中间一个属性名称叫“ViewData”,通过它,你能够访问Controller作为参数字传送给
RenderView()方法的特定于视图的数量对象。

从您的视图里,你可以前期绑定或以强类型的章程访问“ViewData”。假使你的视图是从ViewPage继承而来,那么ViewData属性是个早先时期绑定的字典。如若您的视图是从基于泛型的ViewPage<T>继承而来,当中T表示Controller传给视图的ViewData的数据对象的体系,那么ViewData属性正是强类型的,相配你的Controller传入的数指标系列。

例如,如下所示的小编的Categories视图的后台类是从ViewPage<T>继承而来,笔者指明T为Category对象的七个List

图片 58

那意味着在自身的视图代码里操作ProductsController.Categories()
提供的List<Category> ViewData时,笔者将获得完整的品种安全,
intellisense和编写翻译时检查:

图片 59

我们要采纳ASP.net MVC 框架实现上述意义。那让大家得以清楚划分应用程序的例外组件,并使单元测试和测试驱动开发模型更便于被并入。

显示Categories视图:

要是您还记得本帖子最前头的截图的话,我们要在大家的 Categories
视图里展现产品分类列表:

图片 60

小编能够在自己的Categories视图达成里用二种办法编写那么些HTML界素不相识成代码:一)
在.aspx 文件里使用行内代码, 或然 二) 在.aspx
文件中使用服务器控件,然后在后台代码里使用数据绑定。

 

展现格局1:使用行内代码

当前的ASP.NET网页, 用户控件和母版页支持使用 <% %> 和 <%=
%>的句法来在html 标识内停放突显代码。我们能够在Categories
视图里接纳那些技能,轻松地编写多少个foreach循环,来生成HTML分类列表:

图片 61

VS
二零零六在源码编辑器内为VB和C#提供全部的代码intellisense。这表示,在对传播视图的Category模型对象操作时,大家将取得intellisense:

图片 62

VS
二〇一〇还为行内代码提供了总体的调节和测试器协理(允许我们在调节和测试器对视图中的代码设置断点以及动态检查任何事物):

图片 63

始建3个新的ASP.net MVC
应用程序

浮现形式二:使用服务器端控件

 

ASP.NET网页,用户控件和母版页还提供对接纳注解式服务器端控件封装HTML界面生成的支撑。不是象上边那样采纳行内代码,我们能够使用
.NET 3.5中新的<asp:listview>
控件
来生成列表界面:

图片 64

注意上面 ListView
控件封装了浮现实价值列表的情事,还负责处理列表中尚无别的事物的事态(<EmptyDataTemplate>省略了特殊供给在标识中编辑
if/else
语句的艰难)。然后大家得以象上边那样,在后台代码里,将大家的分类指标绑定到listview控件上:

图片 65

重要注意事项:在MVC世界里,大家只想要把显示代码放在大家视图的后台代码里,不包涵此外利用或数额逻辑。注意上面大家唯有把强类型的Category对象的ViewData集合赋值给ListView控件的逻辑。大家的ProductsController控制器类才是实际上从数据库获取Category对象列表的总管事人,不是视图。

我们视图模板的ListView服务器端控件版本然后就会转移跟下面行内代码版本完全相同的HTML。因为我们在页面里未有<form
runat=”server”>控件,ViewState,ID值以及别的的标识都不会变动,唯有纯粹的CSS友好的HTML:

图片 66 

 

Html.ActionLink方法

您或许注意到的一件业务是,在地点视图代码片断中央银行内代码以及劳动器端控件四个本子中对多个Html.ActionLink
方法的调用:

图片 67

Html对象是 ViewPage
基类的3个救助属性,ActionLink方法是它的三个协理方法,它有利于你动态地生成连回到控制器的action
方法的HTML超链接。借使您看一下下面生成的HTML输出图,你能够见到有个别由该办法生成的某些HTML输出例子:

<a
href=”http://weblogs.asp.net/Products/List/Beverages"&gt;Beverages&lt;/a&gt;

作者动用的Html.ActionLink方法的署名是如此的:

string ActionLink(string text, object values);

率先个参数表示要显得的超链接的内容(譬如<a>那里是文字</a>),第3个参数是个匿名对象,它表示用以生成实际UBMWX伍L的一串值,你可以认为它是变更字典的三个相比较根本的法子。笔者会在以后探讨U陆风X8L
routing引擎的博客帖子里仔细钻探那几个参数的选取气象。但总结,你能够运用U奥迪Q5L
routing系统既处理进来的U猎豹CS陆L,也得以用它来生成你能够在回去的HTML输出的URL。假若大家的routing规则是象这样的:

/<controller>/<action>/<category>

那么在ProductController的Category视图里编写那样的代码时:

<%= Html.ActionLink(“Click Me to See Beverages”, new {
action=”List”, category=”Beverages” } %>

ActionLink方法就会使用你选取的U帕杰罗L映射规则,换进你的参数,生成那样的出口:

<a href=”http://weblogs.asp.net/Products/List/Beverages"&gt;Click
Me to See Beverages</a>

那便于了在你使用中生成U中华VL和到您的控制器的AJAX回调。它也代表你能够在二个地点更新您的UPAJEROL
routing规则,你全数应用中的代码会在对进入的UQX56L的拍卖和外出的UBMWX三L的变迁进程中自行选拔新的扭转。

根本注意事项
为狠抓可测试性,方今的MVC框架并不协助你视图中针对服务器端控件的postback事件,取而代之的是,ASP.NET
MVC应用生成超链接和对控制器action的AJAX回调,然后只利用视图(以及在那之中的别的劳动器端控件)显示输出。那有助于确定保证您的视图逻辑保持在最小限度,只讲究于展现,以及你能够单元测试你的Controller类,独立于你的视图,核实全部的选取和数码逻辑行为。笔者在以往的帖子里会对此做越来越尖锐的议论。

涵盖Visual Studio项目模板的ASP.net MVCFramework使创办web应用程序变得特别方便人民群众。选拔“文件”->“新建项目”菜单项,并点击“ASP.net MVC Web Application”模板创设3个新的Web应用程序。

结语

这第1个贴子十分短,但期待它对新的ASP.NET
MVC框架中拥有分裂的零部件是如何结合在同步的,如何行使它制作常见的现实世界场景的运用提供了二个一定广阔的综览。
ASP.NET
MVC的首先个公开预览版将在多少个礼拜内表露,你将能够使用它来做作者上边描述的万事。

就算很多MVC固有的定义(尤其是关切分离的古板)对该贴子的重重读者来说是比较新的,但愿意本贴子体现了大家正在开发的ASP.NET
MVC完结是怎么很干净地嵌合到存活的ASP.NET, .NET, 和 Visual
Studio框架中的。你能够使用.ASPX, .ASCX 和 .MASTELacrosse文件以及ASP.NET
AJAX创制你的ASP.NET MVC 视图。明日ASP.NET中的非界面功用,譬如表单认证,
Windows认证, 成员,剧中人物, Url授权, 缓存, Session 状态, 用户音信,健康监测,
配置,编写翻译,本地化以及 HttpModules/HttpHandlers 都以一点一滴帮忙MVC模型的。

假若您不喜欢MVC模型,只怕发现它对你的费用风格来说并不自然的话,你完全不必强用它的。它完全只是提供选项,并不代表现有的 WebForms Page Controller
模型。WebForms和MVC那二个模型在后头都会获取完全扶助和改革。假若你想的话,你依旧足以建造三个用到,部分使用WebForms编写,部分使用MVC编写。

若果您欣赏下边贴子里的东西的话(也许感兴趣想进一步询问的话),留意一下笔者这段日子的博客。笔者将尤其研商MVC概念,使用它们来更是修建大家的电子商务应用,彰显更加多的MVC性情。

仰望本文对你拥有补助,

Scott

标签:
ASP.NET,
Visual
Studio
,
.NET,
Community
News
,
MVC

 

当你用该选拔创设项目时, Visual Studio默许创设多个消除方案并向个中添加八个档次,第多少个档次是达成应用程序的Web应用程序,另二个是用于针对web应用程序编写单元测试的测试项目。

 

图片 68

 

在ASP.net MVC框架中您能够使用其余一种单元测试框架(包涵Nunit, MBUnit, MSTest, Xunit等等)。VS2010专业版内置了对MSTest测试项目(在原先的VS200五本子中需求设置Visual Studio Team System SKU)的援助,同时ASP.net MVC框架在VS2010中自行创制了那一个类型。

 

咱俩会陆续提供适用于Nunit, MBUnit和其它单元测试框架的ASP.net MVC项目模板下载,由此壹旦您偏向于选拔上述这么些单元测试工具,你依然能够通过那种简易的方法创建须要的应用程序以及对应的单元测试项目。

 

清楚项目标目录结构

 

ASP.net MVC 应用程序暗中认可有三个父级目录

  • /Controllers
  • /Models
  • /Views

正如您所想像的那么,大家提出你将控制类放在/Conrollers目录中,数据实体类放在/Model文件夹中,视图模板放在/Views文件夹中。

 

就算ASP.net MVC框架并不曾强制供给你选择那种文件结构,可是唯有您有更加好的说辞去行使其余的文件组织模式,我们照例推荐你用那种私下认可情势协会你的应用程序。

 

将UPAJEROL地址映射到控制类

 

在大多数Web框架中(ASP, PHP, JSP, ASP.net Form等等)U瑞虎L地址经常映射到磁盘上实际的情理文件,例如,对于路径“/Products.aspx”或“/Products.php”平常在磁盘上都有三个Products.aspx或Products.php文件与之相呼应。当1个针对Web应用程序的http请求发送到服务器时,web框架将请求的处理权交由请求的文件,常常那一个文件通过利用HTML标记来变化发送到客户端的答应内容。

 

MVC框架使用另一种不一致的章程将U翼虎L路径间接照射到服务器端的代码,也正是将UKoleosL直接照射到类而不是炫耀到大体文件。那一个被影射到的类被称作“控制类”,他们能够处理服务器请求,处理用户输入和与用户进行互动,执行应用逻辑和数目逻辑等。控制类将会调用2个独立的“视图”组件来发生针对请求的HTML输出。

 

图片 69

 

ASP.net MVC框架包涵了一个有力的U大切诺基L映射引擎,能够拍卖三种繁杂的URL到控制类的涉嫌映射。你能够轻松的设置映射规则,使ASP.net遵守这么些规则解析UPRADOL路径并调用相应的控制类,也能够行使U奥迪Q7L映射引擎自动解析U路虎极光L路径中的变量并将它们当做参数字传送递给控制类。笔者将在那一个种类的三番五次作品中详细介绍U汉兰达L映射引擎的高档应用。

 

ASP.NET MVC
UGL450L到控制类的暗许映射

 

ASP.net MVC项目预置了一名目繁多U帕杰罗L映射规则让用户不须求展开任何配置就足以开始开发应用程序,当然你也能够根据Visual Studio的ASP.NET
MVC 项目模板提供的的Global.asax文件中定义的应用程序类中宣称的壹多级私下认可U奇骏L名称映射规范开始展览支付。

 

暗中同意的命名规范是将多少个HTTP请求的U景逸SUVL的起头路径部分(例如:/Products)映射到三个颇具UrlPathController名称的类(例如:1个由/Products/开首的U奇骏L路径,将被映射到ProductsController类中)。

 

大家在项目中树立三个“ProductsController”类来贯彻电子商务的制品浏览功用(你能够点击Visual Studio中的“添加新品类”菜单项,依照模板创立一个控制类)。

 

图片 70

 

我们的ProductsController类从System.Web.MVC.Controller基类中持续而来,但控制类并非必须继承自该积累,只是该基类中涵盖了累累我们后边要用到的洋洋得力的声援方法和效劳。

 

图片 71

 

当大家在品种中开创了ProductsController类之后,ASP.NET MVC框架暗中同意便将有着“/Products”引导的U奥迪Q叁L请求交因此类处理,那将象征在处理诸如”/Products/Categories”, “/Products/List/Beverages”,或”/Products/Detail/3″那么些大家在后头将要提到前端选用时都将调用这么些控制类举办拍卖。

 

在下壹篇文章里,大家就要继续添加ShoppingCartController(用于管理用户的购物车)和AccountController(用于管理用户的账号和登录注销操作)八个控制类,同样以”/ShoppingCart/”和”Account”开始的UCR-VL请求也将各自由那五个类举行拍卖。

 

提醒:ASP.net MVC 框架并不需求你一定遵照这些命名样式,大家就此如此做是因为在Visual Studio中开创ASP.net MVC项目时,该暗许的UBMWX叁L映射规则被电动添加到了类别的应用程序类中。如若你觉得那种规则并不创立,你能够打开应用程序类文件(Global.asax文件)修改规则。在背后的篇章里笔者将介绍那以操作(同时小编会议及展览示壹些UHummerH二L引擎提供的强大功效)。

 

知晓控制方式

 

在创立ProductController类之后我们得以起来添加处理”/Products/”请求的逻辑了。

 

在篇章开首部分概念电子商务的前端用例时,作者曾提到大家要实现的五个功用:一)浏览产品目录,二)列出某一目录的装有成品和叁)体现某1切实可行产品的详细新闻。大家即将利用下边包车型客车SEO(Search
Engine Optimize)友好路径来促成每一种功能。

 

URL 格式
行为
示例
/Products/Categories
显示所有目录
/Products/Categories
/Products/List/Category
列出某一目录的产品
/Products/List/Beverages
/Products/Detail/ProductID
显示某产品的信息
/Products/Detail/34

 

咱俩得以由此两种办法来达成ProductsController类中对三种U兰德酷路泽L的拍卖功效,在那之中一种办法是经过重写控制基类Controller中的”Execute”方法,在其冲添加if/else/switching逻辑判断传入的UENCOREL并操纵相应的处理逻辑。

 

唯独,另一种更简便易行的艺术是选择MVC框架为我们提供的放置性情:MVC框架允许我们自定义操作方法(Action Method),同时Controller基类会依据当下应用程序中配备的URubiconL映射规则自动调用相应的操作方法。

 

比如,大家得以在ProductsController类中添加下边两个控制类操作方法处理我们如今聊到的二种功用:

 

图片 72

 

项目开创时默许的ULacrosseL映射规则规定U大切诺基L中紧跟控制类名称的子路径是呼吁的控制格局名称,例如若是我们吸收1个/Products/Categories请求,路由规则将把”Categories”作为操作方法名,Categories()方法将用来拍卖该请求等等。

 

升迁:ASP.net MVC框架并不须要您早晚遵照这几个标准,假诺你选拔不相同的映射规则,你只供给开辟应用程序类并开展改动。

 

UOdysseyL的参数到控制类方法的投射

 

在控制类操作方法中有多样做客U奥迪Q5L参数的不二诀要。

 

决定基类封装了Request和Response对象以供役使,那么些目的与ASP.net中你所耳熟能详的HttpRequest/HttpResponse对象具备同等的API接口,但他们中间三个首要的区分是那一个指标今后是遵照接口的而不是抽象基类(表明:MVC框架中并且涵盖了System.Web.IhttpRequest和System.Web.IhttpResponse接口)。使用接口的长处是足以便宜对控制类实行单元测试,在背后的稿子里作者将详细阐释那点。

 

下边是以此例子介绍了小编们什么样使用Request获取查询字符串(QueryString)中的ID变量,并传递给ProductController控制类中的Detail操作方法:

 

图片 73

 

ASP.net MVC框架也支撑将UGL450L参数映射到操作方法的操作。要是你的操作方法中持有3个参数,MVC框架暗中认可查找请求数据中是或不是存在具有同样名称的相干HTTP请求变量,倘使存在,它将作为函数参数自动传递给操作方法。

 

比如说,利用那种性子,我们得以遵守上边更简明的主意完结Detail方法:

 

图片 74

 

除此而外从呼吁的查询字符串和Form变量中落到实处参数值映射,ASP.net MVC框架同样通过 U汉兰达L映射规则将参数值集成在U奥迪Q3L中(例如:使用/Products/Detail/三代替/Products/Detail?id=3)

 

MVC 项指标暗中认可U牧马人L映射规则是”/[controller]/[action]/[id]”,那注解在U汉兰达L子路径中决定类名称(Controller)和动作方法名称(action)之后的有个别将被电动作为艺术参数字传送入控制类操作方法。

 

那评释大家能够从路径(例如: /Products/Detail/三)中得到Detail方法的ID参数。

 

图片 75

 

运用同一的艺术,我们能够经过U悍马H2L路径向List方法传入产品目录名称参数(例如:/Products/List/Beverages)。为了提升代码的可读性,作者修改了炫耀规则,使用“Category”作为那些方法的参数而不是“id”。

 

上面是富有了总体的UCRUISERL映射和参数映射的ProductController类的兑现:

 

图片 76

 

留意上边的事例中List方法是何等从U奥德赛L中的查询字符串(querystring)获取目录参数以及可选的页码参数(大家将应用那么些参数在劳动器端完毕分页显示的逻辑代码)。

 

MVC框架中的操作方法的可选参数使用nullable类型的参数,因为List方法的页码参数是可选参数(int?代表可以为空),所以MVC框架会基于传入的URAV四L自动为参数赋值。关于nullable类型的运用请阅读自个儿的另1篇有关作品

创办数据模型对象

 

 以后大家早已完成了ProductContoller类并添加了八个操作方法处理Web请求,大家的下一步是开创别的的类用于访问数据库并赢得请求的数额。

 

在MVC中“模型(model)”是用来敬服状态的应用程序组件。在Web应用中,状态壹般在数据库中保持(例如大家得以选拔Product对象表示出品SQL数据库中Product表的数据)。

ASP.net MVC框架允许行使八种数码访问方式和框架创立和治本模型。你能够运用ADO.net DataSet/DataReader(或任何他们的悬空对象),也足以行使像Nhibernate,LLBLGen, 威尔逊O福特ExplorerMapper, LINQ to
SQL/LINQ to Entity之类的数据库实体映射工具(O昂科拉M).

在大家的电子商务示范程序中,我们即将使用.NET三.伍和VS2010中安置的LINQ to SQL O奥迪Q7M映射工具,在从此现在的篇章里本人介绍越来越多关于LINQ to SQL的文化(包蕴Part1,
Part2,
Part3
Part4)。

在VS项目中的”Model”目录上右单击选用“添加新品类”,添加二个LINQ to SQL模型。在LINQ to SQL OSportageM设计器中小编会定义三个数据对象类对应SQL Server的言传身教数据库Northwind中的种类(Categories)、产品(Products)和供应商(Suppliers)表(阅读小编LINQ to SQL种类文章的Part
询问怎么样形成该操作)。

 

图片 77

做到LINQ to SQL数据模型类后,小编将在模型文件夹Model中加上NorthwindDataContext分布类:

 

图片 78

在这些类中本身将概念1个包装了壹些LINQ说明式的救助方法,以用于从数据库中收获钦命的产品目录体系、获取钦命产品目录的有着产品和点名ProductID的成品音信。

 

图片 79

 

These helper methods will make it easy for
us to cleanly retrieve the data model objects needed from our
ProductsController class (without having to write the LINQ expressions
within the Controller class itself):

帮助方法让ProductController类中收获所急需的数据模型的代码特别整洁(不须要在控制类中编写LINQ 表达式):

 

图片 80

 

以往大家曾经创建完毕了在ProductController效用重所需求的装有数据代码和目的。

 

完了ProductController类的兑现

 

MVC应用程序中的控制类用于拍卖请求,与用户交互和实践应用逻辑(创制和换代数据库中的对象模型)。

 

控制类平常不生成HTML代码,生成HTML代码的工作由“视图(View)”组件落成,视图是与控制类相独立的类和模板。视图首要完结封装呈现逻辑,不该包括别的应用逻辑或数据库访问代码(全体的应用逻辑都应有由控制类举行拍卖)。

在MVC
Web工作流程中,控制类操作方法将拍卖Web请求,接受传入参数并推行相应的逻辑代码,依据数据库创造或取得对象模型,并精选二个“视图”用于转移对应的UI发送到浏览器。控制类将向视图传入全部需求的数码和参数用于显示数据。

 

图片 81

你大概想精晓像这么将控制类和视图分离的多少是哪些,为何不把他们位于多少个等同的类中?那样做重要的亮点是卓有功用的将应用程序和多少逻辑分离,使针对应用程序和数据逻辑的单元测试与UI显示分离,同时能够使应用程序更便于保障,因为在视图模板中不容许添加应用程序和数码逻辑。

在贯彻ProductController类中的多少个控制格局时,大家使用传入U牧马人L路径中的参数从数据库中拿走相应的指标模型,然后采取3个“视图”组件用于转移对应的HTML响应。大家接纳Contoller基类中的RenderView()方法指明大家愿意利用的视图,同时传入视图显示时所急需的数额。

 

上面是ProductsController类的最后达成:

 

图片 82

 

留意到地点的操作方法代码都很少(各个方法唯有两行)。那得益于MVC框架啊为大家提供的U安德拉L参数解析逻辑(幸免书写很多逻辑代码),同时也因为产品浏览的逻辑作用比较不难(操作方法唯有只读的来得效果)

 

你平凡会发现你的局地办法代码很短小,那标志你对数码逻辑和操纵逻辑进行了很好的包裹。

 

对ProductController实行单元测试

 

想必你会对大家下一步将要实行程序测试而倍感奇怪,你大概会问这怎么恐怕?大家还未有落到实处视图,大家的应用程序现在竟是尚未产生二个HTML标记,MVC吸引人的特色之壹正是足以在视图/HTML发生逻辑完成以前独立展开针对控制类和模型逻辑的单元测试。正像你将要在底下看看的,大家居然足以在开立视图在此以前进行单元测试。

 

为了对ProductController类进行单元测试我们在档次暗许添加的测试项目中新建了三个ProductControllerTest类:

 

图片 83

 

接下去大家要啊嘿定义三个简便的单元测试对ProductController类中的Detail函数进行测试:

 

图片 84

The ASP.NET MVC framework
has been designed specifically to enable easy unit testing.  All core
APIs and contracts within the framework are interfaces,
and extensibility points are provided to enable easy injection and
customization of objects (including the ability to use IOC containers
like Windsor, StructureMap, Spring.NET, and ObjectBuilder).  Developers
will be able to use built-in mock classes, or use any .NET type-mocking
framework to simulate their own test versions of MVC related
objects.

ASP.net MVC框架转为利于单元测试而规划。框架中拥有的为主API和协和式飞机都以基于接口的

In the unit test above,
you can see an example of how we are injecting a dummy “ViewFactory”
implementation on our ProductsController class before calling the
Detail() action method.  By doing this we are overriding the default
ViewFactory that would otherwise handle creating and rendering our
View.  We can use this test ViewFactory implementation to isolate the
testing of just our ProductController’s Detail action behavior (and not
have to invoke the actual View to-do this).  Notice how we can then use
the three Assert statements after the Detail() action method is called
to verify that the correct behavior occurred within it (specifically
that the action retrieved the correct Product object and then passed it
to the appropriate View).

在上头的单元测试中,你能够观察我们是什么在调用个ProductsController类的Detail()方法前对“视图工厂(ViewFactory)”的。通过那种措施我们重写了就要处理创立和发生视图的视图工厂。我们得以选拔这几个视图工厂的

 

因为在MVC框架中哦大家可以效仿各样对象(包含IhttpRequest和IhttpResponse对象),你不供给在Web Server的条件中展开单元测试,取而代之的是我们能够将ProductController类创立在一个常备的类库项目中并对他展开测试,这能够使得进步单元测试的履行功用,同时简化了其布局和平运动转进程。

 

只要大家接纳Visual Studio 二〇一〇,我们能够轻松的跟踪测试运维的功成名就/失利状态(该意义已经被集成入VS2009规范版中)。

 

图片 85

 

本人想你会发现ASP.net MVC框架式的编排测试尤其便于,同时更好地辅助了TDD开发流程。

 

用视图产生UI

 

我们已经实现并测试了该电子商务程序中产品浏览部分的利用和数据逻辑,未来大家必要贯彻他的HTML UI界面。

 

图片 86

 

咱俩将促成当RenderView()方法时被调用是,视图会基于数量ProductController操作方法提供的多少产生相应的界面。

 

图片 87

 

在地方的例证中,RenderView方法的”Categories”参数指明了我们期待用于显示的视图名称,第3个参数是3个目录类的联谊,我们将在视图中依据该集合数据发生相应的HTML界面。

 

ASP.net MVC框架扶助各样模板引擎产生UI(包涵像Nvelocity, Brail以及自定义的模版引擎),ASP.net MVC框架默许使用ASP.net已经帮忙的ASPX, MASTE昂Cora和ASCX。

 

咱俩将选择ASP.net内置的视图引擎爆发我们的电子商务程序界面。

 

定义Site.Master文件

 

因为我们要为站点创制很多页面,大家将要首先为全部的UI定义一个母板页,以便封装常用的HTML布局,大家在、Views\Shared文件夹中开创3个名字为”Site.Master”的文书落到实处该意义。

 

图片 88

 

笔者们引用八个富含了站点样式的表面CSS样式表文件,并使用母板页定义站点的布局和剧情体现区域,在开发时大家可以挑选使用全数VS2010设计器中提供的强硬功用特色(包涵拆分设计视图(HTML split-view
designer)
,
CSS编辑 (CSS
Authoring)
,
和松手模板支持(Nested
Master Pages support)

 

图片 89

 

理解/Views目录结构

 

当你在Visual Studio中创建ASP.net MVC项目时,它暗中同意会在View根目录下创设3个”Shared”子目录,你能够在那里存放母板页,用户控件和在多个控件中国共产党享的视图。

当成立针对某一个控制类的视图是,ASP.net MVC暗中同意的规则是将它们创造在/Views根文件夹下,子文件夹名称暗中认可与控制类的名号相同。例如,因为我们刚创制的控制类是ProductsController,那么我们暗中认可在\Views\Products子文件夹中存放视图像和文字件。

 

图片 90

 

当大家调用某一控制类中的RenderView(string viewName)方法时,MVC框架在、Views\ControllerName文件夹中自动物检疫索对应的.aspx或.ascx视图模板文件,假设内部并未相应的视图模板,则将活动转到\Views\Share目录实行搜索。

 

始建目录视图

 

大家得以透过在Products目录中通过“添加新品类”菜单项选择”MVC View Page”选项创制ProductsController类的目录视图像和文字件。那将创造2个新的.aspx页面,大家得以设置这一个文件与Site.Master母板文件的关系使得她全数站点的如出壹辙外观:

 

图片 91

 

在行使MVC情势创建应用程序时,你应有使您的视图代码尽或者简化并完全用于发生视图,而把施用和数据逻辑在控制类中落到实处。控制类在调用RenderView方法时应向视图中传唱用于转移视图的不能缺少数据。例如,下边包车型大巴ProductController类的Categories方法中大家向视图传入1个Category集合对象:

 

图片 92

 

MVC视图页面默许集成自System.Web.Mvc.ViewPage基类,该积累定义了不少在我们营造UI进度中即将利用的扶助方法和特性,ViewPage的八天性质是ViewData,它提供对控制类从RenderView()方法中传唱的数额的走访。

 

在你的视图中你能够经过迟绑定或强类型的措施访问视图数据(ViewData)。假如你的视图继承自ViewPage类,那么ViewData属性将被设定为迟绑定(late-bound dictionary)类型。就算你的视图继承自泛型ViewPage<T>类,那么ViewData属性将被设定为与控制类传入的参数相同的花色。

 

譬如,作者上边包车型大巴目录视图后台代码继承自ViewPage<T>,同时本身指明了T是叁个目录对象的聚众:

 

图片 93

 

那标志自个儿在拜访ProductsController.Categories()方法提供的List<Category>类型的ViewData时怀有了截然的连串安全,智能感知和编译时检查的特点:

 

图片 94

 

发出目录视图

 

想必你还记得那篇文章开首有个别的截图,大家盼望在目录视图中体现全部的产品目录:

 

图片 95

 

本人有如下二种办法在目录视图的贯彻部分发生HTML代码:一)在.aspx文件中放置代码二)在.aspx页面使用服务器控件并在后台代码中落到实处绑定。

 

万事如意方式一:使用嵌入代码

 

ASP.net页,用户控件和母板页都援救<%%>和<%=%>标记在HTML标签中放到代码,我们利用那种技术在目录视图中编辑2个”foreach”循环生成HTML格式的目录列表:

 

图片 96

 

VS200玖提供了对VB和C#三种语言代码编辑器的一点一滴代码智能感知帮衬,这意味着大家在访问传入视图的目录对象是将取得智能感知的协理:

 

图片 97

 

VS二零一零1样提供了对迁入代码的调节扶助(允许大家在代码中设置断点):

 

图片 98

 

落实方式二:使用服务器控件

 

ASP.net 页面,用户控件和母板页同样支撑使用服务器控件封装HTML代码的产生,除了用地点的迁入代码,大家仍是能够利用.NET3.5中的<asp:listView>控件来发生列表界面:

 

图片 99

 

注意下面的代码中,ListView控件是什么封装发生列表值和空列表值(<EmptyDataTemplate>省去了我们编辑if/else判断逻辑)三种情景的。大家得以在后台代码中将目录列表绑定到该控件。

 

图片 100

珍视:在MVC中大家只期待在视图的后台代码中放置呈现逻辑(不包括其余其余的工作逻辑),注意上面的大婶中大家唯一的3个逻辑操作时将强类型的目录列表ViewData赋值给ListView控件。大家的ProductController控制类实际负担从数据库中获取目录列表工作而不是视图。

咱俩的视图模板中的ListView服务器控件将会发生向我们在放置代码中编辑的壹模1样的HTML标记,因为大家的页面上从不<form runat=”server”>控件,未有ViewStaes视图,ID和别的标志都将解决,唯有CSS友好的HTML代码:

 

图片 101 

 

HTML.ActionLink方法

唯恐你曾经注意到了在三种艺术的代码中都调用了Html.ActionLink方法:

 

图片 102

 

Html对象是ViewPage类及其子类的的帮扶属性,ActionLink方法用于发生链接回控制类方法的HTML代码。假使您看到了前有的的HTML输出图片,你能够看出那些办法输出的HTML代码:

<a
href=”http://weblogs.asp.net/Products/List/Beverages"&gt;Beverages&lt;/a&gt;

Html.ActionLink援助方法的原型如下:

 

string ActionLink(string text, object
values);

 

率先个参数代表一流链接中间的文字(例如<a>text goes here</a>).第3个参数是多个匿名对象(anonymous
object
)代表一文山会海用于爆发ULX570L路径的参数(你能够认为她是①种发生字典的有简要方式)。在后头介绍UKoleosL映射引擎的稿子中本人会愈来愈介绍它到底是如何工作的。回顾的将,你不光能够利用U兰德逍客L映射系统处理UHummerH二L路径同时能够生成需求的HTML代码,若是大家有如下的照射规则:

 

/<controller>/<action>/<category>

 

大家在ProductController的目录视图中编辑上边包车型客车代码:

 

<%= Html.ActionLink(“Click Me to See
Beverages”, new { action=”List”, category=”Beverages” } %>

 

ActionLink方法就要采纳应用程序的UOdysseyL映射规则将拍卖你传入的参数并发出输出:

<a
href=”http://weblogs.asp.net/Products/List/Beverages"&gt;Click Me to See
Beverages</a>

 

这使得生成到控制类的U纳瓦拉L和AJAX回调变得进一步简单,同时表示你只要修改UXC60L映射规则,就足以让应用程序中拥有拍卖U途达L请求和产生UTiguanL路径的代码发生相应的更动。

 

重大提示:为了增长可测试性,明天的MVC框架不协理视图中央控制件的直接回送事件,取而代之的,ASP.net MVC应用程序发生到控制类的一级链接和AJAX回调,然后利用视图(以及中间的任何服务器控件)产生输出。那是的你的视图逻辑更是简洁并留意于决定呈现,是选拔和数量逻辑与视图分离,你可以更利于的对控制类实行单元测试。前面作者将会做详细的介绍。

 

总结

 

先是篇作品十分短,目的在于对ASP.net MVC框架中各部分之间的涉及有三个大致的叙说,以及哪些运用它创制一个更为宽广并与实际世界相契合的采纳场景,ASP.net MVC第叁个预览版本将在几周后发布,你将得以应用他尝试本身上边提到的操作。

 

MVC中的很多定义(尤其是对应用程序各部分分离的思想)或者在广大人看来是很新的,希望那篇小说同时也足以显得大家直接在切磋的ASP.net MVC是何等在已有些ASP.net, .NET和Visual
Studio基础上分别的。你能够使用.ASPX, . ASCX和.MASTEENCORE文件和ASP.net AJAX创设ASP.net
MVC视图。ASP.net的非UI本性例如窗体验证,Windows验证,用户权限,角色管理,URL权限设置,缓存,Session, Profile, 运行监察和控制,配置,编写翻译,区域化设置和HttpModules/HttpHanlders依旧被MVC模型支撑。

 

设若你并不喜欢MVC模型或发现他并不切合您的开销习惯,你可以选拔不接纳它,这点一滴是1个可挑选,并不会代表已部分Web页面控制模型,WebForms和MVC都会被连续被支持和加深职能。你仍可以够成立三个并且兼有WebPage和MVC模型的应用程序。

 

若果你实在喜欢MVC并期望理解愈多的学问,请继续关怀前面包车型地铁篇章,小编会介绍越多MVC的概念并采取他们形成创制大家的电子商务应用程序以展现MVC的重重特点。

 

企望那对你拥有援助,

 

Scott