asp.net mvc强类型母版页 - 类型问题

时间:2011-02-08 11:32:56

标签: asp.net-mvc-2 view master-pages strong-typing

我有两种视图模型:

public class MasterPageViewModel
{
    public string Meta { get; set; }
}

public class Entry : MasterPageViewModel
{
    public int EntryID { get; set; }
    public string Title { get; set; }
    public DateTime PubDate { get; set; }
}

索引页面返回一个条目列表,因此在视图中包含:

...Inherits="System.Web.Mvc.ViewPage<IEnumerable<bl.Models.Entry>>"

然后母版页包含

...Inherits="System.Web.Mvc.ViewMasterPage<bl.Models.MasterPageViewModel>"

这是我得到的错误:

  

传递到字典中的模型项的类型为'System.Linq.EnumerableQuery`1 [bl.Models.Entry]',但此字典需要类型为'bl.Models.MasterPageViewModel'的模型项。

我可以通过在母版页上使用ViewData字典轻松绕过该错误,但在我的情况下,我更喜欢强类型方法。将来,我希望能够添加主页上显示的类别和标签列表。

1 个答案:

答案 0 :(得分:1)

我有一些类似你在我正在研究的MVC网站中描述的结构。我没有找到一个非常令人满意的答案 - 在许多情况下,你觉得你想要两个不同的模型,一个用于母版页,一个用于内容页面。不幸的是,这不是MVC的工作方式。

除了你提到的ViewData选项之外,我只遇到过一个解决方案。

基类

  • 构建一个所有模型都继承的基类。
  • 基类包含母版页中所需的所有属性。
  • 好:这是简单的继承
  • 糟糕:您最终会使用包装方法/模型来处理基本内容,例如传递可枚举的集合。

所以在你的情况下,你最终会得到类似......

的东西
public class MasterPageViewModel {
    public string Meta { get; set; }
}

public class Entry : MasterPageViewModel {
  public IEnumerable<bl.Models.EntryItem> Items {get; set }
}

public class EntryItem{
    public int EntryID { get; set; }
    public string Title { get; set; }
    public DateTime PubDate { get; set; }
}

您的索引页面看起来像......

...Inherits="System.Web.Mvc.ViewPage<bl.Models.Entry>"

这是一种痛苦的屁股,因为你最终得到了很多小模特。然而,一旦我习惯了它,我就不再考虑它了。

HTH,

-Eric