我有一个基类
public class BaseQuestionBlock
{
public string Name { get; set; }
public string Description { get; set; }
//more props
}
我有几个继承自此的视图模型,例如:
public class DefaultQuestionBlock : BaseQuestionBlock
{
public string SomeProp{ get; set; }
}
最后我有一个包含List的类:
public class MyViewModel {
public List<BaseQuestionBlock> MyQbs{ get; set; }
//More props
}
我有一个我渲染的视图
@Html.EditorForModel(); //my model is MyViewModel
在MyViewModel.cshtml中,我有以下内容:
@Html.EditorFor(m => m.MyQbs)
使用每个模型的视图正确显示所有内容。我有一个自定义模型绑定器,正确处理将发布的qb转换为正确的类,我在HttpPost上有一个很好的填充视图模型。
我想在此过程中添加模式(例如,新建,编辑和管理模式)。我的模型将保持不变,但视图将发生变化。我目前每个继承的问题块有1个视图。所以,我有一个DefaultQuestionBlock.cshtml,也许是一个SpecialQuestionBlock.cshtml。
我想要一个EditDefaultQuestionBlock.cshtml,NewDefaultQuestionBlock.cshtml和一个AdminDefaultQuestionBlock.cshtml。
使用MVC中的现有约定是否有办法强制使用哪个模板?
我在想,也许我可以在运行时以某种方式在DefaultQuestionBlock的实例上设置UIHint,但这似乎不太可能。
我知道我可以轻松地将一个Mode属性添加到基本模型中,设置当我实例化该类时,然后在我的DefaultQuestionBlock.cshtml视图中添加if (mode == MyModes.Edit)
类型逻辑,但我认为这会混淆我的视图与业务逻辑。我宁愿有两个不同的观点。
我知道如果我在单个Question块上使用EditorFor,我可以在运行时传入模板,但是,我不知道如何在List上执行此操作:
@ Html.EditorFor(m =&gt; m.DefaultQuestionBlock,“EditDefaultQuestionBlock”)
我意识到我也可以有多个视图模型(例如AdminDefaultQuestionBlock,EditDefaultQuestionBlock),然后有一个对应于其中每一个的视图,但这似乎有点矫枉过正,因为模型属性不会在模式之间发生变化他们的安全。
答案 0 :(得分:1)
除非你继续为每个&#34;模式&#34;实现这些视图模型,否则不会成为基于约定的方式,我认为这似乎有些过分。但是,您始终可以手动指定应使用的模板。例如:
@Html.EditorForModel("~\Views\Shared\EditorTemplates\AdminDefaultQuestionBlock.cshtml")
显然,您可以将模板放在任何您喜欢的位置。我也不确定那里实际需要多少路径,所以我继续前进并安全地指定了整个事情。如果它恰好位于Razor能够根据它具有的上下文找到它的正确位置,你可能会尽可能地逃脱"AdminDefaultQuestionBlock"
。你可以玩它。
答案 1 :(得分:1)
我仍然可以找到解决方法,但是现在我会使用@Html.Action,根据用户的角色/安全权限返回不同的部分视图。例如,如果您通常总是有三个角色,则可以使用命名约定,该约定允许您返回附加代码的视图名称,以便您可以返回类似
的内容。return PartialView("_DefaultQuestionsBlock" + Mode);