我正在尝试重构编辑器屏幕。编辑器的模型是域模型,我正在转向此屏幕的视图模型,因为如果用户具有某个角色,我只需要允许编辑几个字段。我想使用相同的编辑器视图来创建和编辑模型,尽管这可能是我的问题的一部分。
我在其他地方读过,视图模型应该是简单的,所以在视图模型中不需要类似接口层次结构的东西。但是,如何为两个不同的视图模型使用相同的强类型视图,一个用于创建,一个用于编辑,因为视图模型将具有几乎相同但稍微不同的属性,具体取决于用户角色?
以下是使用我创建的两个视图模型的简化示例:
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)
当我使用域对象作为视图模型时,这就是我所拥有的。
答案 0 :(得分:0)
原来还有另一种思考方式。在我发布这个问题后不久,我做了一些改动,我对结果感到高兴。这是我做的:
View模型现在具有其他bool属性AllowDecisionEdit和AllowStatusEdit。
View模型有两个新的IEnumerable属性DecisionsList和StatusList。
1和2填充在控制器中并传递到适当的视图(创建或编辑)。
创建视图调用Html.BeginForm()然后调用部分Html.Partial(“Controls / RequirementEditor / Editor”)。编辑视图执行相同操作但在部分调用之前添加了Html.HiddenFor(m => Model.Id)以确保编辑表单正常工作。
所以现在我有一个编辑模型,一个编辑器部分表单,两个单独的视图(创建和编辑),每个视图使用相同的部分和相同的编辑器,并且在控制器中打开或关闭功能。我上面的方法闻起来非常非常糟糕,我对任何一个都不满意。一旦我这样做,一切都与世界感觉良好。 :)