我有一个编辑器模板,在该编辑器模板中,我想调用另一个具有相同模型(即嵌套)的编辑器模板,但似乎没有显示。
即。 \ 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){....}),但为了简单起见,我将其从原型中删除了。
答案 0 :(得分:52)
简答:
改为使用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
中跟踪的,这是一个内部字段,所以在你事后修改它是没有希望的。该字段的目的是防止无限递归。高贵,但很烦人,因为它没有考虑使用的模板。
我通过查看source code找到了这个,这对于找到这些奇怪的MVC特性非常有用。