在一个MVC视图中使用两个强类型模型

5

我是不是错过了MVC原则中的一些基本要点,还是我变得有些疯狂了?

如果我有一个显示书籍列表和作者列表的视图,我需要创建一个类来将书籍列表和作者列表作为属性。对吗?

然后我会将强类型视图指定为使用此类。

现在我想创建一个新页面,其中包含相同的列表,但也具有促销列表。我需要创建另一个类,它有一个书籍列表属性、作者列表属性和促销列表属性吗?

如果我为所有视图创建类,那么我需要做大量额外的工作。我是否应该为每个视图创建强类型部分视图?如果每次布局不同怎么办?

目前,我有一个BaseViewData类,所有视图都使用它,因为它包含一些常见属性。然而,现在我很难将其他项添加到其中,而不完全膨胀BaseViewData类。

请有人帮我理解所有简单示例所没有涵盖的理论。

3个回答

3

我使用MvcContrib提供的ViewData扩展方法,它支持多个强类型模型(只要它们是不同的类型)。将它们添加到ViewData的代码如下:

User currentUser = GetCurrentUser();
List<Project> projectList = projectRepository.GetRecentProjects(currentUser);
ViewData.Add(user);
ViewData.Add(projectList);

从视图中提取它们的代码如下:

User user = ViewData.Get<User>();
List<Project> projectList = ViewData.Get<List<Project>>();

这样做可以同时移除“魔法字符串”和类型转换。请注意,这并不会对视图的模型属性进行任何操作。


你应该在视图中输入变量吗?我认为视图只应该是显示代码,或者我太过于追求完美了吗? - William Hurst

1
为您的系统中的每个对象创建一个容器类,并在所有视图中使用 - 简单。
具有空值的对象没有真正的开销。

0
我也遇到了相同的问题。我认为大多数人的一般解决方案是创建一个容器类,包含你真正想要的书籍和作者模型,并将该容器传递给你的视图。
虽然不太理想,但仍然可以工作。希望这个问题在未来版本的框架中得到解决。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接