30

我有一个编辑器模板,在该编辑器模板中我想调用另一个具有相同模型(即嵌套)的编辑器模板,但它似乎没有显示。
IE。\EditorTemplates\Template1.cshtml

@model foo

// insert code here to edit the default fields.

// display extra fields via another editor template.
@Html.EditorForModel("Template2")   // or @Html.EditorFor(m => m, "Template2")

和 \EditorTemplates\Template2.cshtml

@model foo

@Html.TextBoxFor(m => m.Name)

我相信有人会问为什么?好吧,只有在满足条件时才会显示嵌套模板(即 @if (@Model.IsConditionMet) { .... } ),但为了简单起见,我将其从原型中删除。

4

1 回答 1

58

简短的回答:

改为使用Html.Partial

因此,在您的 Template1.cshtml 文件中:

@model foo

// insert code here to edit the default fields.

// display extra fields via another editor template.
@Html.Partial("EditorTemplates/Template2", Model)

长答案:

可悲的是,这似乎是设计使然。MVC 会跟踪已经渲染的模型,如果你的模型已经被一个模板渲染过,它就不会做两次,即使模板不同。因此,为什么第二个@Html.EditorForModel("Template2")什么都不做。

具体来说,它ViewData.TemplateInfo.VisitedObjects是在内部字段中跟踪的,因此您在事后修改它是没有希望的。该字段的目的是防止无限递归。高贵,但令人讨厌的是它没有考虑使用的模板。

我通过查看源代码发现了这一点,这对于发现这些奇怪的 MVC 特性非常有用。

于 2014-02-05T15:22:28.820 回答