使用强类型的ViewData好处有许多,比如说在IDE中就会有更好的支持,比如代码提示。同时在View 与Controller之间有更严谨的“约定”。在Suteki.Shop项目中作者对强类型的ViewPage引入 是通过MvcContrib实现的,下面就是其ViewPage<T>代码(Suteki.Shop\Views\ViewPage.cs):
public class ViewPage<T> : MvcContrib.FluentHtml.ModelViewPage<T> where T : class
{
public ViewPage() : base(new LowercaseFirstCharacterOfNameBehaviour())
{}
}
public class ViewUserControl<T> : MvcContrib.FluentHtml.ModelViewUserControl<T> where T : class
{
public ViewUserControl() : base(new LowercaseFirstCharacterOfNameBehaviour())
{}
}
可以看出ViewPage和 ViewUserControl只是对MvcContrib中ModelViewPage,ModelViewUserControl的继承,代码很简单,没 什么太多可说的。强类型的ViewData使用形如:ViewPage<TViewData>,我们可以通过打开一个 View看一下,比如“编辑用户信息”时的视图头声明部分:
<%@ Page Title="" Language="C#" Inherits="Suteki.Shop.ViewPage<ShopViewData>"
好了,下面就开始 正文。
首先我们要看一下Suteki.Common\ViewData文件夹下面的几个类,包括:IErrorViewData ,IMessageViewData,ViewDataBase等,其类图如下:
从图中看出, ViewDataBase是其体系“核心”, 其实现了 IMessageViewData, IErrorViewData这两个接 口。其实体代码如下:
public abstract class ViewDataBase : IMessageViewData, IErrorViewData
{
public string Message { get; set; }
public string ErrorMessage { get; set; }
public ViewDataBase WithErrorMessage(string errorMessage)
{
this.ErrorMessage = errorMessage;
return this;
}
public ViewDataBase WithMessage(string message)
{
this.Message = message;
return this;
}
}
该抽象类的属性Message,ErrorMessage分 别实现了IMessageViewData和IErrorViewData的接口属性。主要 用于显示临时操作信息(比如“ 成功添加用户”,“成功编辑用户”等)。其所提供的两个方法 “WithErrorMessage”和“WithMessage”只是对相应属性的简单绑定而已。
有了ViewDataBase之后,下面就来看一下其子类实现了,下面是相应类图:
正如前面所介绍的那样,子类中最“重要”的当属“ShopViewData”,其包括 了基本所有Model中的类型,并将它们以“属性”的方法提供出来以便于前台View使用,同时 ShopViewData还提供了与其属性相关的绑定方法(均以“With...”开头),下面就是其代码 。
public class ShopViewData : ViewDataBase
{
public Category Category { get; set; }
public IEnumerable<Category> Categories { get; set; }
public Product Product { get; set; }
public IEnumerable<Product> Products { get; set; }
public IEnumerable<Role> Roles { get; set; }
public User User { get; set; }
public IEnumerable<User> Users { get; set; }
public Basket Basket { get; set; }
public Order Order { get; set; }
public PagedList<Order> Orders { get; set; }
public OrderSearchCriteria OrderSearchCriteria { get; set; }
public IEnumerable<Country> Countries { get; set; }
public Country Country { get; set; }
public IEnumerable<CardType> CardTypes { get; set; }
|