首页 文章

我是否可以在“区域”编辑器模板中为同一模型调用“共享”编辑器模板?

提问于
浏览
8

我有一个编辑器模板位置:

Areas/Posts/Views/Shared/EditorTemplates/Question.cshtml

我也有一个:

/Views/Shared/EditorTemplates/Question.cshtml

对于两者,模型是相同的.

我想要做的是在Posts区域的 View 中,在区域中调用我的编辑器模板,设置一些 HTML 然后冒泡回到主共享编辑器模板。

这是Posts EditorTemplate:

@model xxx.ViewModels.QuestionViewModel
@Html.Hidden("Id", (byte)Model.QuestionType)
@Html.EditorForModel()

但它只是渲染了隐藏字段,而不是共享编辑器模板的内容。

如果我摆脱了Posts编辑器模板,则会正确呈现共享模板。

我猜 MVC/Razor 认为这是递归的还是什么?就像我调用相同的模板?

有什么方法我可以告诉它去共享的吗?

从本质上讲,我试图在共享模板中使用 re-use HTML,但是注入一些我自己的偷偷摸摸的 HTML。

2 回答

  • 10

    对于给定类型,您只能在运行时使用 1 个模板。 ASP.NET MVC 首先查看区域共享模板文件夹,因为它找到了相应的模板,所以它会选择它并使用它。然后它停止查看,并且从未使用放在主共享文件夹中的模板。这是设计的。

    有什么方法我可以告诉它去共享的吗?

    是的,您可以明确指定模板的位置,但不会在区域文件夹中使用该模板:

    @Html.EditorFor(x => x.Question, "~/Views/Shared/EditorTemplates/Question.cshtml")
    
  • 2

    由于共享编辑器模板的 HTML 标记非常简单(只是呈现了一个复选框和一个标签),我将标记抽象为自定义 HTML 帮助程序,然后从共享模板和我的区域模板中调用它。

    ~/Areas/Posts/Views/Shared/EditorTemplates/Question.cshtml :

    @model xxx.ViewModels.QuestionViewModel
    @Html.Hidden("Id", (byte)Model.QuestionType)
    @Html.QuestionCheckBoxForModel()
    @Html.QuestionLabelForModel()
    

    ~/Views/Shared/EditorTemplates/Question.cshtml :

    @model xxx.ViewModels.QuestionViewModel
    @Html.QuestionCheckBoxForModel()
    @Html.QuestionLabelForModel()
    

相关问题