如何在运行时使用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),然后有一个视图,对应于每一个这些,但这似乎有点过分,因为模型属性不改变模式只是对他们的安全性。

如何在运行时使用List<T>上的EditorFor()更改视图?

除非您继续为每个"模式"实现那些视图模型,否则不会有基于约定的方法,我同意这似乎有点小题大做。但是,您总是可以手动指定它应该使用的模板。例如:

@Html.EditorForModel("~'Views'Shared'EditorTemplates'AdminDefaultQuestionBlock.cshtml")

显然,你可以把模板放在任何你喜欢的地方。我也不确定这里到底需要多少路径,所以我选择了安全起见,指定了整个路径。你也许可以得到少如"AdminDefaultQuestionBlock",如果它是在正确的位置,剃刀能够找到它基于它所拥有的上下文。你可以随意调整

我仍然在寻找解决这个问题的方法,但是现在我会使用@Html。根据用户的角色/安全权限返回不同部分视图的操作。例如,如果你通常总是有三个"角色",你可以使用一个命名约定,允许你返回一个附加代码的viewname,这样你就可以返回像

这样的东西。
return PartialView("_DefaultQuestionsBlock" + Mode);