Cabeçalho das páginas de layout:
<head>
<link href="@Url.Content("~/Content/themes/base/Site.css")"
rel="stylesheet" type="text/css" />
</head>
Uma Visualização (AnotherView) do aplicativo precisa:
<link href="@Url.Content("~/Content/themes/base/AnotherPage.css")"
rel="stylesheet" type="text/css" />
e AnotherView tem uma vista parcial (AnotherPartial) que precisa de:
<link href="@Url.Content("~/Content/themes/base/AnotherPartial.css")"
rel="stylesheet" type="text/css" />
Pergunta: Como podemos adicionar esses links de arquivos CSS para os links AnotherView e AnotherPartial no cabeçalho Layout ?
RenderSection não é uma boa ideia, porque o AnotherPage pode ter mais de um Partials. Adicionar todo o CSS ao cabeçalho não é útil porque ele muda dinamicamente (depende de outras páginas).
asp.net-mvc
asp.net-mvc-3
razor
Nuri YILMAZ
fonte
fonte
Respostas:
Layout:
Visão:
fonte
AddToHead
seção estiver em uma exibição parcial incorporada noView
.Atualização : exemplo básico disponível em https://github.com/speier/mvcassetshelper
Estamos usando a seguinte implementação para adicionar arquivos JS e CSS à página de layout.
Vista ou Vista Parcial:
Página de layout:
Extensão HtmlHelper:
fonte
Insert
métodos com osAdd
métodos[ThreadStatic]
, ou, de preferência, armazenado emHttpContext.Items
.Infelizmente, isso não é possível por padrão para usar
section
como outro usuário sugeriu, uma vez que asection
está disponível apenas para o imediatochild
de aView
.No entanto, o que funciona é implementar e redefinir o
section
em todas as visualizações , o que significa:Dessa forma, toda visualização pode implementar uma seção principal, não apenas os filhos imediatos. Porém, isso funciona apenas parcialmente, especialmente com várias parciais que os problemas começam (como você mencionou na sua pergunta).
Portanto, a única solução real para o seu problema é usar o
ViewBag
. O melhor seria provavelmente uma coleção separada (lista) para CSS e scripts. Para que isso funcione, é necessário garantir que oList
usado seja inicializado antes que qualquer uma das visualizações seja executada. Em seguida, você pode fazer coisas assim na parte superior de todas as visualizações / parciais (sem se preocupar se o valorScripts
ouStyles
é nulo:No layout, você pode percorrer as coleções e adicionar os estilos com base nos valores em
List
.Eu acho feio, mas é a única coisa que funciona.
****** UPDATE **** Desde que começa a executar as visualizações internas primeiro e a trabalhar para o layout e os estilos CSS estão em cascata, provavelmente faria sentido reverter a lista de estilos por meio de
ViewBag.Styles.Reverse()
.Dessa forma, o estilo mais externo é adicionado primeiro, o que está alinhado com o funcionamento das folhas de estilo CSS.
fonte
Você pode definir a seção pelo método RenderSection no layout.
Layout
Em seguida, você pode incluir seus arquivos css na área de seção da sua exibição, exceto a exibição parcial .
A seção funciona em exibição, mas não funciona em exibição parcial por design .
Se você realmente deseja usar a área de seção em vista parcial, siga o artigo para redefinir o método RenderSection.
Navalha, layouts aninhados e seções redefinidas - Marcin no ASP.NET
fonte
Eu tive um problema semelhante e acabei aplicando a excelente resposta de Kalman com o código abaixo (não tão elegante, mas sem dúvida mais expansível):
O projeto contém um método estático AssignAllResources:
na página _layout
e nas parciais e visualizações
fonte
Eu tentei resolver esse problema.
Minha resposta está aqui.
"DynamicHeader" - http://dynamicheader.codeplex.com/ , https://nuget.org/packages/DynamicHeader
Por exemplo, _Layout.cshtml é:
E você pode registrar arquivos .js e .css no "DynamicHeader" qualquer lugar que desejar.
Por exemplo, o bloco de código em AnotherPartial.cshtm é:
Então, finalmente, o HTML de saída é:
fonte
Experimente a solução pronta para uso (ASP.NET MVC 4 ou posterior):
fonte
CS0103: The name 'BundleTable' does not exist in the current context
System.Web.Optimization
ieSystem.Web.Optimization.BundleTable.Bundles.GetRegisteredBundles().First(b => b.Path == "~/bundles/css");
Para aqueles que usam o ASP.NET MVC 4 - isso pode ser útil.
Primeiro, adicionei uma classe BundleConfig na pasta App_Start.
Aqui está o meu código que eu usei para criá-lo:
Segundo, registrei a classe BundleConfig no arquivo Global.asax:
Terceiro, adicionei ajudantes de estilo ao meu arquivo CSS:
Por fim, usei essa sintaxe em qualquer modo de exibição:
fonte
Aqui está um plugin do NuGet chamado Cassette , que, entre outras coisas, fornece a capacidade de referenciar scripts e estilos em parciais.
Embora haja várias configurações disponíveis para este plugin, o que o torna altamente flexível. Aqui está a maneira mais simples de consultar arquivos de script ou de folha de estilo:
De acordo com a documentação :
fonte
Escrevi um invólucro fácil que permite registrar estilos e scripts em todas as visualizações parciais dinamicamente na tag head.
Ele é baseado no DynamicHeader jsakamoto, mas apresenta algumas melhorias e ajustes de desempenho.
É muito fácil de usar e versátil.
O uso:
Você pode encontrar o código completo, explicações e exemplos dentro: Adicione estilos e scripts dinamicamente ao cabeçalho
fonte