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

tke*_*ood 28 asp.net-mvc nested editortemplates razor 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")
Run Code Online (Sandbox Code Playgroud)

和\ EditorTemplates\Template2.cshtml

@model foo

@Html.TextBoxFor(m => m.Name)
Run Code Online (Sandbox Code Playgroud)

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

Ber*_*hus 54

简短回答:

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)
Run Code Online (Sandbox Code Playgroud)

答案很长:

遗憾的是,这似乎是设计上的.MVC跟踪已渲染的模型,如果模型已经由模板渲染,即使模板不同,它也不会执行两次.因此,为什么第二个@Html.EditorForModel("Template2")什么都不做.

具体来说,它被跟踪ViewData.TemplateInfo.VisitedObjects,这是一个内部领域,所以你没有希望在事后修改它.该字段的目的是防止无限递归.贵族,但很烦人,因为它没有考虑使用的模板.

我通过查看源代码找到了这个,这对于找到MVC的这些奇怪的特性非常有用.

  • 非常有帮助的答案,谢谢你的研究! (3认同)
  • 这应该标记为答案.工作很好. (2认同)