页面需要继承2个视图模型并显示所需的模型

时间:2010-09-16 15:08:54

标签: asp.net-mvc asp.net-mvc-2

我有一个内容页面,很高兴显示继承了一个contentModel。我需要更改页面,以便它还可以显示另一个viewModel(例如revertedContent),但只有在需要显示正常的contentModel时才显示它。

我确信有一种简单的方法可以做到这一点,这只是一种痛苦,因为我需要确保网页不会在网址中被更改,例如details.aspx按原样保留,但可以显示当前内容或以前版本化的内容。

提前欢呼

4 个答案:

答案 0 :(得分:6)

视图应该是“愚蠢的”(并且有单一责任)

我认为您完全不了解Asp.net MVC概念模型。视图应该是愚蠢的,并且根据需要具有相同的逻辑。分而治之是这里的规则。因此,如果您对特定数据有两种不同的视图,那么您也可以构建两个自定义视图。

控制器应该是这里的聪明人。因此,给出观点决策的可能性并不是正确的做法。

决策几乎肯定是基于应用程序模型状态,因此由控制器决定显示哪个视图并为该特定视图提供正确的模型。

从同一控制器操作返回各种视图并不罕见。每个控制器动作应该有一个视图并不是一成不变的。这样我们就会得到代码过多的臃肿视图,从而使它们无法维护。基本上我们会打破MVC模型的整个关注点分离

因此,当您想要从控制器返回特定视图时,您可以在从控制器操作返回时始终提供其名称:

return View("ViewName", model);

我建议您分析并重构您的流程。

答案 1 :(得分:3)

您是否可以创建包含contentModelrevertedContent对象的“父”视图模型?将此新视图模型发送到视图,并检查revertedContent成员是否为空。

public class ParentViewModel
{
    public contentModel content { get; set; }
    public revertedContent reverted { get; set; }
}

然后是视图

<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage<YourNamespace.ParentViewModel>" %>
...
<% if(!Model.reverted) { %>
    //do regular content here
<% } else { %>
    //do reverted content here
<% } %>

答案 2 :(得分:1)

大卫的回答是一个方向。我会考虑在食物链上做一些更高的东西 - 比如让控制器选择视图以及提供视图模型。

答案 3 :(得分:0)

我建议更改您的视图模型设计以允许方案,而不是具有2个不相关的视图模型,确保两者都适合相同的类型

只有您知道哪种设计对您的应用有意义。

我会盲目猜测,并建议您始终可以在视图中使用ContentViewModel。 其中包含IsRevertedInfo属性,您可以在视图中查看以显示任何额外信息