如何为创建和编辑视图模型使用相同的强类型编辑器视图?

时间:2013-01-10 16:42:22

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

我正在尝试重构编辑器屏幕。编辑器的模型是域模型,我正在转向此屏幕的视图模型,因为如果用户具有某个角色,我只需要允许编辑几个字段。我想使用相同的编辑器视图来创建和编辑模型,尽管这可能是我的问题的一部分。

我在其他地方读过,视图模型应该是简单的,所以在视图模型中不需要类似接口层次结构的东西。但是,如何为两个不同的视图模型使用相同的强类型视图,一个用于创建,一个用于编辑,因为视图模型将具有几乎相同但稍微不同的属性,具体取决于用户角色?

以下是使用我创建的两个视图模型的简化示例:

public class RequirementCreateView
{
    public int Id { get; set; }
    public string Name { get; set; }
    public string Justification { get; set; }
    public string ImpactIfNotFunded { get; set; }
    ... etc for about 40 properties ...
}

public class RequirementEditView
{
    public int Id { get; set; }
    public string Name { get; set; }
    public string Justification { get; set; }
    public string ImpactIfNotFunded { get; set; }
    public string Decision { get; set; }
    public string Status { get; set; }
    ... etc for about 40 properties ...
}

两个视图模型完全相同,只是编辑模型有两个额外属性决策状态,只能由具有相应角色的人员设置。我使用AutoMapper从域Requirement对象映射到视图模型,反之亦然,用于创建/更新操作。

然而,现在我有两个视图模型显然我不能使用单个强类型编辑器屏幕,因为ValidationMessageFor(m => Model.Name)之类的东西不起作用。这导致我考虑这组视图模型的接口层次结构,如下所示:

IRequirementEditorView             -->  common properties
    |--> IRequirementCreateView    -->  create-specific properties (none right now)
    |--> IRequirementEditView      -->  edit-specific properties

然后让编辑器视图屏幕引用IRequirementEditorView。但同样,这与简单化视图模型的当前智慧相悖。但是另一种方法是复制我的编辑器屏幕,这违反了DRY。

这显然是一个常见的问题,但我现在很难过。有什么建议吗?

感谢。

编辑我应该在查看其他一些类似的帖子之后澄清:当我说我正在使用“相同”编辑器视图屏幕时,我使用两个单独的视图,Create.cshtml和Edit .cshtml。然后,每个都简单地引用包含实际编辑器形式的部分视图,如下所示:

@Html.Partial("Controls/RequirementEditor", Model, ViewData)

当我使用域对象作为视图模型时,这就是我所拥有的。

1 个答案:

答案 0 :(得分:0)

原来还有另一种思考方式。在我发布这个问题后不久,我做了一些改动,我对结果感到高兴。这是我做的:

  1. View模型现在具有其他bool属性AllowDecisionEdit和AllowStatusEdit。

  2. View模型有两个新的IEnumerable属性DecisionsList和StatusList。

  3. 1和2填充在控制器中并传递到适当的视图(创建或编辑)。

  4. 创建视图调用Html.BeginForm()然后调用部分Html.Partial(“Controls / RequirementEditor / Editor”)。编辑视图执行相同操作但在部分调用之前添加了Html.HiddenFor(m => Model.Id)以确保编辑表单正常工作。

  5. 所以现在我有一个编辑模型,一个编辑器部分表单,两个单独的视图(创建和编辑),每个视图使用相同的部分和相同的编辑器,并且在控制器中打开或关闭功能。我上面的方法闻起来非常非常糟糕,我对任何一个都不满意。一旦我这样做,一切都与世界感觉良好。 :)