asp.net mvc - ventajas - En una plantilla de editor, llame a otra plantilla de editor con el mismo modelo
ventajas de mvc (1)
Tengo una plantilla de editor y dentro de esa plantilla de editor quiero llamar a otra plantilla de editor con el mismo modelo (es decir, anidado), pero no parece mostrar.
es decir. / 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")
y / EditorTemplates / Template2.cshtml
@model foo
@Html.TextBoxFor(m => m.Name)
Estoy seguro de que alguien preguntará por qué? Bueno, la plantilla anidada solo se mostrará si se cumple una condición (es decir, @if (@ Model.IsConditionMet) {....}), pero lo he dejado fuera de mi prototipo por simplicidad.
Respuesta corta:
Use Html.Partial
en Html.Partial
lugar.
Entonces, en su archivo Template1.cshtml:
@model foo
// insert code here to edit the default fields.
// display extra fields via another editor template.
@Html.Partial("EditorTemplates/Template2", Model)
Respuesta larga:
Esto tristemente parece ser por diseño. MVC rastrea los modelos que se han renderizado, y si su modelo ya ha sido renderizado por una plantilla, no lo hará dos veces, incluso si la plantilla es diferente. De ahí que el segundo @Html.EditorForModel("Template2")
simplemente no haga nada.
Específicamente, se rastrea en ViewData.TemplateInfo.VisitedObjects
, que es un campo interno, por lo que no hay esperanza de que lo modifique después de los hechos. La intención de este campo es prevenir la recursión infinita. Noble, pero molesto porque no toma en cuenta la plantilla utilizada.
Descubrí esto al mirar el código fuente , que es genial para encontrar estas extrañas idiosincrasias de MVC.