在编辑器模板中,使用相同的模型调用另一个编辑器模板

时间:2011-07-25 04:12:38

标签: asp.net-mvc razor nested editortemplates display-templates

我有一个编辑器模板,在该编辑器模板中,我想调用另一个具有相同模型(即嵌套)的编辑器模板,但似乎没有显示。
即。 \ 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){....}),但为了简单起见,我将其从原型中删除了。

1 个答案:

答案 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特性非常有用。