gpt4 book ai didi

c# - 如何在运行时使用 List 上的 EditorFor() 更改 View

转载 作者:太空宇宙 更新时间:2023-11-03 10:41:25 25 4
gpt4 key购买 nike

我有一个基类

public class BaseQuestionBlock
{
public string Name { get; set; }
public string Description { get; set; }
//more props
}

我有几个继承自此的 View 模型,例如:

public class DefaultQuestionBlock : BaseQuestionBlock
{
public string SomeProp{ get; set; }
}

最后我有一个包含列表的类:

public class MyViewModel    {
public List<BaseQuestionBlock> MyQbs{ get; set; }
//More props
}

我有一个我渲染的 View

@Html.EditorForModel(); //my model is MyViewModel

在 MyViewModel.cshtml 中我有以下内容:

@Html.EditorFor(m => m.MyQbs)

使用每个模型的 View 可以正确显示所有内容。我有一个自定义模型 Binder ,可以正确处理将发布的 qb 转换为正确的类,并且我在 HttpPost 上有一个很好填充的 View 模型。

我想为这个过程添加模式(例如新建、编辑和管理模式)。我的模型将保持不变,但 View 会改变。我目前每个继承的问题 block 有 1 个 View 。所以,我有一个 DefaultQuestionBlock.cshtml,也许还有一个 SpecialQuestionBlock.cshtml。

我想要一个 EditDefaultQuestionBlock.cshtml、NewDefaultQuestionBlock.cshtml 和一个 AdminDefaultQuestionBlock.cshtml。

是否可以使用 MVC 中的现有约定来强制使用哪个模板?

  • 我在想也许我可以在运行时以某种方式在 DefaultQuestionBlock 的实例上设置 UIHint,但这似乎不可能。

  • 我知道我可以轻松地向基础模型添加 Mode 属性,在我实例化类时设置该属性,然后在我的 DefaultQuestionBlock.cshtml View 中添加 if (mode == MyModes.Edit) 类型逻辑,但我认为这使我的 View 与业务逻辑混淆。我宁愿有两个不同的观点。

  • 我知道如果我要在单个问题 block 上使用 EditorFor,我可以在运行时传入模板,但我不知道如何在列表上执行此操作:

    @Html.EditorFor(m => m.DefaultQuestionBlock, "EditDefaultQuestionBlock")

  • 我意识到我也可以有多个 View 模型(例如 AdminDefaultQuestionBlock、EditDefaultQuestionBlock),然后有一个对应于每个模型的 View ,但这似乎有点过分,因为模型属性不会跨模式改变他们的安全。

最佳答案

除非您继续为每个“模式”实现这些 View 模型,否则不会有基于约定的方式,我同意这似乎有点矫枉过正。但是,您始终可以手动指定它应该使用的模板。例如:

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

显然,您可以将模板放在任何您喜欢的地方。我也不确定那里实际需要多少路径,所以我继续安全地指定了整个路径。如果它位于 Razor 能够根据其上下文找到它的正确位置,那么您可能只需 "AdminDefaultQuestionBlock" 即可。你可以玩弄它。

关于c# - 如何在运行时使用 List<T> 上的 EditorFor() 更改 View ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25207099/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com