SQL Server[转自Scott]ASP.NET MVC框架(第一组成部分)

英文原文地址: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流程。它还提供了针对性而当利用被宣告之URL的又多之支配,也堪对从中输出的HTML提供更多之主宰。

日后,我对了来迫切想询问再多详情的好多丁之广大问题。鉴于如此大的兴,我觉着,写几只贴子更详尽地讲述如何采取此框架,也许更有意义些。这是自己将以后头几乎单礼拜里设写的连锁贴子的第一只。

一个概括的电子商务店面应用

自己用以一个简的电子商务公司应用来示范ASP.NET
MVC框架的干活原理。在今底贴子里,我以实现一个产品列单,以及有关的浏览应用场景。

具体来说,我们将建筑一个网上商店,允许用户在访问该网站及之/Products/Categories网址时
浏览产品分类列表:

SQL Server 1

当用户点击上面网页上的活分类链接时,他们用改成至一个成品分类列表URL
/Products/List/CategoryName达,该页面列出了点名分类中的还在销售的活:

SQL Server 2

当用户点击个别的出品时,他们将反至成品细节URL
/Products/Detail/ProductID直达,这个网页将展示用户选定的活的再次多细节:

SQL Server 3

咱们用运初的ASP.NET
MVC框架来落实上述的兼具机能。这将会晤同意我们在以的不同组件间保障“清晰的关心分离”,允许我们再次轻易地融为一体单元测试与测试驱动之支付。

创立一个初的ASP.NET MVC应用

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

在默认情形下,当你下该选项生成一个初用时,Visual Studio
将为你创造一个初的化解方案,然后向中间加2个类别。第一只品类是web项目,在其间你兑现您的web应用之作用。第二只品种是独测试项目,你可以以内部编写单元测试,来测试你的应用代码:

SQL Server 4

卿可以于ASP.NET MVC 框架中使外单元测试框架,包括NUnit, MBUnit,
MSTest, XUnit以及其他的框架。VS
2008正规版现在包含了对MSTest的置测试项目的支持(VS
2005本子的MSTest要求您有着Visual Studio Team
System版本才会动用),当你使用VS 2008时不时,默认的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等等)里,到来之URL一般都照到保存在硬盘上之模版文件。譬如,”/Products.aspx”或者”/Products.php”
URL一般还在硬盘上产生个照应之Products.aspx 或Products.php
模板文件来拍卖要。当一个web应用之http请求进入web服务器时,web框架运行由硬盘上之模版文件指定的代码,然后随即代码负责处理该要。很多上,这代码用Products.aspx
或 Products.php文件被的HTML 标识来增援生成返回客户端的应。

MVC框架一般坐不同的方式拿URL映射到服务器代码上。它不是以URL映射到硬盘上的模版文件,而是一直拿URL映射到代码类及。这些近似称为“Controllers(控制器)”,它们当处理到的请求,处理用户输入和相互,执行因输入和相互的对应的利用及数码逻辑。然后,一个Controller类一般会调用单独的“视图”组件,该零件负责转请求的实在的HTML输出。

SQL Server 5

ASP.NET
MVC框架包括一个老强大的URL映射引擎,在什么将URL映射到Controller类方面,该发动机提供了众世故。你可采取它们来轻松地安装routing(路径选择,路由于)规则,然后ASP.NET会基于这些规则,对上的URL进行评估,选出一个Controller来运转。然后您啊堪给routing引擎自动分析有您于URL里定义之变量,让ASP.NET自动把这些变量作为参数传给您的Controller。我以在是系列将来底一个贴子里,讨论事关URL
routing引擎的比较高级的状况。

辉映到控制器类的默认ASP.NET MVC URL Routing规则

于默认情形下,ASP.NET MVC项目有同等仿照预先布置好之URL
routing规则,这些规则允许你不用配置什么,就可以轻松地起身。这样,使用同一学默认的基于名称的URL映射约定,你尽管好开编制代码了,这些约定是以Global.asax文件(由Visual
Studio中新的ASP.NET MVC项目模板生成的)中之ASP.NET
Application类中宣示的。

默认的命名约定是这样的:把上的HTTP请求的URL路径的起来部分,譬如
/Products/,映射到一个像样,该类的称呼按UrlPathController的模式,譬如当默认情形下,一个因/Products/开头的URL
会被射到叫也ProductsController的类上。

也打我们的电子商务产品浏览功能,我们将以咱们的种类面临加以一个新的“ProductsController”类
(你可行使Visual
Studio中的“添加新项”菜单从沙盘被轻轻松松地创建一个Controller类):

SQL Server 6

咱们的ProductsController是自从System.Web.MVC.Controller
基类继承而来,从者基类继承而来并无是必要的,但她含一些咱后好利用的可怜实惠之辅助方法以及效应:

SQL Server 7

于项目被定义之ProductsController类之后,在默认情形下,ASP.NET MVC
框架就见面动用她来拍卖所有来的坐”/Products/”开头的URL的运用请求。这表示,它见面自动为调用来处理我们用于咱们的网上商店应用被启的”/Products/Categories”,
“/Products/List/Beverages”, 和 “/Products/Detail/3” 等URL。

以前之贴子里,我们还以添加一个ShoppingCartController(以允许用户管理他们的购物车)以及
AccountController
(允许用户在网站及创设新的积极分子帐号,实现登录和离等功效)。在朝我们的项目里添加这2独新的决定器类之后,以/ShoppingCart/
和 /Account/开头的URL就会见活动地导向到这些看似做处理。

横流:ASP.NET
MVC框架并无求你连利用这个命名约定模式。我们的采用默认使用此模式的唯一由是坐以咱们以Visual
Studio创建新的ASP.NET
MVC项目时,有一个安排了这个模式之投射规则为机关地丰富到了俺们的ASP.NET
Application
类中。如果你免欣赏是规则,或者想以另外的URL映射模式来针对其进行定制,那么就交Global.asax中之ASP.NET
Application类中举行改变。我会在后的一个贴子讨论该怎么开,到经常我吧会见显一些URL
routing引擎允许的局部万分好的光景。

知晓控制器的Action方法

既我们已以项目里创建了一个ProductsController类,我们可以开始上加逻辑来处理到下之”/Products/”
URL了。

在本贴子的面前定义我们的电子商务店面用例时,我说过我们将以网站上贯彻3单情景:1)
浏览所有的活分类, 2) 列出特定分类里的出品, 和 3)
显示特定产品的细节。我们以以下列这些SEO友好的URL来处理及时三独情景:

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

咱们得据此几种办法以ProductsController类中编代码来拍卖这三类似至之URL。一种方法是,覆盖Controller基类中的“Execute”方法,手工编制我们自己的
if/else/切换逻辑,对照用户要的URL,然后实施适当的逻辑来拍卖者要。

不过一样栽好得多的点子是,使用MVC框架中置放的成效,该功能允许我们当我们的控制器中定义“action方法”,然后由Controller基类根据我们应用使用的URL
routing规则来自动调用当的action方法来实施。

如,我们得以往我们的ProductsController类里补充加如下所展示之老三独控制器action方法,来拍卖上述的老三个电子商务URL场景:

SQL Server 8

每当路创建时默认配置的URL
routing规则会将不便按控制器名称后的子路径当作请求的action名称来对待。所以,如果我们接到一个/Products/Categories的URL请求,routing规则会将“Categories”作为一个action的名目来对待,Categories()
方法就会为调用来拍卖此要。如果我们接的是 /Products/Detail/5
URL请求,routing规则就会见管“Detail””当中action的称谓,Detail()
方法就见面受调用来处理要,等等。

注:ASP.NET
MVC框架并无求您总是采取是action命名约定模式。如果你想采取不同之URL映射模式,到
Global.asax文件被的ASP.NET Application类去做更改。

把URL参数映射到Controller的Action方法齐

于Controller类中的action方法吃得就此几个措施访问URL中的参数值。

Controller基类呈现了可使的Request
和Response对象。这些目标跟ASP.NET中公都深谙的HttpRequest/HttpResponse对象具备完全相同的API结构。一个异常主要之区别是,这些目标现在是因接口(interface)的,而休是查封的类。具体来说,MVC
框架将发布System.Web.IHttpRequest和System.Web.IHttpResponse接口。这些目标是依据的接口的补是,现在非常容易mock(模仿)它们,这样,就好一本万利对控制器类的单元测试。在将来的博客贴子里,我用对准这个开展深刻的讨论。

脚是一个哪些在ProductsController类的Detail action方法被采取Request
API来手工获取ID查询字符串值的例证:

SQL Server 9

ASP.NET MVC
框架还支持自动将进的URL的参数值映射成action方法的参数。在默认情形下,如果您的action方法发生只参数的言辞,MVC框架会检查进入的呼吁的数码,看是不是发生只相同名称的相应之HTTP请求值。如果有的话,它见面自行将其作为参数传入你的action方法。

比如,我们可以行使是支撑来再写我们的Detail
action方法来,将该简化,象下这样:

SQL Server 10

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

当您创造一个初的MVC项目时,声明的默认的路线映射规则有所这么的格式,“/[controller]/[action]/[id]”。这象征,如果URL中以控制器名称以及action名称后还有任何子路径的讲话,在默认情形下,它用作一个曰吧“id”的参数处理,会自动地作一个法参数传被咱的控制器action方法。

当时意味我们今天得以用我们的Detail
方法来拍卖由URL路径(譬如/Products/Detail/3)中拿走ID参数:

SQL Server 11

自己得以针对List
action使用类之方,这样咱们好拿分类名作为URL的等同有污染上(譬如:/Products/List/Beverages)。为了使得代码容易看,我本着routing规则做了一个微改变,这样不是管参数名定为“id”,对是action,它被喻为“category”。

下是实现了完整URL
routing和参数映射支持的ProductsController类的一个版:

SQL Server 12

留意点List
action方法接受一个作URL一部分底category参数,然后一个用作URL查询字符串一部分之可缺省之网页索引参数(我们用贯彻劳务器端分页,将运该参数值来表示我们理应出示对诺分类数据的哪一样页)。

咱俩的MVC 框架中的可缺省的参数是经过Controller
Action方法上nullable的类别参数来拍卖的。因为我们List
action的分页参数是个nullable的int,从语法上吧,即凡int?
,如果这参数是于URL中,MVC框架会拿其价传给相应措施,如果不存,会传出null。参阅我早先的有关??
null coalescing
operator帖子坐了解哪些操作象这样传入的nullable类型参数的一个卓有成效的技巧/诀窍。

建造数据模型对象

至此,我们有了一个
ProductsController类,内含三只action方法,准备好处理上的web请求了。下一样步将是盖一些类,来辅助我们操作数据库,从中获得处理这些请求所待的当的多寡。

在MVC世界里,“model(模型)”是负担维持状态的采取组件。在web应用被,这个状态一般还始终如一于数据库中(譬如,我们兴许有一个Product
对象,用来表示我们SQL数据库里Products表中之出品数量)。

ASP.NET
MVC框架允许你吗得到和管理而的模子,可以应用你想使的旁数看模式或者框架。如果您如果动用ADO.NET
DataSets/DataReaders
(或者构筑被它之上的悬空),你可那么开。如果你再爱好下象NHibernate,
LLBLGen, WilsonORMapper, LINQ to SQL/LINQ to
Entities这样的目标关联映射器(ORM),你吧断好那么做。

对咱们的电子商务例程,我思用本 .NET 3.5 和 VS 2008揭晓之内置LINQ to SQL
ORM 。你得自自己的还当写作中之议论LINQ to SQL
的博客系列蒙打探中详情,特别是必定要是读一下内部的先是组成部分,次组成部分,其三部分,和季部分的帖子。

从今右击VS中之MVC web项目之“Models”子目录开始,选择“添加新项”,加一个 LINQ
to SQL 模型。在LINQ to SQL ORM
设计器中,我拿定义三个数据模型类,分别映射到SQL Server
Northwind数据库被的Categories, Products, 和Suppliers 表(阅读我之LINQ
to SQL
系列的亚有的念该怎么开):

SQL Server 13

概念了LINQ to SQL
数据模型类后,然后我还拿增长一个新NorthwindDataContext部分类及我们的Models目录中:

SQL Server 14

以是类似吃,我拿概念几个帮扶方法封装一些LINQ表达式,这些表达式是因此来起数据库中获取独特之Category对象,获取指定分类的备Product
对象,以及基于指定的ProductID获取单独的 Product对象:

SQL Server 15

这些扶持方法以惠及我们以ProductsController类中根本利索地赢得所需要的数据模型对象
(而休用当Controller类中编写LINQ表达式):

SQL Server 16

由来,我们虽生出矣啊好我们的ProductsController功能所待的具有的数代码和目标。

完ProductsController类的贯彻

基于MVC的以中之控制器类负责处理到的要,处理用户输入和互,并且根据这些输入和彼此执行适当的应用逻辑(获取与翻新储存在数据库中之模子数据等等)。

控制器一般不对请求生成特定的HTML响应。生成HTML响应的天职是为使被的“视图”组件所负有,这些视图是通过独立于控制器的单身的类或模板实现之。视图的目的是了尊重于封装表现层的逻辑,不应有包含其他应用逻辑或数据库数据获得的代码的(所有的应用逻辑应当也Controller来处理)。

于一个榜首的MVC
web流程中,控制器action方法负责处理上的web请求,使用传入的参数值执行适当的应用逻辑代码,从数据库中获得或更新数据模型对象,然后选择用一个“视图”来展示返回给浏览器的界面响应。作为选项适宜的视图来展示的如出一辙局部,控制器会明确地盖参数的样式为“视图”传入视图所需要的有的数据以及变量,以使后人显示适当的响应:

SQL Server 17

您可能在思念,象这样分开Controller和View有啊补吗?为什么不将它在和一个类里呢?象这样分割应用之重要性思想在于帮助你增强应用/数据逻辑与公的界面生成代码间的分离。这可以于隔绝你的界面显示逻辑的场面下,极大地好你单元测试你的采用/数据逻辑。它还推动使你的施用还好保安,因为她妨碍了而下意识中拿施用/数据逻辑加到你的视图模板里的或许。

当实现我们ProductsController类的老三只控制器action方法时,我们用依据上的URL参数值从数据库被获取适当的范对象,然后择一个“视图”组件来显示适当的HTML响应。我们用应用Controller基类的一个RenderView()
方法来指定我们想只要运用的视图,以及明显地把我们而视图在亮响应时使用的特定数据传该法。

下面是咱们的ProductsController实现的最后结果:

SQL Server 18

注意,我们的action方法的代码行数目大有些(每个方法只有发生2行),部分原因是为URL参数分析逻辑完全是由MVC框架为我们举行的(给咱们看看了不少行代码),还有部分由是因产品浏览场景从事情逻辑的角度来说相当简单(涉及的action方法都是只是读的示场景)。

而是看来,你常常会面意识而有些都是把有时让叫作“瘦控制器”的物,即控制器方法充满了一对一简单的action方法(少于10行代码)。这常是好之征,表明你可怜彻底地包裹了若的多少逻辑,也蛮好地分隔了卿的控制器逻辑。

单元测试ProductsController

你也许会感到惊奇,我们而召开的产一致步还是是测试我们的应用逻辑和功力。你恐怕会咨询,这怎么可能吗?我们还没落实我们的视图呢,我们的行使即连无出示一个HTML
tag。其实也,使得MVC方法来魅力的组成部分原因就是是咱可以了独立于视图/Html生成逻辑来测试Controller和Model
逻辑。在脚你将看到,我们甚至可以在创造视图前单元测试这些目标。

啊单元测试我们以编辑的ProductsController类,我们以为测试项目里加一个ProductsControllerTest类,这个测试项目是于咱们应用Visual
Studio创建我们的ASP.NET MVC应用时,默认添加至我们的解决方案里的:

SQL Server 19

接下来我们拿定义一个简短的单元测试,测试我们的ProductsController的 Detail
action方法:

SQL Server 20

ASP.NET MVC
框架是专程设计来促成轻松的单元测试的。框架中之保有的中坚API和契约都是接口,提供了汪洋的扩张点为致使轻松的目标注入及定制(包括采取象Windsor,
StructureMap, Spring.NET,
和ObjectBuilder这样的IOC容器的能力)。开发人员将能利用内置的mock类,或者利用任何.NET
类型mock框架来拟他们好的MVC相关对象的测试版本。

于上头的单元测试中,你可望一个例子,我们是怎在调用 Detail() action
方法之前,往我们的ProductsController里注入了一个伪(dummy)“ViewFactory”实现的。这么做的话,我们虽蒙了默认的ViewFactory,否则的话,默认的ViewFactory会创建和显示我们的视图。我们可下此测试ViewFactory实现来开隔离,只对咱们ProductController的Detail
action的行为进行测试(而不用调用实际的视图来开测试)。注意我们是怎么样以Detail()
action方法被调用之后,使用了三单 Assert
语句来核实该法的没错的所作所为的确来了(具体地说,该措施赢得了对的Product对象,然后以它污染被了适当的视图)。

因咱们可以mock和模拟MVC框架中的外对象(包括 IHttpRequest 和
IHttpResponse
对象),你不用再在web服务的环境里运行单元测试,我们可于例行的类库里创建我们的ProductsController对象,然后对它们一直测试。这得极大地加快单元测试的运转速度,以及简化对她的布局与运作。

要我们使用 Visual Studio 2008
IDE,我们尚得肆意地钉我们运行测试的结果(这个意义现在一度改为VS 2008
专业版的相同部分):

SQL Server 21

自身怀念你见面发觉ASP.NET MVC
框架极大地便民了测试的编制,而且导致了挺好之TDD流程。

行使视图显示界面

咱们完成了我们电子商务应用之活浏览部分的以+数据逻辑的贯彻与测试,现在咱们得贯彻相关的HTML界面。

SQL Server 22

俺们拿由此实现“视图”来实现,这些视图将使我们ProductsController的action方法在调用RenderView()
方法时供的跟视图有关的数目对象,来显示适当的界面:

SQL Server 23

于上头的代码例子里,RenderView方法的“Categories”参数表示我们设展示的视图名称,第二单参数是咱而招为视图对象并设视图对象据此显示适当HTML界面的分类目标的列表。

ASP.NET MVC框架支持用其它模板引擎(包括象NVelocity,
Brail,以及你协调想如果编写的别模板引擎)来帮生成界面。在默认情形下,
ASP.NET MVC 框架下ASP.NET中存活的ASP.NET 页面 (.aspx), 母版页
(.master), 和用户控件 (.ascx) 。

俺们拿运内置的ASP.NET 视图引擎来实现我们的电子商务应用之界面。

定义Site.Master文件

坐咱们且以网站及构筑很多页面,我们先来定义一个母版页,用以封装整个网站公用的HTML布局/样式。我们拿以咱们种之\Views\Shared
目录里创建一个称也“Site.Master”的文书:

SQL Server 24

咱们得引用一个表的CSS样式文件来封装整个网站的装有样式,然后使母版页来定义网站到底的布局,以及指定我们如果切实页面填写相关内容之情节placeholder
区域。在开的下,我们也得采用VS 2008
中的新设计器的具有的酷功能,包括HTML分割视图设计器,编著CSS和嵌套母版页支持等。

SQL Server 25

知/Views目录结构

在默认情形下,当你下Visual Studio创建新的ASP.NET MVC
项目时,它见面在“Views”根目录下生成一个“Shared”子目录。这是存放在应用被为多独控制器所共享的母版页,用户控件和视图的推荐用的地方。

每当修建也特定个别控制器所用之视图时,默认的 ASP.NET MVC
约定是,把她存放于\Views
根目录的子目录里。在默认情形下,子目录的名应该相应于控制器的讳。譬如,因为我们刚编制的Controller类叫“ProductsController”,在默认情形下,我们以在\Views\Products
子目录里存放和它相关的特定视图:

SQL Server 26

当我们在一个一定的Controller中调用 RenderView(string
viewName)方法时,MVC框架会活动地首先以\Views\ControllerName
目录里寻对应的.aspx 或
.ascx视图模板,如果她寻找不交当的视图模板,然后它会以
\Views\Shared目录寻找。

创立一个Categories视图

我们可以在 Visual Studio 中 Products
目录及使“添加新项”菜单选项,然后择“MVC视图网页”项模板,为我们的ProductsController
创建一个“Categories”视图。这会转变一个新的.aspx
页面,我们得以将它们跟咱们的
Site.Master母版页相关联,来抱总的外观(就象母版页一样,你见面收获即见即所得设计器的支持):

SQL Server 27

每当运用MVC模式建造应用时,你要把你的视图代码尽可能地保全简洁,确认视图代码纯粹是用来显示界面。应用以及数据获得逻辑应该只在Controller类里编写。然后Controller类就足以于调用RenderView
方法时精选把所需要的数目对象传递给视图。譬如,在底下,我们的ProductsController类的
Categories action方法中,我们将
一个Category对象的List集合传给了Categories视图:

SQL Server 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对象的一个List

SQL Server 29

立即意味着当我之视图代码里操作ProductsController.Categories()
提供的List<Category> ViewData时,我用得到完全的色安全,
intellisense和编译时检查:

SQL Server 30

显示Categories视图:

假若你还记本帖子最前的截图的语句,我们要当我们的 Categories
视图里显示产品分类列表:

SQL Server 31

自身可以当自身的Categories视图实现里之所以2种方式编写这HTML界面生成代码:1)
在.aspx 文件里以行内代码, 或者 2) 在.aspx
文件被行使服务器控件,然后以后台代码里使用数据绑定。

来得方式1:使用行内代码

当下之ASP.NET网页, 用户控件和母版页支持用 <% %> 和 <%=
%>的句法来在html 标识外放置显示代码。我们可在Categories
视图里用这技能,轻松地修一个foreach循环,来生成HTML分类列表:

SQL Server 32

VS
2008当源码编辑器内也VB和C#供整体的代码intellisense。这意味,在针对传播视图的Category模型对象操作时,我们将获得intellisense:

SQL Server 33

VS
2008尚吧行内代码提供了总体的调试器支持(允许我们以调试器对视图中的代码设置断点以及动态检查外东西):

SQL Server 34

著方式2:使用服务器端控件

 

ASP.NET网页,用户控件和母版页还提供针对性应用声明式服务器端控件封装HTML界面生成的支持。不是象上面那样采用行内代码,我们可运用
.NET 3.5中新的<asp:listview>
控件来生成列表界面:

SQL Server 35

瞩目点 ListView
控件封装了展示价值列表的情状,还背负处理列表中没外事物的状(<EmptyDataTemplate>省略了需在标识被编辑
if/else
语句的麻烦)。然后我们好形象下这样,在后台代码里,将我们的归类目标绑定到listview控件上:

SQL Server 36

第一注意事项:在MVC世界里,我们只是想如果把显示代码放在我们视图的后台代码里,不包括另外利用或数逻辑。注意点我们惟有将强类型的Category对象的ViewData集合赋值给ListView控件的逻辑。我们的ProductsController控制器类才是实际上于数据库获取Category对象列表的责任人员,不是视图。

我们视图模板的ListView服务器端控件版本然后虽会见变和方行内代码版本完全一样的HTML。因为咱们于页面里从未
<form
runat=”server”>控件,ViewState,ID值以及其他的标识都未见面扭转,只生纯粹的CSS友好的HTML:

SQL Server 37 

Html.ActionLink方法

公恐怕注意到之同宗工作是,在面视图代码片断中行内代码和服务器端控件两独版本被针对一个Html.ActionLink
方法的调用:

SQL Server 38

Html对象是 ViewPage
基类的一个协助属性,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>),第二只参数是只匿名对象,它意味着用以生成实际URL的如出一辙串值,你得看她是别字典的一个较彻底的章程。我会以未来议论URL
routing引擎的博客帖子里仔细讨论是参数的运用气象。但简单,你可以使用URL
routing系统既处理上的URL,也得以据此其来挺成你可当返的HTML输出的URL。如果我们的routing规则是相这样的:

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

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

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

ActionLink方法就是会利用你以之URL映射规则,换进你的参数,生成这样的出口:

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

当时有利于了当公用被生成URL和到你的控制器的AJAX回调。它为代表你得于一个地方更新您的URL
routing规则,你一切应用被的代码会以对入的URL的拍卖与外出的URL的别过程被机动采用新的变型。

最主要注意事项
为加强可测试性,目前的MVC框架并无支持你视图中对服务器端控件的postback事件,取而代之的凡,ASP.NET
MVC应用生成超链接和指向控制器action的AJAX回调,然后就行使视图(以及中的另外服务器端控件)显示输出。这促进保险您的视图逻辑保持以最小限度,只强调于显示,以及你可以单元测试你的Controller类,独立于您的视图,核实有的利用及数目逻辑行为。我以前的帖子里会对斯举行还透之座谈。

结语

顿时第一只贴子非常长,但望其对新的ASP.NET
MVC框架中有不同之零件是怎么样组合在一起的,如何行使它们打大的具体世界场景的采用提供了一个一定常见的综览。
ASP.NET
MVC的第一单明白预览版将于几乎独星期日内披露,你将会用它来开自我面描述的尽。

虽说众MVC固有的定义(特别是关爱分离之价值观)对该贴子的很多读者来说是较新的,但期待以贴子展示了我们在开之ASP.NET
MVC实现是哪些颇绝望地嵌合到现有的ASP.NET, .NET, 和 Visual
Studio框架负之。你可使用.ASPX, .ASCX 和 .MASTER文件以及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

相关文章