Diseño de encabezado de páginas:
<head>
<link href="@Url.Content("~/Content/themes/base/Site.css")"
rel="stylesheet" type="text/css" />
</head>
Una vista (AnotherView) de la aplicación necesita:
<link href="@Url.Content("~/Content/themes/base/AnotherPage.css")"
rel="stylesheet" type="text/css" />
y AnotherView tiene una vista parcial (AnotherPartial) que necesita:
<link href="@Url.Content("~/Content/themes/base/AnotherPartial.css")"
rel="stylesheet" type="text/css" />
Pregunta: ¿Cómo podemos agregar estos enlaces de archivos CSS a los enlaces AnotherView y AnotherPartial al encabezado de diseño ?
RenderSection no es una buena idea porque AnotherPage puede tener más de un Parciales. Agregar todo CSS al encabezado no es útil porque cambiará dinámicamente (depende de Anotherpages).
asp.net-mvc
asp.net-mvc-3
razor
Nuri YILMAZ
fuente
fuente
Respuestas:
Diseño:
Ver:
fuente
AddToHead
sección está en una vista parcial incrustada enView
.Actualización : ejemplo básico disponible en https://github.com/speier/mvcassetshelper
Estamos utilizando la siguiente implementación para agregar archivos JS y CSS en la página de diseño.
Vista o Vista parcial:
Página de diseño:
Extensión HtmlHelper:
fuente
Insert
métodos conAdd
métodos[ThreadStatic]
, o, preferiblemente, almacenado enHttpContext.Items
.Lamentablemente, esto no es posible por defecto a usar
section
como otro usuario sugirió, ya que unasection
está disponible sólo a lo inmediatochild
de unView
.Sin embargo, lo que funciona es implementar y redefinir
section
en cada vista , lo que significa:De esta manera, cada vista puede implementar una sección principal, no solo los elementos secundarios inmediatos. Sin embargo, esto solo funciona en parte, especialmente con múltiples parciales que comienzan los problemas (como ha mencionado en su pregunta).
Entonces, la única solución real a su problema es usar el
ViewBag
. Lo mejor probablemente sería una colección separada (lista) para CSS y scripts. Para que esto funcione, debe asegurarse de que loList
utilizado se inicialice antes de ejecutar cualquiera de las vistas. Entonces puede hacer cosas como esta en la parte superior de cada vista / parcial (sin importar si el valorScripts
oStyles
es nulo:En el diseño, puede recorrer las colecciones y agregar los estilos basados en los valores de
List
.Creo que es feo, pero es lo único que funciona.
****** ACTUALIZACIÓN **** Dado que primero comienza a ejecutar las vistas internas y avanza hacia el diseño y los estilos CSS están en cascada, probablemente tendría sentido invertir la lista de estilos a través de
ViewBag.Styles.Reverse()
.De esta manera, se agrega primero el estilo más externo, que está en línea con la forma en que funcionan las hojas de estilo CSS.
fuente
Puede definir la sección por el método RenderSection en el diseño.
Diseño
Luego puede incluir sus archivos css en el área de sección en su vista, excepto la vista parcial .
La sección funciona a la vista, pero no funciona en vista parcial por diseño .
Si realmente desea utilizar el área de sección en vista parcial, puede seguir el artículo para redefinir el método RenderSection.
Maquinilla de afeitar, diseños anidados y secciones redefinidas - Marcin en ASP.NET
fuente
Tuve un problema similar y terminé aplicando la excelente respuesta de Kalman con el código a continuación (no tan ordenado, pero podría decirse que más expansible):
El proyecto contiene un método estático AssignAllResources:
en la página _layout
y en los parciales y vistas
fuente
Traté de resolver este problema.
Mi respuesta esta aquí.
"DynamicHeader" - http://dynamicheader.codeplex.com/ , https://nuget.org/packages/DynamicHeader
Por ejemplo, _Layout.cshtml es:
Y puede registrar archivos .js y .css en "DynamicHeader" en cualquier lugar que desee.
Por ejemplo, el bloque de código en AnotherPartial.cshtm es:
Entonces, finalmente el HTML de salida es:
fuente
Pruebe la solución lista para usar (ASP.NET MVC 4 o posterior):
fuente
CS0103: The name 'BundleTable' does not exist in the current context
System.Web.Optimization
es decirSystem.Web.Optimization.BundleTable.Bundles.GetRegisteredBundles().First(b => b.Path == "~/bundles/css");
Para aquellos de nosotros que usamos ASP.NET MVC 4, esto puede ser útil.
Primero, agregué una clase BundleConfig en la carpeta App_Start.
Aquí está mi código que usé para crearlo:
En segundo lugar, registré la clase BundleConfig en el archivo Global.asax:
Tercero, agregué ayudantes de estilo al mi archivo CSS:
Finalmente utilicé esta sintaxis en cualquier Vista:
fuente
Aquí hay un complemento NuGet llamado Cassette , que entre otras cosas le brinda la capacidad de hacer referencia a scripts y estilos en parciales.
Aunque hay una serie de configuraciones disponibles para este complemento, lo que lo hace altamente flexible. Aquí está la forma más simple de referir archivos de script u hojas de estilo:
De acuerdo con la documentación :
fuente
Escribí un contenedor fácil que le permite registrar estilos y secuencias de comandos en cada vista parcial de forma dinámica en la etiqueta principal.
Se basa en el DynamicHeader jsakamoto presentado, pero tiene algunas mejoras de rendimiento y ajustes.
Es muy fácil de usar y versátil.
El uso:
Puede encontrar el código completo, explicaciones y ejemplos en el interior: Agregar estilos y secuencias de comandos dinámicamente a la etiqueta de encabezado
fuente