我正在尝试重构编辑器屏幕。编辑器的模型是域模型,我将转到此屏幕的视图模型,因为如果用户具有特定角色,我只需要允许编辑几个字段。我想使用相同的编辑器视图来创建和编辑模型,尽管这可能是我的问题的一部分。
我在 SO 上的其他地方读到过,视图模型应该是简单的,因此视图模型中不需要像接口层次结构之类的东西。但是,我如何为两种不同的视图模型使用相同的强类型视图,一种用于创建,一种用于编辑,因为视图模型将具有几乎相同但略有不同的属性,具体取决于用户角色?
这是一个使用我创建的两个视图模型的简化示例:
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 ...
}
这两个视图模型是相同的,除了 Edit 模型有两个额外的属性Decision和Status只能由具有适当角色的人设置。我使用 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)
当我使用域对象作为视图模型时,这就是我所拥有的。