如何在运行时使用List上的EditorFor()更改视图?
本文关键字:EditorFor 上的 视图 运行时 List | 更新日期: 2023-09-27 18:17:20
我有一个基类
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中。我有以下内容:
@Html.EditorFor(m => m.MyQbs)
使用每个模型的视图,一切都正确显示。我有一个自定义模型绑定器,可以正确处理将发布的qb转换为正确的类,并且我在HttpPost上有一个很好的填充视图模型。
我想在这个过程中添加模式(例如新建,编辑和管理模式)。我的模型将保持不变,但视图将改变。我目前每个继承的问题块有一个视图。我有一个DefaultQuestionBlock。也许还有一个SpecialQuestionBlock.cshtml。
我想有一个EditDefaultQuestionBlock。cshtml NewDefaultQuestionBlock。和一个AdminDefaultQuestionBlock.cshtml。
使用MVC中现有的约定是否有办法强制使用什么模板?
我想也许我可以在运行时以某种方式在DefaultQuestionBlock的实例上设置UIHint,但这似乎是不可能的。
我知道我可以很容易地添加一个模式属性到基本模型,设置当我实例化类,然后在我的DefaultQuestionBlock。cshtml视图添加
if (mode == MyModes.Edit)
类型逻辑,但我认为这混淆了我的业务逻辑视图。我宁愿有两种不同的看法。我知道如果我在一个单一的问题块上使用EditorFor,我可以在运行时通过模板,但是,我不知道我如何在列表上做到这一点:
@Html。EditorFor(m => m. defaultquestionblock, "EditDefaultQuestionBlock")
我意识到我也可以有多个视图模型(例如AdminDefaultQuestionBlock, EditDefaultQuestionBlock),然后有一个视图,对应于每一个这些,但这似乎有点过分,因为模型属性不改变模式只是对他们的安全性。
除非您继续为每个"模式"实现那些视图模型,否则不会有基于约定的方法,我同意这似乎有点小题大做。但是,您总是可以手动指定它应该使用的模板。例如:
@Html.EditorForModel("~'Views'Shared'EditorTemplates'AdminDefaultQuestionBlock.cshtml")
显然,你可以把模板放在任何你喜欢的地方。我也不确定这里到底需要多少路径,所以我选择了安全起见,指定了整个路径。你也许可以得到少如"AdminDefaultQuestionBlock"
,如果它是在正确的位置,剃刀能够找到它基于它所拥有的上下文。你可以随意调整
我仍然在寻找解决这个问题的方法,但是现在我会使用@Html。根据用户的角色/安全权限返回不同部分视图的操作。例如,如果你通常总是有三个"角色",你可以使用一个命名约定,允许你返回一个附加代码的viewname,这样你就可以返回像
这样的东西。return PartialView("_DefaultQuestionsBlock" + Mode);