Inyectar contenido en secciones específicas desde una vista parcial ASP.NET MVC 3 con Razor View Engine
Tengo esta sección definida en mi_Layout.cshtml
@RenderSection("Scripts", false)
Puedo usarlo fácilmente desde una vista:
@section Scripts {
@*Stuff comes here*@
}
Lo que estoy luchando es cómo insertar contenido dentro de esta sección desde una vista parcial.
Supongamos que esta es mi página de visualización:
@section Scripts {
<script>
//code comes here
</script>
}
<div>
poo bar poo
</div>
<div>
@Html.Partial("_myPartial")
</div>
Necesito inyectar contenido dentro de la Scripts
sección desde _myPartial
una vista parcial.
¿Cómo puedo hacer esto?
Las secciones no funcionan en vistas parciales y eso es por diseño. Puede utilizar algunos ayudantes personalizados para lograr un comportamiento similar, pero, sinceramente, es responsabilidad de la vista incluir los scripts necesarios, no responsabilidad parcial. Recomendaría usar la sección @scripts de la vista principal para hacer eso y no tener que los parciales se preocupen por los scripts.
Esta es una pregunta bastante popular, así que publicaré mi solución.
Tuve el mismo problema y aunque no es ideal, creo que funciona bastante bien y no hace que el parcial dependa de la vista.
Mi escenario era que se podía acceder a una acción por sí misma pero que también se podía incrustar en una vista: un mapa de Google.
En mi _layout
tengo:
@RenderSection("body_scripts", false)
En mi index
opinión tengo:
@Html.Partial("Clients")
@section body_scripts
{
@Html.Partial("Clients_Scripts")
}
En mi clients
opinión tengo (todo el mapa y asoc. html):
@section body_scripts
{
@Html.Partial("Clients_Scripts")
}
Mi Clients_Scripts
vista contiene el javascript que se mostrará en la página.
De esta manera, mi secuencia de comandos está aislada y se puede representar en la página donde sea necesario, y la body_scripts
etiqueta solo se representa en la primera aparición que el motor de vista de afeitar la encuentra.
Eso me permite tener todo separado: es una solución que funciona bastante bien para mí, otros pueden tener problemas con ella, pero soluciona el agujero "por diseño".