2011-05-12 10 views
13

Así que tiene una página de diseñoMVC3 Diseño de página, Ver, renderPartial y obtener archivos de script en el encabezado (desde el punto de vista parcial)

<head> 
    @RenderSection("HeaderLast", required: false) 
</head> 

Una vista

@section HeaderLast 
{ 
    <script src="@Url.Content("~/Scripts/knockout-1.2.0.js")" 
          type="text/javascript"></script> 
} 

<div id="profile-tab"> 
     @{ Html.RenderPartial("_userProfile"); } 
</div> 

y una vista parcial

@section HeaderLast 
{ 
    <script type="text/javascript"> 
     alert('test'); 
    </script> 
} 

<div...... 

Pensé que no podía ser así de simple. ¿Hay una forma adecuada de hacer esto fuera de la caja o esto siempre requerirá algún tipo de mediador y pasar cosas alrededor de ViewData para hacer que el contenido salte manualmente a la página de diseño?

Bounty comenzada: La recompensa se recompensará con la mejor solución provista para este corto plazo. Si no se proporcionan respuestas, se lo otorgaré a @SLaks por haber respondido originalmente esta pregunta.

+0

la sección debe definirse en la página actual para que el marco sepa que se ha solucionado el problema. – iwayneo

+2

No entiendo la pregunta: ¿qué intentas hacer y qué intentas eliminar? –

+0

@cvista la sección se define en LayoutPage porque ahí es donde está el encabezado. @Danny Tuppeny Quiero acceder al encabezado desde la vista parcial –

Respuesta

8

No puede definir secciones en vistas parciales.

En su lugar, puede poner el Javascript en ViewBag, luego emitir cualquier Javascript que se encuentre en ViewBag en la página de diseño.

+0

¿Alguien hace un nuget para esto todavía? es una falla de diseño bastante evidente. –

+0

@Chris - ¿Por qué crees que es un defecto de diseño evidente? – JasCav

+1

@JasCav: si un parcial necesita su propio CSS, no tiene una buena manera de obtenerlo. – SLaks

6

@JasCav: Si un parcial necesita su propio CSS, no tiene una buena manera de obtenerlo.

Si ese es el motivo de su uso, bien podría ser por diseño.

No desea tener un archivo CSS separado x parcial/auxiliar. Recuerde, cada archivo CSS por separado significa una solicitud por separado para obtenerlo del servidor, por lo tanto, un viaje de ida y vuelta adicional que afecta el tiempo para mostrar su página.

También no desea emitir CSS directo al HTML desde el parcial/ayudante. En su lugar, desea que tenga los enlaces adecuados que puede usar para definir todo el aspecto en el archivo CSS de su sitio.

Puede utilizar los mismos ganchos que tiene disponibles para CSS para activar comportamientos JavaScript personalizados para los elementos involucrados Cuando JavaScript está habilitado.

Finalmente, puede ser que lo que necesite no sea una vista parcial, sino un diseño adicional que use para algunas páginas. Con ese enfoque, tendría:

  • Un diseño maestro que se configura automáticamente en _ViewStart como probablemente lo haya hecho ahora. Esto define las secciones como en tu muestra.
  • Una página de diseño para niños. Aquí tiene los html, css, js adicionales que necesita para estas vistas. Esto usa @RenderBody() y @section SomeSection {} para estructurar el diseño extra común.
  • Algunas vistas que apuntan al diseño de los niños, y otras que usan el diseño maestro predeterminado.

Cómo obtener datos adicionales para los niños El diseño está fuera del alcance de la pregunta, pero tiene varias opciones. Como tener una base común para tus entidades; utilizando ViewBag o llamando a Html.RenderAction para obtener esa lógica compartida relacionada con elementos dinámicos compartidos en el diseño.

+0

El uso de las páginas de diseño múltiple para esto parece que sería un ejercicio de mantenimiento de pesadilla. –

+1

He utilizado el enfoque y ha fluido muy bien a medida que el código evoluciona. La forma específica en que lo hice es "llamar a Html.RenderAction para obtener esa lógica compartida relacionada con elementos dinámicos compartidos en el diseño". Lo prefiero más que tener una vista parcial hacer una Html.RenderAction; tener que tratar con datos adicionales en acciones no relacionadas para que fluya a las vistas parciales o utilizando un enfoque sin tipo para pasar los datos. Su muestra es demasiado genérica, por lo que es difícil de decir, desafíe la noción de que esa pieza pertenezca a una vista parcial/tal vez sea realmente parte de un diseño común. – eglasius

+0

Tenga en cuenta que las vistas parciales reales generalmente caen en los primeros escenarios en mi respuesta, por lo que también cuestionan si ese script/css debe invocarse desde esa vista parcial frente a los archivos css/js a nivel del sitio que se enganchan en ella. Dicho esto, hay demasiados escenarios, puede tener un caso donde hacer lo que está tratando de hacer es el mejor enfoque. – eglasius

1

Parece que hubo una pregunta similar en SO - How to render JavaScript into MasterLayout section from partial view?.

Desafortunadamente, no hay posibilidad de declarar secciones dentro de Vistas parciales. Eso es porque RenderPartial termina representando una página de vista totalmente separada. Hay un workaround a esto, aunque un poco feo. Pero puede verse mejor si se usa un modelo fuertemente tipado en lugar de ViewData.

Básicamente, debe hacer un seguimiento de la referencia a la vista que llamó a RenderPartial y utilizar el método DefineSection en el objeto pasado para enviar datos a esa vista.

ACTUALIZACIÓN: También hay un blog post sobre tratar con RenderSection que puede serle útil.

+0

El hilo de solución que publicó definitivamente tiene cierto potencial, aún tengo que revisar los otros enlaces. –

0

Como continuación a mi pregunta, el/CSS herramienta combinador/Minifier JavaScript Cassette soporta esta funcionalidad que le permite compartimentar el JavaScript y otros activos que se requieren para parciales.

Compré una licencia de sitio y la uso en todas mis aplicaciones MVC ahora.

Cuestiones relacionadas