Układ nagłówków stron:
<head>
<link href="@Url.Content("~/Content/themes/base/Site.css")"
rel="stylesheet" type="text/css" />
</head>
Widok (AnotherView) z aplikacji wymaga:
<link href="@Url.Content("~/Content/themes/base/AnotherPage.css")"
rel="stylesheet" type="text/css" />
a AnotherView ma częściowy widok (AnotherPartial), który wymaga:
<link href="@Url.Content("~/Content/themes/base/AnotherPartial.css")"
rel="stylesheet" type="text/css" />
Pytanie: Jak możemy dodać te linki do plików CSS, linki AnotherView i AnotherPartial do nagłówka Layout ?
RenderSection nie jest dobrym pomysłem, ponieważ AnotherPage może mieć więcej niż jedną Partials. Dodanie całego CSS do nagłówka nie jest przydatne, ponieważ będzie się dynamicznie zmieniać (zależy to od Anotherpages).
asp.net-mvc
asp.net-mvc-3
razor
Nuri YILMAZ
źródło
źródło
Odpowiedzi:
Układ:
Widok:
źródło
AddToHead
sekcja jest w częściowym widoku osadzonym wView
.Aktualizacja : podstawowy przykład dostępny pod adresem https://github.com/speier/mvcassetshelper
Używamy następującej implementacji, aby dodać pliki JS i CSS do strony układu.
View lub PartialView:
Strona układu:
Rozszerzenie HtmlHelper:
źródło
Insert
metody naAdd
metody[ThreadStatic]
, a najlepiej przechowywany w formacieHttpContext.Items
.Niestety, domyślnie nie można tego użyć
section
zgodnie z sugestią innego użytkownika, ponieważsection
jest on dostępny tylko dla bezpośredniegochild
plikuView
.Jednak działa to zaimplementowanie i przedefiniowanie
section
w każdym widoku , co oznacza:W ten sposób każdy widok może implementować sekcję główną, a nie tylko bezpośrednie elementy potomne. Działa to jednak tylko częściowo, zwłaszcza w przypadku wielu częściowych problemów zaczynają się kłopoty (jak wspomniałeś w swoim pytaniu).
Więc jedynym prawdziwym rozwiązaniem twojego problemu jest użycie
ViewBag
. Najlepszą prawdopodobnie byłaby osobna kolekcja (lista) dla CSS i skryptów. Aby to zadziałało, musisz upewnić się, żeList
używany jest zainicjowany przed wykonaniem któregokolwiek z widoków. Następnie możesz zrobić takie rzeczy u góry każdego widoku / częściowej (bez zwracania uwagi na to,Scripts
czyStyles
wartość lub jest pusta:W układzie możesz następnie przeglądać kolekcje i dodawać style na podstawie wartości w pliku
List
.Myślę, że jest brzydki, ale to jedyna rzecz, która działa.
****** UPDATE **** Ponieważ zaczyna najpierw wykonywać wewnętrzne widoki i przechodzić do układu, a style CSS są kaskadowe, prawdopodobnie miałoby sens odwrócenie listy stylów za pomocą
ViewBag.Styles.Reverse()
.W ten sposób najbardziej zewnętrzny styl jest dodawany jako pierwszy, który i tak jest zgodny z tym, jak działają arkusze stylów CSS.
źródło
Możesz zdefiniować sekcję metodą RenderSection w układzie.
Układ
Następnie możesz umieścić swoje pliki css w obszarze sekcji w widoku z wyjątkiem widoku częściowego .
Przekrój działa w widoku, ale nie działa w widoku częściowym zgodnie z projektem .
Jeśli naprawdę chcesz używać obszaru przekroju w widoku częściowym, możesz postępować zgodnie z artykułem, aby przedefiniować metodę RenderSection.
Razor, zagnieżdżone układy i przedefiniowane sekcje - Marcin on ASP.NET
źródło
Miałem podobny problem i ostatecznie zastosowałem doskonałą odpowiedź Kalmana z poniższym kodem (nie całkiem zgrabny, ale prawdopodobnie bardziej rozszerzalny):
Projekt zawiera statyczną metodę AssignAllResources:
na stronie _layout
oraz w części (ach) i widokach
źródło
Próbowałem rozwiązać ten problem.
Moja odpowiedź jest tutaj.
„DynamicHeader” - http://dynamicheader.codeplex.com/ , https://nuget.org/packages/DynamicHeader
Na przykład _Layout.cshtml to:
Możesz też zarejestrować pliki .js i .css w „DynamicHeader” w dowolnym miejscu .
Na przykład blok kodu w AnotherPartial.cshtm to:
Ostatecznie wyjściowy kod HTML to:
źródło
Wypróbuj gotowe rozwiązanie (ASP.NET MVC 4 lub nowszy):
źródło
CS0103: The name 'BundleTable' does not exist in the current context
System.Web.Optimization
np.System.Web.Optimization.BundleTable.Bundles.GetRegisteredBundles().First(b => b.Path == "~/bundles/css");
Dla tych z nas, którzy używają ASP.NET MVC 4 - może to być pomocne.
Najpierw dodałem klasę BundleConfig w folderze App_Start.
Oto mój kod, którego użyłem do jego utworzenia:
Po drugie, zarejestrowałem klasę BundleConfig w pliku Global.asax:
Po trzecie, dodałem pomocników stylu do mojego pliku CSS:
Wreszcie użyłem tej składni w dowolnym widoku:
źródło
Oto wtyczka NuGet o nazwie Cassette , która między innymi zapewnia możliwość odwoływania się do skryptów i stylów w częściach.
Chociaż istnieje wiele konfiguracji dostępnych dla tej wtyczki, co czyni ją bardzo elastyczną. Oto najprostszy sposób odwoływania się do plików skryptów lub arkuszy stylów:
Zgodnie z dokumentacją :
źródło
Napisałem łatwe opakowanie, które pozwala na dynamiczne rejestrowanie stylów i skrawków w każdym częściowym widoku w tagu head.
Opiera się na utworzonym przez DynamicHeader jsakamoto, ale ma pewne ulepszenia wydajności i poprawki.
Jest bardzo łatwy w użyciu i wszechstronny.
Użycie:
Możesz znaleźć pełny kod, wyjaśnienia i przykłady w: Dodaj style i skrypty dynamicznie do tagu nagłówka
źródło