【问题标题】:Asp.Net MVC - Strongly Typed View with Two Lists of Same TypeAsp.Net MVC - 具有两个相同类型列表的强类型视图
【发布时间】:2009-08-14 02:09:36
【问题描述】:
我有一个对 Item 类进行强类型化的 View。在我的控制器中,我需要发送两个不同的列表。除了用两个 List 创建一个新类之外,还有更简单的方法吗?
我最终要做的是在我的主页上按日期订购 10 件商品,并按人气订购 10 件商品。
我做了什么
我实际上是结合了这两个答案。我将我的视图强类型化到我用两个列表创建的新类中。然后,我为每个列表强输入了两个部分视图。可能看起来有点矫枉过正,但我喜欢它的结果。
【问题讨论】:
标签:
asp.net-mvc
strongly-typed-view
【解决方案1】:
“用两个列表创建一个新类”是要走的路。它被称为视图模型,一旦你接受它,强类型视图的威力就会真正发挥作用。可以这么简单:
public class IndexViewModel
{
public List<Item> Newest { get; set; }
public List<Item> Popular { get; set; }
}
【解决方案2】:
对此有两种一般的哲学。首先是采用约翰·希恩(John Sheehan)所说的方法。您创建一个包含两个列表的自定义视图模型并将其传递给您的强类型视图。
第二个是将列表视为“辅助”数据并将它们放入 ViewData 中,如 jeef3 所述。但是,当您呈现列表时,您使用的是强类型部分。
ViewData["Newest"] = Newest;
ViewData["Popular"] = Popular
我的意思是在你的主视图中,你会调用 RenderPartial(...) 但传入你使用的视图数据键。
你的部分看起来像:
<%@ ViewUserControl Inherits="System.Web.Mvc.ViewUserControl<List<Item>>" %>
...
这使您可以从局部视图中对视图数据进行强类型访问。
【解决方案3】:
这是 John 建议的或没有强类型视图并将它们添加到 ViewData:
ViewData["Newest"] = Newest;
ViewData["Popular"] = Popular
另一种选择是强类型部分视图。
【解决方案4】:
您应该专门为视图创建一个包含两个列表的模型。
通常在我所做的小 MVC 中,我为每个视图创建了一个模型,即使它们只是传递由数据或业务层提供的相同数据,只是为了保持两个部分之间的分离非常严格。这个设置需要做更多的工作,在许多简单的情况下不需要,但在我看来它确实让事情变得更干净。