0

我项目中的每个控制器类都派生自一个基本控制器类,恰当地命名为 BaseController。

所有视图数据都包含在一个名为 BaseViewData 的类中(将来可能成为更具体的视图数据类的基本控制器)。

我在 BaseController 上创建了一个 BaseViewData 属性,因为每个控制器都需要访问强类型基本视图数据中的数据(并且 BaseController 做了一些工作来预填充一些 BaseViewData 属性)。

我这样做是因为:

  1. 如果我改变了一个属性,我会得到编译时错误检查,以更快地解决损坏的代码。

  2. 通过练习 DRY,我设法整合了以前分散在每个控制器中的大量代码。

然而,这是我第一次尝试这样做。所以我可能会忽略一个准备抬起丑陋脑袋的问题。所以:

将 BaseViewData 类作为 BaseController 类的属性是个坏主意吗?如果是这样,为什么?

更新1:

我的 BaseController 看起来像(还有更多,但这应该明白这一点):

public class BaseController
{
  public string Language {get; set;}
  public string Locale {get; set;}
  public BaseViewData Data {get; set;}

  protected override void OnActionExecuting(ActionExecutingContext filterContext)
  {
    var l = (RouteData.Values["language"] != null) ? RouteData.Values["language"].ToString() : "en";
    if (l.ToLower().Contains("en"))
    {
      l = "en";
    }
    else
     l = "ja";

    Data.Language = l;
  }
}

我的 BaseViewData 看起来像这样(同样,还有更多......):

public class BaseViewData
{
  public string Language {get;set;}
  public string Locale {get;set;}
  public bool IsOwner {get;set;}
  public string Menu1 {get;set;}
  public string Menu2 {get;set;}
  public string Menu3 {get;set;}

  public IPagedList<TYPE> ListOfTYPE {get;set;}
  etc...
}
4

3 回答 3

2

您的想法的菜单组件可能不是必需的,使用 ASP.NET MVC 2 Beta,您现在可以使用 Http.RenderAction 直接从视图调用控制器操作(例如从存储库中检索菜单项的 BuildMenu 操作和返回一个局部视图。

请参阅Haacked更多信息...

此外,对于语言/区域设置等更简单的内容,如果您使用 ASP.NET 配置文件提供程序(可通过控制器和视图访问),则可能不需要这样做。

于 2009-12-18T00:08:19.867 回答
1

对于我曾经在 ASP.NET MVC 中工作过的唯一网站,这正是我们所做的。这样做的好处还在于,我们能够在 BaseViewData 类中保存母版页所需的值。因为每个视图都有一些派生的 BaseViewData 的实例,所以我们可以安全地使用母版页中 BaseViewData 中的数据。

于 2009-12-17T22:57:22.600 回答
1

恕我直言,你正在创造一个怪物。

随着您的应用程序的发展,越来越多的功能和全局屏幕将被纳入基本视图模型中。不可避免的是像 .aspx.cs 文件这样的神代码隐藏类,MVC 试图避免。

最好使用 MVC2 的 RenderAction 或 MVC Contrib 的 SubController 之类的东西,即使这意味着稍微打破 MVC 模式。

看看像 CNN 甚至 Stackoverflow.com 这样的网站,你会在不知不觉中找到十几种方法。

于 2009-12-18T00:13:45.960 回答