其三局地皇冠直营现金网官方网

英文原稿地址: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

过去的多少个礼拜内,作者直接在写着商讨我们正在开发的新ASP.NET
MVC框架的多元贴子。ASP.NET MVC框架是个你能够用来结构化你的ASP.NET
web应用,使之富有清晰的关怀分离,方便你单元测试代码和支持TDD流程的可选方法。

以此种类的第一篇修筑了一个不难的电子商务产品列表/浏览网站。它商量了MVC前边的高层次的定义,示范了怎么样初阶创造1个新的ASP.NET
MVC项目,完成和测试那些电子商务产品列表作用。类别的第二篇对ASP.NET
MVC框架的U劲客L路径选取(routing)架构做了深刻商讨,斟酌了它的做事规律以及你哪些使用它来拍卖更尖端的ULANDL路径选取场景。

在今日的帖子里,小编将研究控制器是怎么着与视图做交互的,具体来说,我将研究你能够把数量从控制器传到视图以显示再次回到到客户端的恢复的各个格局。

先是有个别的简短简述

在那些体系的先是部分,大家创制了多少个电子商务网站,达成了基本的产品列表/浏览帮忙。我们是用ASP.NET
MVC框架达成那几个网站的,那个方法会很当然地将代码结构变为独特的控制器,模型和视图组件。

当浏览器向大家的网站发送1个HTTP请求时,ASP.NET
MVC框架将动用它的ULANDL路径选拔引擎,把进来的伸手映射到一个控制器上的action方法来处理它。在依照MVC的施用中的控制器负责处理进来的乞请,处理用户输入和交互,执行基于那一个输入和相互的应用逻辑(获取或更新存储在数据库中的模型数据等等)。

到生成再次回到到客户端的HTML回复的时候,控制器一般是与“视图”组件合营,这一个视图组件是以单身于控制器的独自的类或模板的情势落成的,其指标是截然尊重于封装展现逻辑。

皇冠直营现金网官方网 1

视图不应当包涵别的应用逻辑或数据库访问代码,全数的运用/数据逻辑应该由决定器类来拍卖。这么划分的心劲是支援强制你的选拔/数据逻辑与界目生成代码间的鲜明分离。同时那也便于你独自于您的界面显示逻辑来单元测试你的利用/数据逻辑。

视图应该只行使从控制器传过来的特定于视图的数据来生成输出。在ASP.NET
MVC框架中,大家称这几个一定于视图的数目为“ViewData”。这一个博客的别的一些将探究你能够用来将ViewData从控制器传递给视图来变化展现的片段不比情势。

一个简约的制品列表场景

为协理表达我们得以用来把ViewData从控制器传递给视图的片段技术,让大家来建造2个大约的出品列表网页:

皇冠直营现金网官方网 2

大家将用二个CategoryID整数来过滤大家想要展现在页面上的出品。注意上边大家是如何把CategoryID嵌在UPRADOL中的(例如,Products/Category/2
或 /Products/Category/4 )。

下一场,大家的出品列表网页显示了1个不等的动态内容成分。第一个成分是大家要显得的归类的公文名称(例如,Condiments-调味品),第①个要素是1个HTML
<ul><li/></ul>
产品名字列表。小编在上边的荧屏截图中对那3个要素用红笔画了圈。

在上边,我们将看一下我们得以选用的一个分歧的点子来落到实处ProductsController类,那个类处理进来的伸手,获取处理请求所需的多寡,然后将以此数目传给叁个List视图来展现。我们要商量的首先个主意是用中期绑定的字典对象传递那几个数量,第1个章程则应用强类型类的不二法门来传递这么些数目。

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

Controller基类有个ViewData字典属性,能够用来填充你要传给视图的数额。你选择键/值形式将对象参加ViewData 字典。

上边是个ProductsController类,个中的Category
action方法实现了大家地点的产品列表场景。注意,它是何许使用分类的ID参数来查询该分类的文本名称,以及获得该分类中的产品列表的。它采取“CategoryName”和“Products”四个键将那五个数据存款和储蓄在Controller.ViewData
集合中:

皇冠直营现金网官方网 3 

然后,大家地方的Category action方法调用 RenderView(“List”)
来表示它要用哪个模板来做展示。当你象那样调用RenderView时,它会将ViewData字典传给视图,以突显相应的回复。

兑现大家的视图

小编们将应用居于大家项指标\Views\Products目录下的List.aspx文件来兑现大家的List视图。这么些List.aspx 将继承 \Views\皇冠直营现金网官方网,Shared
文件夹中的Site.Master母版页中的布局(在您成立一个新的视图网页时,你可以在
VS 2010 中,右击,选取添加新项->MVC视图内容网页来延续2个母版页):

皇冠直营现金网官方网 4

当大家运用MVC视图内容网页模板来创建List.aspx网页时,它不是从常常的
System.Web.UI.Page 类继承而来,而是从System.Web.Mvc.ViewPage
基类继承而来(是并存的Page类的3个子类):

皇冠直营现金网官方网 5

ViewPage基类提供1个ViewData字典属性,大家能够在视图网页里拜访由控制器添加的多少对象。然后大家得以取出那一个数据对象,使用它们来突显HTML输出,能够用服务器控件的点子,可能用
<%= %> 彰显代码的主意。

行使服务器控件来得以实现大家的视图

下边是三个什么样运用现有的<asp:literal> 和
<asp:repeater>服务器控件来落到实处大家的HTML界面包车型地铁例子:

皇冠直营现金网官方网 6

小编们能够用上边包车型地铁后台代码类将 ViewData
绑定到这一个控件之上(注意大家是什么样行使ViewPage的ViewData字典来促成的
):

皇冠直营现金网官方网 7

注: 因为页面上尚未 <form runat=”server”>,是不会输出 view-state
的。上边包车型大巴控件也不会自动生成别的ID值,那表示你对出口的HTML有一齐的决定。

利用 <%= %> 代码来实现我们的视图

假使你更爱好使用行内代码来生成输出的话,你可采纳下边包车型客车 List.aspx
来达成跟上边完全相同的结果:

皇冠直营现金网官方网 8

注:
因为ViewData的品类是蕴涵“objects”的字典,为了对它使用foreach语句,大家供给将ViewData[“Products”]的类型转换到List<Product> 大概IEnumerable<Product>。笔者在页面上引用了System.Collections.Generic
和 MyStore.Models 命名空间 以幸免输入 List<T> 和 Product
类型的一体化名称。

注: 上边运用了“var”关键词,那是VS 二〇一〇中新的 C# 和 VB
“类型揣摸”天性的3个例证(在那里阅读本身以前的连带贴子)。因为我们将ViewData[“Products”]
转换到了 List<Product>,我们在 List.aspx 文件中的 prduct
变量上获得了完全的intellisense:

皇冠直营现金网官方网 9

措施 2:使用强类型类来传递ViewData

除了援救中期绑定的字典方法外,ASP.NET
MVC框架还同意你把强类型的ViewData对象从控制器传递给您的视图。使用这么些强类型的主意有多少个便宜:

  1. 防止选拔字符串来查询对象,得到对你的控制器和视图代码的编写翻译时检查
  2. 幸免必要在选拔象C#这么的强类型语言中明显转换ViewData对象字典中的值
  3. 在你的视图网页的标识文件以及后台代码文件中获得你的ViewData对象的电动代码intellisense
  4. 能够行使代码重构工具来增派自动化对全体应用和单元测试代码库的改观

下面是二个强类型的ProductsListViewData类,封装了 List.aspx
视图突显大家的制品列表所需的多寡,它涵盖 CategoryName 和 Products
属性(是通过运用新的C#自动属性协助来促成的):

皇冠直营现金网官方网 10

然后大家得以立异我们的 ProductsController
完结来使用这么些指标,把多个强类型的ViewData对象传给大家的视图:

皇冠直营现金网官方网 11

注意上边,大家是什么样通过 RenderView()
方法的三个附加的参数,把大家的强类型 ProductsListViewData
对象传给View的。

把视图的ViewData字典与强类型的ViewData对象一起利用

眼下我们编辑的 List.aspx 视图实现会持续和我们立异过的 ProductsController
合营,不需改变代码。那是因为,当把1个强类型的 ViewData 对象传递给后续自
ViewPage 的视图类时,ViewData
字典会自动使用反射对强类型的对象的个性做询问取值。所以我们象上面那样的视图中的代码:

皇冠直营现金网官方网 12

会自动使用反射来从强类型的 ProductsListViewData 对象中获取 CategoryName
属性,这几个目标是大家在调用 RenderView 方法时传出的。

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

而外帮助基于字典的ViewPage基类外,ASP.NET MVC框架中还发表有根据泛型的
ViewPage<T> 实现。假诺你的视图是从 ViewPage<T>
继承而来,那里T表示是控制器传给视图的 ViewData 的项目,那么 ViewData
属性就将是接纳了这些T类的强类型属性。

比如,我们得以立异大家的 List.aspx.cs
后台代码类,不是从ViewPage继承来,而是继续自
ViewPage<ProductsListViewData> :

皇冠直营现金网官方网 13

那样做之后,页面上的 ViewData 属性将会从一个字典变成属于
ProductsListViewData
类型。那代表,大家今后得以不再行使基于字符串的字典来查看获取数据,而是能够使用强类型的性质了:

皇冠直营现金网官方网 14

接下来,大家能够运用服务器控件的主意,也许 <%= %>
显示的法门来扭转基于那么些ViewData的HTML。

使用服务器控件来落到实处ViewPage<T>视图

上边是2个例证,大家得以行使<asp:literal> 和
<asp:repeater>服务器控件来促成大家的HTML界面。那是大家应用持续自
ViewPage 的 List.aspx 网页时所利用的完全一样的标识:

皇冠直营现金网官方网 15

上边是相应的后台代码。注意,因为大家是从
ViewPage<ProductsListViewData>
继承而来的,大家得以平昔访问它的质量,而不要对任何事物做类型转换(何时大家决定对中间三个天性改名的话,大家还将取得重构工具的帮助):

皇冠直营现金网官方网 16

行使 <%= %> 代码完结大家的
ViewPage<T> 视图

假诺您更欣赏使用行内代码来生成输出的话,你能够象下边那样在 List.aspx
中落成跟上面一样的结果:

皇冠直营现金网官方网 17

应用 ViewPage<T> 方法,咱们今后不再须求对 ViewData
使用字符串查阅了。更关键的是,注意下边,大家不再须求对任何性质做类型转换了,因为它们曾经是强类型的。那意味,大家能够编写
foreach (var product in ViewData.Products) ,而不用对 Products
做类型转换。大家还在循环中的 product 变量上获取了总体的intellisense:

皇冠直营现金网官方网 18

结语

期望本贴子提供了有关控制器怎样把数量传递给视图以显示重回到客户端的死灰复燃的一些细节。你可以选拔早先时期绑定的字典,也许应用强类型的法子来达到这些目标。

先是次试着建筑MVC应用时,你很大概发现把利用控制器的逻辑和生成界面包车型地铁代码分离开来的定义有点怪。你大致要花上一段专门的时刻来多修建些应用,你才会倍感习惯,把团结的思路转向到拍卖2个呼吁,执行全数的应用逻辑,把修建界面回复所需的
viewdata 包装起来,然后交由单独的2个视图页面去突显的观念上去。
首要事项:假若那些模型对您来说并不觉得舒适,那么别用它,MVC的法子纯粹是可选的,我们并不认为那是种种人都想要用的事物。

但以此划分应用的便宜以及之后的对象在于,它同意你独自于您的界面展现代码,来运作和测试你的使用和数据逻辑。那巨大地惠及你为你的利用开发全面包车型地铁单元测试,以及在建造应用时利用TDD(测试驱动开发)的流水生产线。在此后的贴子里,笔者会对此做更尖锐的切磋,以及研究你能够用来轻松测试代码的特级实践。

梦想本文对你富有扶助,

Scott

相关文章