皇冠直营现金网官方网首先局地

英文原稿地址: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的2个新MVC(模型、视图,控制器)框架,大家将在不久的今后看成二个可选作用来补助。该框架提供了3个结构化的模子,来升高应用中的清晰关怀分离,方便你单元测试代码和支撑TDD流程。它还提供了对您在应用中透露的ULacrosseL的越多的支配,也足以对从中输出的HTML提供越来越多的决定。

然后,笔者回复了来自急切想询问越多详情的不在少数人的大队人马难点。鉴于如此高的趣味,小编认为,写多少个贴子更详尽地讲述怎么着运用这几个框架,大概更有意义些。那是笔者将在随后多少个星期里要创作的相关贴子的首先个。

三个简约的电子商务店面应用

自小编将动用四个大致的电子商务集团应用来示范ASP.NET
MVC框架的做事原理。在前几日的贴子里,作者将贯彻贰个产品列单,以及有关的浏览应用场景。

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

皇冠直营现金网官方网 1

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

皇冠直营现金网官方网 2

当用户点击个其他制品时,他们将转到产品细节U哈弗L
/Products/Detail/ProductID上,那一个网页将显得用户选定的制品的更多细节:

皇冠直营现金网官方网 3

咱俩将使用新的ASP.NET
MVC框架来落到实处上述的拥有机能。那将会容许我们在行使的例外组件间保险“清晰的关切分离”,允许大家更随心所欲地融为一炉单元测试和测试驱动的开销。

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

ASP.NET MVC框架包括三个Visual Studio项目模板,方便你成立新的MVC
web应用。接纳文件->新品类菜单,选用“ASP.NET MVC Web
应用”模板,用它成立三个新web应用。

在暗中认可情况下,当您选拔该选项生成二个新应用时,Visual Studio
将为您创立三个新的消除方案,然后往里面加二个品类。第3个品类是web项目,在里头你兑现您的web应用的职能。第三个门类是个测试项目,你能够在里面编写单元测试,来测试你的运用代码:

皇冠直营现金网官方网 4

您能够在ASP.NET MVC 框架中运用别的单元测试框架,包罗NUnit, MBUnit,
MSTest, XUnit以及别的的框架。VS
二〇〇九正规版现在含蓄了对MSTest的放置测试项目标支撑(VS
二零零七本子的MSTest需求您抱有Visual Studio Team
System版本才能利用),当你使用VS 二零零六时,暗中同意的ASP.NET MVC
项目模块自动生成那样的测试项目。

小编们还将通知可用以NUnit, MBUnit
和其余单元测试框架的体系模板,所以,如若你更爱好那么些框架的话,你能够轻松地一次点击即生成你的利用和能够及时使用的附和的测试项目。

明白项指标目录结构

ASP.NET MVC 应用的私下认可目录结构有七个顶层目录:

  • /Controllers
  • /Models
  • /Views

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

就算如此ASP.NET
MVC框架并不强求你总是利用那个社团,但私下认可的门类模板使用那个情势,大家也把它看做结构化应用的一种相比易于的不二法门向您推荐。除非您有好的说辞使用其它的文件布局,作者建议您使用这一个暗中同意方式。

把URL映射到Controller类

在大多数web框架(ASP, PHP, JSP, ASP.NET
WebForms等等)里,到来的U中华VL一般都映射到保存在硬盘上的沙盘文件。譬如,”/Products.aspx”可能”/Products.php”
U奥德赛L一般都在硬盘上有个照应的Products.aspx 或Products.php
模板文件来拍卖请求。当3个web应用的http请求进入web服务器时,web框架运营由硬盘上的模板文件钦赐的代码,然后那代码负责处理该请求。很多时候,那代码应用Products.aspx
或 Products.php文件中的HTML 标识来赞助生成重回客户端的响应。

MVC框架一般以差别的法门把U奥迪Q5L映射到服务器代码上。它不是将U大切诺基L映射到硬盘上的模板文件,而是径直把U锐界L映射到代码类上。这么些类称为“Controllers(控制器)”,它们承受处理到来的乞请,处理用户输入和交互,执行基于输入和互相的对应的使用和多少逻辑。然后,三个Controller类一般会调用单独的“视图”组件,该器件负责生成请求的其实的HTML输出。

皇冠直营现金网官方网 5

ASP.NET
MVC框架包涵三个老大强劲的URAV4L映射引擎,在怎么把UPRADOL映射到Controller类方面,该引擎提供了广大借风使船。你能够动用它来轻松地设置routing(路径选取,路由)规则,然后ASP.NET会基于这一个规则,对进入的U奥迪Q7L举行业评比估,选出一个Controller来运行。然后你也得以让routing引擎自动分析出你在UPAJEROL里定义的变量,让ASP.NET自动把这个变量作为参数字传送给你的Controller。小编将在那一个体系现在的1个贴子里,商量事关U牧马人L
routing引擎的比较高级的场景。

照耀到控制器类的暗中同意ASP.NET MVC UCRUISERL Routing规则

在暗中认可景况下,ASP.NET MVC项目有一套预先布署好的USportageL
routing规则,那一个规则允许你不要配置哪些,就可以轻松地上路。那样,使用一套暗许的依据名称的U福睿斯L映射约定,你就能够起先编写制定代码了,这么些约定是在Global.asax文件(由Visual
Studio中新的ASP.NET MVC项目模板生成的)中的ASP.NET
Application类中宣示的。

默许的命名约定是那样的:把进来的HTTP请求的U奥迪Q7L路径的早先部分,譬如
/Products/,映射到三个类,该类的名号遵守UrlPathController的格局,譬如在默许情状下,二个以/Products/开始的UPAJEROL
会被映射到名为ProductsController的类上。

为修建大家的电子商务产品浏览成效,咱们将在我们的品种中加2个新的“ProductsController”类
(你能够应用Visual
Studio中的“添加新项”菜单从沙盘中轻松地创制八个Controller类):

皇冠直营现金网官方网 6

作者们的ProductsController是从System.Web.MVC.Controller
基类继承而来,从那些基类继承而来并不是少不了的,但它包括一些大家之后能够应用的不胜实用的扶持方法和作用:

皇冠直营现金网官方网 7

在档次中定义这几个ProductsController类之后,在暗中同意意况下,ASP.NET MVC
框架就会利用它来处理全部来到的以”/Products/”开端的USportageL的利用请求。那象征,它会活动被调用来处理我们将在我们的网上商店应用中开启的”/Products/Categories”,
“/Products/List/Beverages”, 和 “/Products/Detail/3” 等U劲客L。

在以后的贴子里,大家还将拉长一个ShoppingCartController(以允许用户管理他们的购物车)以及
AccountController
(允许用户在网站上创造新的成员帐号,达成登录和剥离等效用)。在向大家的品类里添加那1个新的决定器类之后,以/ShoppingCart/
和 /Account/发轫的U卡宴L就会自动地导向到那个类做拍卖。

注:ASP.NET
MVC框架并不供给您总是采取这几个命名约定情势。大家的施用私下认可使用那几个情势的绝无仅有原因是因为在我们采取Visual
Studio创制新的ASP.NET
MVC项目时,有2个配备了那个情势的炫耀规则被活动地增加到了我们的ASP.NET
Application
类中。借使您不爱好这么些规则,或然想利用其余的UGL450L映射形式来对它进行定制,那么就到Global.asax中的ASP.NET
Application类中做改变。小编会在随后的四个贴子钻探该如何是好,到时自作者也会显得一些UQX56L
routing引擎允许的一部分特别酷的风貌。

知晓控制器的Action方法

既是大家曾经在项目里创设了1个ProductsController类,大家能够早先添加逻辑来处理来到应用的”/Products/”
UCR-VL了。

在本贴子的前方定义大家的电子商务店面用例时,我说过我们将在网站上贯彻2个情景:1)
浏览全体的制品分类, 2) 列出一定分类里的产品, 和 3)
突显特定产品的底细。大家将接纳下列那么些SEO友好的UCR-VL来拍卖那多个场景:

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

小编们得以用二种方式在ProductsController类中编辑代码来拍卖那三类到来的U卡宴L。一种方法是,覆盖Controller基类中的“Execute”方法,手工业编写制定大家协调的
if/else/切换逻辑,对照用户请求的U瑞虎L,然后实施适当的逻辑来处理这么些请求。

但一种不难得多的法子是,使用MVC框架中置放的成效,该成效允许大家在大家的控制器中定义“action方法”,然后由Controller基类依据大家利用使用的U奔驰M级L
routing规则来自动调用适合的action方法来执行。

比如,我们得以后大家的ProductsController类里添加如下所示的几个控制器action方法,来拍卖上述的多少个电子商务U昂科雷L场景:

皇冠直营现金网官方网 8

在项目开创时暗许配置的U奥迪Q7L
routing规则会把紧随控制器名称从此的子路径当作请求的action名称来对待。所以,借使大家接到三个/Products/Categories的U兰德酷路泽L请求,routing规则会把“Categories”作为三个action的名目来比较,Categories()
方法就会被调用来拍卖这一个请求。假诺咱们吸收接纳的是 /Products/Detail/5
UEvoqueL请求,routing规则就会把“Detail””个中action的称呼,Detail()
方法就会被调用来处理请求,等等。

注:ASP.NET
MVC框架并不必要您总是接纳那么些action命名约定形式。尽管你想使用不相同的UMuranoL映射情势,到
Global.asax文件中的ASP.NET Application类去做变更。

把U智跑L参数映射到Controller的Action方法上

在Controller类中的action方法中得以用多少个艺术访问U普拉多L中的参数值。

Controller基类展现了能够选拔的Request
和Response对象。这一个指标跟ASP.NET中您已经熟识的HttpRequest/HttpResponse对象拥有完全一样的API结构。1个那一个首要的分别是,那么些目的以往是依据接口(interface)的,而不是封闭的类。具体来说,MVC
框架将公布System.Web.IHttpRequest和System.Web.IHttpResponse接口。那几个目的是基于的接口的补益是,今后万分简单mock(模仿)它们,这样,就能够便宜对控制器类的单元测试。在后日的博客贴子里,小编将对此展开深切的议论。

上边是2个怎样在ProductsController类的Detail action方法中央银行使Request
API来手工业获取ID查询字符串值的事例:

皇冠直营现金网官方网 9

ASP.NET MVC
框架还协助自动将进入的UOdysseyL的参数值映射成action方法的参数。在默许意况下,借使您的action方法有个参数的话,MVC框架会检讨进入的呼吁的数目,看是或不是有个相同名称的对应的HTTP请求值。若是有的话,它会自行将其当作参数字传送入你的action方法。

诸如,大家得以行使那么些支撑来重写大家的Detail
action方法来,将其简化,象上面那样:

皇冠直营现金网官方网 10

而外从呼吁的询问字符串/表单集合中映射参数值外,ASP.NET
MVC框架还允许你利用MVC UEscortL
route映射基础设备在主旨UEnclaveL本人内嵌参数值(譬如,不是应用/Products/Detail?id=3,而是选用/Products/Detail/3
)。

当您创设一个新的MVC项目时,表明的暗中同意的门路映射规则有所如此的格式,“/[controller]/[皇冠直营现金网官方网,action]/[id]”。那象征,假诺U卡宴L中在控制器名称和action名称从此还有任何子路径的话,在暗许情状下,它将用作1个名为“id”的参数处理,会自动地看成三个办法参数字传送给大家的控制器action方法。

那意味大家明天得以选拔我们的Detail
方法来拍卖从UENVISIONL路径(譬如/Products/Detail/3)中取得ID参数:

皇冠直营现金网官方网 11

自笔者得以对List
action使用类似的方法,那样大家得以将分类名称作为U昂科威L的一片段传进来(譬如:/Products/List/Beverages)。为了使得代码简单阅读,作者对routing规则做了3个小改变,这样不是把参数名定为“id”,对这些action,它被称作“category”。

下边是兑现了整机U安德拉L
routing和参数映射补助的ProductsController类的1个版本:

皇冠直营现金网官方网 12

留神上边List
action方法接受三个看成UQashqaiL一部分的category参数,然后一个看成U卡宴L查询字符串一部分的可缺省的网页索引参数(大家将促成劳务器端分页,将应用该参数值来代表大家应该呈现对应分类数据的哪一页)。

作者们的MVC 框架中的可缺省的参数是透过Controller
Action方法上nullable的门类参数来处理的。因为咱们List
action的分页参数是个nullable的int,从语法上的话,就是int?
,假如那些参数存在于U奥德赛L中,MVC框架会将其值传给对应措施,假如不设有,会传来null。参阅笔者以前的关于??
null coalescing
operator帖子
以询问怎么操作象那样传入的nullable类型参数的三个使得的技能/诀窍。

建造数据模型对象

时至明日,大家有了四个ProductsController类,内含几个action方法,准备好处理进来的web请求了。下一步将是建造一些类,来帮大家操作数据库,从中得随处理这几个请求所需的适当的数目。

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

ASP.NET
MVC框架允许你为博得和治本你的模子,能够运用你想要的其他数据访问格局或框架。即使您要运用ADO.NET
DataSets/DataReaders
(也许建于它们之上的望梅止渴),你能够那么做。如若您更欣赏使用象NHibernate,
LLBLGen, 威尔逊O智跑Mapper, LINQ to SQL/LINQ to
Entities这样的对象关联映射器(OCR-VM),你也相对能够那么做。

对大家的电子商务例程,笔者想用随 .NET 3.5 和 VS 二〇〇八布告的内置LINQ to SQL
OLacrosseM 。你可以从自家的还在作品中的钻探LINQ to SQL
的博客类别
中打听当中详情,越发是肯定要读书一下里头的先是局地第2片段其三部分,和第五有的的帖子。

从右击VS中的MVC web项指标“Models”子目录开头,选取“添加新项”,加2个 LINQ
to SQL 模型。在LINQ to SQL O库罗德M
设计器中,作者将概念多个数据模型类,分别映射到SQL Server
Northwind数据库中的Categories, Products, 和Suppliers 表(阅读小编的LINQ
to SQL
种类的第壹有的
学学该怎么办):

皇冠直营现金网官方网 13

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

皇冠直营现金网官方网 14

在那些类中,小编将定义多少个帮扶方法封装一些LINQ表达式,这么些表明式是用来从数据库中获得独特的Category对象,获取钦赐分类的持有Product
对象,以及基于钦赐的ProductID获取单独的 Product对象:

皇冠直营现金网官方网 15

那些援助方法将造福大家在ProductsController类中彻底利索地获得所需的数据模型对象
(而不用在Controller类中编写LINQ表明式):

皇冠直营现金网官方网 16

迄今截止,我们就有了为成功我们的ProductsController功效所需的具备的数据代码和对象。

完了ProductsController类的完结

据书上说MVC的施用中的控制器类负责处理到来的伸手,处理用户输入和互动,并且依据那么些输入和相互执行适当的应用逻辑(获取和换代储存在数据库中的模型数据等等)。

控制器一般不对请求生成特定的HTML响应。生成HTML响应的天职是为利用中的“视图”组件所兼有,那些视图是因而独立于控制器的独自的类或模板实现的。视图的指标是全然尊重于封装表现层的逻辑,不应有包罗其余应用逻辑或数据库数据获得的代码的(全部的应用逻辑应当为Controller来处理)。

在2个特出的MVC
web流程中,控制器action方法负责处理进来的web请求,使用传入的参数值执行适当的应用逻辑代码,从数据库中获得或更新数据模型对象,然后选用采用八个“视图”来体现重回给浏览器的界面响应。作为选取适宜的视图来呈现的一部分,控制器会分明地以参数的方式向“视图”传入视图所需的富有的数据和变量,以使后者展现适当的响应:

皇冠直营现金网官方网 17

您或者在想,象那样分开Controller和View有怎么着便宜呢?为何不把它们放在同二个类里呢?象那样分割应用的严重性思想在于帮忙您进步应用/数据逻辑与你的界不熟悉成代码间的分别。那足以在切断你的界面彰显逻辑的情形下,非常大地惠及你单元测试你的应用/数据逻辑。它还有助于使得你的利用更好维护,因为它妨碍了您下意识中把利用/数据逻辑加到你的视图模板里的恐怕。

在促成大家ProductsController类的八个控制器action方法时,我们将基于进来的U库罗德L参数值从数据库中收获适当的模子对象,然后选用贰个“视图”组件来呈现适当的HTML响应。大家将应用Controller基类的2个RenderView()
方法来钦赐大家想要使用的视图,以及显明地把我们要视图在显示响应时选取的一定数据传入该措施。

上面是大家的ProductsController达成的最后结出:

皇冠直营现金网官方网 18

在意,大家的action方法的代码行数目相当的小(各类方法唯有2行),部分原因是因为U奥迪Q5L参数分析逻辑完全是由MVC框架为大家做的(给大家省了好多行代码),还有一部分缘由是因为产品浏览场景从事情逻辑的角度来说相当简单(涉及的action方法都是只读的显得场景)。

但总的看,你平日会意识你有的都是些有时被喻为“瘦控制器”的事物,即控制器方法充满了一定简单的action方法(少于10行代码)。那常常是好的一望可知,表明你极度干净地卷入了您的数目逻辑,也十三分好地分隔了你的控制器逻辑。

单元测试ProductsController

你只怕会感到愕然,大家要做的下一步照旧是测试大家的应用逻辑和效益。你恐怕会问,这怎么大概吗?大家还一向不兑现大家的视图呢,大家的使用近日并不出示1个HTML
tag。其实呢,使得MVC方法有吸引力的有的原因正是大家得以完全部独用立于视图/Html生成逻辑来测试Controller和Model
逻辑。在下边你将见到,大家居然足以在创设视图前单元测试那个目的。

为单元测试大家在编写制定的ProductsController类,大家将往测试项目里加3个ProductsControllerTest类,这一个测试项目是在大家采取Visual
Studio创制大家的ASP.NET MVC应用时,暗中同意添加到大家的缓解方案里的:

皇冠直营现金网官方网 19

然后大家将定义一个简便的单元测试,测试大家的ProductsController的 Detail
action方法:

皇冠直营现金网官方网 20

ASP.NET MVC
框架是特地设计来造成轻松的单元测试的。框架中的全数的中坚API和契约都是接口,提供了汪洋的扩大点以造成轻松的靶子注入和定制(包涵选拔象温莎,
StructureMap, Spring.NET,
和ObjectBuilder那样的IOC容器的力量)。开发职员将可以使用内置的mock类,或者应用任何.NET
类型mock框架来模拟他们协调的MVC相关对象的测试版本。

在上头的单元测试中,你能够看看1个例证,我们是何等在调用 Detail() action
方法以前,往大家的ProductsController里注入了二个伪(dummy)“ViewFactory”达成的。这么做的话,大家就覆盖了私下认可的ViewFactory,不然的话,暗中同意的ViewFactory会创设和呈现大家的视图。大家得以行使这一个测试ViewFactory达成来做隔开分离,只对我们ProductController的Detail
action的表现举行测试(而毋庸调用实际的视图来做测试)。注意大家是怎么在Detail()
action方法被调用之后,使用了四个 Assert
语句来核实该措施的不错的作为确实发生了(具体地说,该格局取得了不利的Product对象,然后将它传给了适当的视图)。

因为大家能够mock和模拟MVC框架中的任何对象(包罗 IHttpRequest 和
IHttpResponse
对象),你不要再在web服务的环境里运维单元测试,大家得以在健康的类Curry创造大家的ProductsController对象,然后对它间接测试。那可以小幅度地加快单元测试的运转速度,以及简化对它们的配备和平运动作。

假定大家选取 Visual Studio 二零一零IDE,大家还足以专断地跟踪我们运营测试的结果(那一个作用以后曾经改为VS 2009专业版的一有的):

皇冠直营现金网官方网 21

自个儿想你会发觉ASP.NET MVC
框架相当大地点便了测试的编写制定,而且造成了要命好的TDD流程。

应用视图展现界面

大家成功了大家电子商务应用的出品浏览部分的运用+数据逻辑的贯彻和测试,以后大家供给贯彻相关的HTML界面。

皇冠直营现金网官方网 22

俺们将透过落到实处“视图”来促成,这个视图将应用大家ProductsController的action方法在调用RenderView()
方法时提供的跟视图有关的数码对象,来呈现适当的界面:

皇冠直营现金网官方网 23

在地点的代码例子里,RenderView方法的“Categories”参数表示大家要来得的视图名称,第3个参数是大家要传给视图对象并要视图对象据此显示适当HTML界面的归类目的的列表。

ASP.NET MVC框架辅助使用其余模板引擎(包蕴象NVelocity,
Brail,以及你本身想要编写的其余模板引擎)来救助生成界面。在私下认可情状下,
ASP.NET MVC 框架使用ASP.NET中存活的ASP.NET 页面 (.aspx), 母版页
(.master), 和用户控件 (.ascx) 。

我们将利用内置的ASP.NET 视图引擎来落到实处大家的电子商务应用的界面。

定义Site.Master文件

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

皇冠直营现金网官方网 24

小编们可以引用三个外部的CSS样式文件来封装整个网站的具有样式,然后利用母版页来定义网站总的布局,以及钦定大家要切实页面填写相关内容的始末placeholder
区域。在做的时候,我们也能够动用VS 二零一零中的新设计器的持有的酷成效,包蕴HTML分割视图设计器编著CSS嵌套母版页匡助等。

皇冠直营现金网官方网 25

掌握/Views目录结构

在暗中同意意况下,当你接纳Visual Studio成立新的ASP.NET MVC
项目时,它会在“Views”根目录下生成贰个“Shared”子目录。这是存放应用中为几个控制器所共享的母版页,用户控件和视图的推荐使用的地方。

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

皇冠直营现金网官方网 26

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

创设一个Categories视图

我们得以在 Visual Studio 中 Products
目录上接纳“添加新项”菜单选项,然后选用“MVC视图网页”项模板,为大家的ProductsController
成立三个“Categories”视图。那会转变多个新的.aspx
页面,大家得以将它跟大家的
Site.Master母版页相关联,来获得总的外观(就象母版页一样,你会拿走即见即所得设计器的支撑):

皇冠直营现金网官方网 27

在行使MVC情势建造应用时,你要把你的视图代码尽大概地保全简洁,确认视图代码纯粹是用来呈现界面。应用和多少获得逻辑应该只在Controller类里编写。然后Controller类就可以在调用RenderView
方法时精选把所需的数量对象传递给视图。譬如,在下边,大家的ProductsController类的
Categories action方法中,大家把
二个Category对象的List集合传给了Categories视图:

皇冠直营现金网官方网 28

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对象的3个List

皇冠直营现金网官方网 29

那象征在自笔者的视图代码里操作ProductsController.Categories()
提供的List<Category> ViewData时,作者将收获完全的项目安全,
intellisense和编写翻译时检查:

皇冠直营现金网官方网 30

显示Categories视图:

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

皇冠直营现金网官方网 31

自家得以在小编的Categories视图完毕里用2种艺术编写那一个HTML界面生成代码:1)
在.aspx 文件里应用行内代码, 或许 2) 在.aspx
文件中使用服务器控件,然后在后台代码里使用数据绑定。

彰显方式1:使用行内代码

当前的ASP.NET网页, 用户控件和母版页帮忙采用 <% %> 和 <%=
%>的句法来在html 标识内停放彰显代码。大家能够在Categories
视图里应用那个技能,轻松地编写2个foreach循环,来生成HTML分类列表:

皇冠直营现金网官方网 32

VS
二〇〇九在源码编辑器内为VB和C#提供完整的代码intellisense。那意味,在对传播视图的Category模型对象操作时,大家将取得intellisense:

皇冠直营现金网官方网 33

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

皇冠直营现金网官方网 34

显示格局2:使用服务器端控件

 

ASP.NET网页,用户控件和母版页还提供对选拔注明式服务器端控件封装HTML界不熟悉成的支撑。不是象上面那样选用行内代码,大家能够动用
.NET 3.5中新的<asp:listview>
控件
来生成列表界面:

皇冠直营现金网官方网 35

瞩目下边 ListView
控件封装了显示实价值列表的意况,还承担处理列表中并未任周岚西的情事(<EmptyDataTemplate>省略了亟待在标识中编辑
if/else
语句的麻烦)。然后大家得以象上边这样,在后台代码里,将大家的归类目的绑定到listview控件上:

皇冠直营现金网官方网 36

最首要注意事项:在MVC世界里,大家只想要把展现代码放在大家视图的后台代码里,不包含其它利用或数额逻辑。注意下面大家唯有把强类型的Category对象的ViewData集合赋值给ListView控件的逻辑。大家的ProductsController控制器类才是实际从数据库获取Category对象列表的承担者,不是视图。

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

皇冠直营现金网官方网 37 

Html.ActionLink方法

您大概注意到的一件事情是,在地方视图代码片断中央银行内代码以及服务器端控件七个本子中对三个Html.ActionLink
方法的调用:

皇冠直营现金网官方网 38

Html对象是 ViewPage
基类的叁个扶持属性,ActionLink方法是它的2个扶植方法,它便宜你动态地生成连回到控制器的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>),第一个参数是个匿名对象,它表示用以生成实际ULacrosseL的一串值,你能够认为它是转移字典的多少个相比彻底的方法。我会在今后商讨U揽胜L
routing引擎的博客帖子里仔细研究这么些参数的运用景况。但不难,你能够动用U安德拉L
routing系统既处理进来的UXC90L,也得以用它来生成你能够在重返的HTML输出的URAV4L。即便大家的routing规则是象那样的:

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

那就是说在ProductController的Category视图里编写那样的代码时:

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

ActionLink方法就会利用你使用的UTiggoL映射规则,换进你的参数,生成那样的输出:

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

那便于了在您使用中生成U酷路泽L和到您的控制器的AJAX回调。它也代表你能够在3个地方更新您的UHighlanderL
routing规则,你任何应用中的代码会在对进入的UPAJEROL的拍卖和外出的UCR-VL的浮动进度中机动选拔新的浮动。

要害注意事项
为加强可测试性,如今的MVC框架并不匡助您视图中针对服务器端控件的postback事件,取而代之的是,ASP.NET
MVC应用生成超链接和对控制器action的AJAX回调,然后只利用视图(以及中间的其他劳动器端控件)展现输出。那促进确认保障您的视图逻辑保持在最小限度,只讲究于展现,以及你可以单元测试你的Controller类,独立于您的视图,核实全体的应用和多少逻辑行为。作者在现在的帖子里会对此做更透彻的探讨。

结语

那首先个贴子相当短,但愿意它对新的ASP.NET
MVC框架中兼有不一致的零部件是何许构成在一块的,怎么着行使它制作常见的有血有肉世界场景的运用提供了2个至极普遍的综览。
ASP.NET
MVC的率先个精通预览版将在多少个礼拜内透露,你将能够使用它来做小编上面描述的万事。

虽说很多MVC固有的概念(特别是关怀分离的价值观)对该贴子的不在少数读者来说是相比新的,但期待本贴子显示了我们正在开发的ASP.NET
MVC达成是何等很彻底地嵌合到存活的ASP.NET, .NET, 和 Visual
Studio框架中的。你能够使用.ASPX, .ASCX 和 .MASTE索罗德文件以及ASP.NET
AJAX创制你的ASP.NET MVC 视图。明天ASP.NET中的非界面效率,譬如表单认证,
Windows认证, 成员,剧中人物, Url授权, 缓存, Session 状态, 用户消息,健康监测,
配置,编写翻译,本地化以及 HttpModules/HttpHandlers 都以全然协助MVC模型的。

一经您不喜欢MVC模型,只怕发现它对你的支付风格来说并不自然的话,你一点一滴不用强用它的。它完全只是提供选项,并不代表现有的 WebForms Page Controller
模型。WebForms和MVC那2个模型在随后都会取得完全协理和改良。倘若您想的话,你依旧足以建造一个行使,部分选拔WebForms编写,部分采取MVC编写。

假设你喜欢上边贴子里的事物的话(或许感兴趣想进一步精通的话),留意一下自作者那段日子的博客。笔者将进一步研商MVC概念,使用它们来尤其修建大家的电子商务应用,显示更加多的MVC个性。

仰望本文对你拥有协助,

Scott

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

相关文章