Moją główną motywacją do zrobienia tego jest uzyskanie JavaScript, który jest wymagany tylko przez częściową część na dole strony z resztą JavaScript, a nie na środku strony, na której jest renderowana część.
Oto uproszczony przykład tego, co próbuję zrobić:
Oto układ z sekcją Skrypty tuż przed treścią.
<!DOCTYPE html>
<html>
<head>
<title>@ViewBag.Title</title>
<link href="@Url.Content("~/Content/Site.css")" rel="stylesheet" type="text/css" />
</head>
<body>
@RenderBody()
<script src="@Url.Content("~/Scripts/jquery-1.4.4.min.js")" type="text/javascript"></script>
@RenderSection("Scripts", false)
</body>
</html>
Oto przykładowy widok wykorzystujący ten układ.
<h2>This is the view</h2>
@{Html.RenderPartial("_Partial");}
@section Scripts {
<script type="text/javascript">
alert("I'm a view.");
</script>
}
A oto fragment renderowany z widoku.
<p>This is the partial.</p>
@* this never makes it into the rendered page *@
@section Scripts {
<script type="text/javascript">
alert("I'm a partial.");
</script>
}
W tym przykładzie znacznik określony w widoku jest umieszczany w sekcji, ale znacznik z części nie jest. Czy można wypełnić sekcję z częściowego widoku za pomocą Razor? Jeśli nie, jakie są inne metody uzyskiwania JavaScript, które są potrzebne tylko przez częściowe u dołu strony, bez uwzględniania go globalnie?
javascript
asp.net-mvc-3
razor
Craig M.
źródło
źródło
Odpowiedzi:
Sposób, w jaki sobie z tym poradziłem, to napisanie kilku metod rozszerzających do klasy HtmlHelper. Dzięki temu widoki częściowe mogą powiedzieć, że wymagają skryptu, a następnie w widoku układu, który zapisuje tag, który wywołuję, do mojej metody pomocniczej, aby emitować wymagane skrypty
Oto metody pomocnicze:
Gdy już to zrobisz, Twój częściowy widok musi tylko zadzwonić
@Html.RequireScript("/Path/To/Script")
.I w sekcji head widoku układu, którą wywołujesz
@Html.EmitRequiredScripts()
.Dodatkową zaletą tego jest to, że umożliwia to wyeliminowanie zduplikowanych żądań skryptu. Jeśli masz wiele widoków / widoków częściowych, które wymagają danego skryptu, możesz bezpiecznie założyć, że wygenerujesz go tylko raz
źródło
Częściowe widoki nie mogą uczestniczyć w sekcjach ich widoków nadrzędnych.
źródło
Możesz mieć drugą część, która jest odpowiedzialna tylko za wstrzyknięcie niezbędnego javascript.
@if
Jeśli chcesz, umieść tam kilka skryptów wokół bloków:Można to oczywiście trochę wyczyścić, ale w
Scripts
części widoku:Ponownie, może nie wygrać nagrody piękności, ale zadziała.
źródło
Bardziej eleganckim sposobem jest przeniesienie skryptów częściowego widoku do osobnego pliku, a następnie wyrenderowanie go w sekcji Skrypty widoku:
Widok częściowy _ Partial.cshtml :
Częściowy widok _ PartialScripts.cshtml tylko ze skryptami:
źródło
Zainstaluj plik Forloop.HtmlHelpers pakiet - dodaje kilka pomocników do zarządzania skryptami w widokach częściowych i szablonach edytorów.
Gdzieś w swoim układzie musisz zadzwonić
Będzie to miejsce, w którym wszelkie pliki skryptów i bloki skryptów zostaną wyprowadzone na stronę, więc zalecam umieszczenie ich po głównych skryptach w układzie i po sekcji skryptów (jeśli taką masz).
Jeśli używasz platformy optymalizacji sieci Web z pakietowaniem, możesz użyć przeciążenia
tak aby ta metoda była używana do zapisywania plików skryptów.
Teraz, gdy chcesz dodać pliki skryptów lub bloki w widoku, częściowym widoku lub szablonie, po prostu użyj
Pomocnicy zapewniają, że tylko jedno odwołanie do pliku skryptu jest renderowane, jeśli jest dodawane wiele razy, a także zapewnia, że pliki skryptów są renderowane w oczekiwanej kolejności, tj.
źródło
[Zaktualizowana wersja] Zaktualizowana wersja po pytaniu @Necrocubus w celu uwzględnienia wbudowanych skryptów.
Moje 2 centy, to stary post, ale nadal aktualny, więc tutaj jest ulepszona aktualizacja rozwiązania pana Bella, które działa z ASP.Net Core.
Umożliwia dodawanie skryptów i stylów do głównego układu z zaimportowanych widoków częściowych i podglądów podrzędnych, a także możliwość dodawania opcji do importu skryptów / stylów (takich jak opóźnienie asynchronizacji itp.):
źródło
<text>
, po prostu dodaj go jako ciąg (nadal możesz przedrostek @ "" dla wielu linii, jeśli wolisz) i bez<script>
tagówMożesz utworzyć nową
Layout
stronę i zawinąć PartialView wewnątrz pełnego widoku, który jest odpowiedzialny za renderowanie zawartości, a także wszelkich sekcji biblioteki.Na przykład, powiedzmy, że mam następujący kod:
HomeController.cs
Renderowany widok pełnej strony jest zwykle renderowany przez scalenie dwóch plików:
About.cshtml
_Layout.cshtml
(lub cokolwiek jest określone w _ViewStart lub nadpisane na stronie)Teraz załóżmy, że chcesz renderować
About.cshtml
jako widok częściowy , być może jako okno modalne w odpowiedzi na wywołanie AJAX. Celem jest zwrócenie tylko treści określonej na stronie About, skryptów i tak dalej, bez całego nadmiaru zawartego w układzie_Layout.cshtml
głównym (jak pełny<html>
dokument).Możesz spróbować tego w ten sposób, ale nie będzie zawierał żadnego z bloków sekcji:
Zamiast tego dodaj prostszą stronę układu, taką jak ta:
_PartialLayout.cshtml
Lub do obsługi okna modalnego, takiego jak to:
_ModalLayout.cshtml
Następnie możesz określić niestandardowy widok główny w tym kontrolerze lub innym module obsługi, który chcesz jednocześnie renderować zawartość i skrypty widoku
źródło
Dla osób poszukujących wersji 2.0 aspnet core:
Dodaj do układu po wywołaniu sekcji renderowania skryptów:
I z twojego częściowego punktu widzenia:
źródło
Bazując na powyższej odpowiedzi Mr Bell And Shimmy, dodaję dodatkową funkcję dla skryptu Bundle.
Przykład w PartialView: - @ Html.RequireBundleStyles ("~ / bundles / fileupload / bootstrap / BasicPlusUI / css"); @ Html.RequireBundleScripts ("~ / bundles / fileupload / bootstrap / BasicPlusUI / js");
Próbka na MasterPage: - @ Html.EmitRequiredBundleStyles ()
źródło
Użyj
@using(Html.Delayed()){ ...your content... }
rozszerzeń z answer https://stackoverflow.com/a/18790222/1037948, aby renderować dowolną zawartość (skrypty lub tylko HTML) w dalszej części strony. WewnętrznyQueue
powinien zapewnić prawidłowe uporządkowanie.źródło
Ta funkcjonalność jest również zaimplementowana w ClientDependency.Core.Mvc.dll. Dostarcza pomocników html: @ Html.RequiresJs i @ Html.RenderJsHere (). Pakiet NuGet: ClientDependency-Mvc
źródło
Oto moje rozwiązanie często zadawanych pytań „jak wstrzyknąć sekcje z widoków częściowych do widoków głównych lub głównego widoku układu dla asp.net mvc?”. Jeśli przeszukasz stackoverflow za pomocą słów kluczowych „sekcja + częściowe”, otrzymasz całkiem dużą listę powiązanych pytań i udzielonych odpowiedzi, ale żadne z nich nie wydaje mi się eleganckie dzięki gramatyce maszynki do golenia. Rzucę więc okiem na silnik Razor i zobaczę, czy może być lepsze rozwiązanie tego pytania.
Na szczęście znalazłem coś interesującego dla mnie w tym, jak silnik Razor wykonuje kompilację dla pliku szablonu widoku (* .cshtml, * .vbhtml). (Wyjaśnię później), poniżej jest mój kod rozwiązania, które moim zdaniem jest dość proste i wystarczająco eleganckie w użyciu.
stosowanie : Używanie kodu jest również dość proste i wygląda prawie tak samo jak zwykle. Obsługuje również wszystkie poziomy zagnieżdżonych widoków częściowych. to znaczy. Mam łańcuch szablonów widoku: _ViewStart.cshtml-> layout.cshtml-> index.cshtml -> [head.cshtml, foot.cshtml] -> ad.cshtml.
W layout.cshtml mamy:
W pliku index.cshtml mamy:
A w head.cshtml mielibyśmy kod:
tak samo jest w foot.cshtml lub ad.cshtml, nadal możesz zdefiniować w nich sekcję Head lub Foot, upewnij się, że wywołałeś @ Html.EnsureSection () raz na końcu pliku częściowego widoku. To wszystko, co musisz zrobić, aby pozbyć się poddanego problemowi w asp mvc.
Po prostu udostępniam fragment kodu, aby inni mogli z niego skorzystać. Jeśli uważasz, że jest to przydatne, nie wahaj się i oceń mój post. :)
źródło