文章详情

  • 游戏榜单
  • 软件榜单
关闭导航
热搜榜
热门下载
热门标签
php爱好者> php文档>Scott的ASP.net MVC框架系列文章之三: 视图数据的传递

Scott的ASP.net MVC框架系列文章之三: 视图数据的传递

时间:2011-05-15  来源:刺猬的温驯

下面我们将要分别介绍两种方式,来实现ProductsController类处理请求,获取数据并显示数据的过程。第一种方式我们要使用迟绑定(late-bound)对象,另一种方式我们要使用强类型类(strong-typed)。
方式1:使用Controller.ViewData传递视图数据
Controller基类包含一个名为”ViewData”的属性可以用来存放传递给视图的数据,你可以使用name/value的形式向ViewData中添加对象。
下面的ProductsController类中包含一个Category方法可以实现上面所说的产品列表功能。注意该类是如何使用目录的ID参数来寻找该目录的名称的,以及如何获取该目录中的所有产品。这两部分内容都被存放在Controller.ViewData集合中,并分别使用”CategoryName”和“Products”名称作为主键:
上面的Category方法调用RenderView(“List”)并指明了将要使用哪个视图模板来产生输出,当调用RenderView方法时,Controller将把ViewData传递到View中以便进行显示。
实现View
当我们使用MVC 视图内容也模板创建List.aspx页时,并不是从System.Web.UI.Page类继承而来,而是继承自System.Web.Mvc.ViewPage基类(该类是Page类的子类):
使用服务器控件实现View
我们可以采用如下方式通过后台代码类将视图数据绑定到这些控件(注意我们是如何使用视图页的ViewData属性来实现的):
如果你希望使用迁入代码的方式产生输出,你可以用下面的List.aspx页面实现与上面相同的效果:
方式2:使用强类型(strong-typed)类传递视图数据
除了对迟绑定数据源方式之外,ASP.NET MVC框架同时允许从Controller向View中传递强类型的视图数据对象。使用强类型的方式有如下优点:
  1. 避免使用字符串来搜索对象,同时对Controller和View代码都可以得到编译时错误检查
  2. 避免在使用强类型语言(例如C#)时对视图数据进行强制类型转换
  3. 在视图页的标记和后台代码中可以有代码只能感知支持
  4. 你可以使用代码反射工具在应用程序和单元测试代码范围内对代码进行自动修改
下面的”ProductsListViewData”强类型类封装了List.aspx视图中用户产品列表的数据,它具有CategoryName和Products属性(通过C#中新的自动属性automatic property支持实现):
修改ProductsController使用该对象将强类型的视图数据传递到视图中:
注意上面我们是向RenderView()方法中传入一个额外的参数将强类型的ProductsListViewData对象传递给视图的。
使用视图的ViewData属性访问强类型的ViewData对象
我们在前面实现的List.aspx视图不需要修改仍可以正常工作。这是因为当强类型的ViewData对象传入继承自ViewPage类的View时,ViewData属性将应用反射机制自动查找该对象的各种属性值,因此我们视图中的代码如下所示:
在RenderView()方法被调用是,上面的代码将会利用反射从我们传入的强类型ProductsListViewData对象中获取CategoryName属性。
对象类型ViewData使用ViewPage<T>基类
为了提供对ViewPage基类的支持,ASP.NET MVC框架同时包含了一个泛型基类ViewPage<T>,如果你的视图继承自ViewPage<T>,其中T代表Controller传入View的ViewData的类型,那么ViewData将被强类型话为指定的类型。
例如,我们可以修改List.aspx.cs文件使其继承自ViewPage<ProductsListViewData>而不是ViewPage基类:
此时该页的ViewData属性将自动定义为ProductsListViewData。这样我们可以使用强类型属性而不是字符串索引的方式获取数据:
然后我们可以使用服务器控件或<%%>的方式生成基于ViewData的HTML输出。
通过服务器控件实现ViewPage<T>
在下面的例子中我们将使用<asp:literal>和<asp:repeater>服务器控件实现HTML UI,与前面继承自ViewPage基类的List.aspx页面相同:
后台代码如下所示。注意因为该类继承自ViewPage<ProductsListViewData>,所以我们可以直接访问属性而不需要任何转换(同时在任何时候我们希望修改属性名称时都可以得到反射工具的支持):
使用<%%>实现ViewPage<T>
如果你希望使用嵌入代码的方式来生成输出,你可以使用下面的代码实现与上面相同的效果:
采用ViewPage<T>的方式我们避免使用字符串来检索视图数据,更重要的是属性成为强类型之后我们就不需要再进行属性的类型转换。这意味着我们可以直接使用foreach (var product in ViewData.Products)语句而不需要转换得到Products。在循环语句product变量将会有完全的智能感知支持:
总结
希望上面的文章已经对Controller向View传递用于呈现的数据的过程有了更加深入的介绍,你可以使用迟绑定的方式或强类型的方式来达到这一目的。
当你第一次创建一个MVC应用程序时,你或许会对将应用控制逻辑与表现代码相互分开的概念感到陌生,你需要一些时间来适应这种接受请求-执行应用逻辑-包装用于显示的视图数据-呈现的处理过程。重要:MVC方式为可选方式,如果你对这种开发模式并不习惯你可以不使用它。
这种方式的优点在于将运行和测试业务逻辑的过程与UI呈现分离,这是的开发单元测试更加简便,同时支持TDD开发模式。后面的文章我将深入介绍这一点,并讨论对代码进行测试的实践。
希望对你有所帮助,
Scott
相关阅读 更多 +
排行榜 更多 +
辰域智控app

辰域智控app

系统工具 下载
网医联盟app

网医联盟app

运动健身 下载
汇丰汇选App

汇丰汇选App

金融理财 下载