8

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

区域/帖子/视图/共享/EditorTemplates/Question.cshtml

我也有一个:

/Views/Shared/EditorTemplates/Question.cshtml

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

我要做的是在该区域的视图中,在该Posts区域调用我的编辑器模板,设置一些 HTML,然后返回到主共享编辑器模板。

这是Posts编辑器模板:

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

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

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

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

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

本质上,我试图在共享模板中重用 HTML,但注入一些我自己的偷偷摸摸的 HTML。

4

2 回答 2

10

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

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

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

@Html.EditorFor(x => x.Question, "~/Views/Shared/EditorTemplates/Question.cshtml")
于 2011-11-17T07:09:15.650 回答
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()
于 2011-11-17T23:10:18.243 回答