Chcę zachować cały mój kod JavaScript w jednej sekcji; tuż przed zamknięciembody
tagiem na mojej głównej stronie układu i po prostu zastanawiam się, jak najlepiej to zrobić, w stylu MVC.
Na przykład, jeśli utworzę DisplayTemplate\DateTime.cshtml
plik, który używa DateTime Picker interfejsu jQuery UI, to osadziłbym JavaScript bezpośrednio w tym szablonie, ale wtedy będzie renderowany w połowie strony.
W moich normalnych widokach mogę po prostu użyć, @section JavaScript { //js here }
a następnie @RenderSection("JavaScript", false)
w moim głównym układzie, ale to nie działa w szablonach wyświetlania / edytora - jakieś pomysły?
Odpowiedzi:
Możesz kontynuować połączenie dwóch pomocników:
a następnie w
_Layout.cshtml
:i gdzieś w jakimś szablonie:
źródło
sections
. W MVC4 Bundling rzeczywiście może być użyty, ponieważ pomaga zmniejszyć rozmiar skryptów.head
tagu zamiast na końcubody
tagu, ponieważ@Html.RenderScripts()
zostanie ono wykonane przed częściowym widokiem, a zatem przed@Html.Script()
.Zmodyfikowana wersja odpowiedzi Darina w celu zapewnienia zamówienia. Działa również z CSS:
Możesz dodać zasoby JS i CSS w ten sposób:
Renderuj zasoby JS i CSS w ten sposób:
Możesz sprawdzić ciąg znaków, aby zobaczyć, czy zaczyna się od skryptu / linku, więc nie musisz jawnie definiować, czym jest każdy zasób.
źródło
Napotkałem ten sam problem, ale proponowane tutaj rozwiązania działają dobrze tylko przy dodawaniu odwołania do zasobu i nie są zbyt odpowiednie dla kodu wbudowanego JS. Znalazłem bardzo pomocny artykuł i zapakowałem cały mój wbudowany JS (a także tagi skryptów) w
I w widoku _Layout umieszczony
@Html.PageScripts()
tuż przed zamykającym tagiem „body”. U mnie działa jak urok.Sami pomocnicy:
źródło
Podobało mi się rozwiązanie opublikowane przez @ john-w-harding, więc połączyłem je z odpowiedzią @ darin-dimitrov, aby stworzyć następujące, prawdopodobnie zbyt skomplikowane rozwiązanie, które pozwala opóźnić renderowanie dowolnego kodu HTML (również skryptów) w bloku using.
STOSOWANIE
W powtórzonym częściowym widoku uwzględnij blok tylko raz:
W (powtórzonym?) Widoku częściowym uwzględnij blok dla każdego użycia częściowej:
W (powtórzonym?) Widoku częściowym włącz blok raz, a później wyrenderuj go specjalnie według nazwy
one-time
:Aby renderować:
KOD
źródło
Zainstaluj pakiet NuGet Forloop.HtmlHelpers - 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
Ten post naprawdę mi pomógł, więc pomyślałem, że opublikuję moją implementację podstawowego pomysłu. Wprowadziłem funkcję pomocniczą, która może zwracać tagi skryptu do użycia w funkcji @ Html.Resource.
Dodałem również prostą klasę statyczną, dzięki czemu mogę używać zmiennych wpisanych do identyfikowania zasobu JS lub CSS.
I w użyciu
Dziękuję @Darin Dimitrov, który udzielił odpowiedzi na moje pytanie tutaj .
źródło
Odpowiedź podana w Populate a Razor Section From a Partial using the
RequireScript
HtmlHelper jest zgodna z tym samym wzorcem. Ma również tę zaletę, że sprawdza i eliminuje zduplikowane odniesienia do tego samego adresu URL JavaScript i ma wyraźnypriority
parametr, którego można użyć do kontrolowania kolejności.Rozszerzyłem to rozwiązanie o metody:
Lubię jednak rozwiązania Darin & eth0, ponieważ używają
HelperResult
szablonu, który pozwala na skrypty i bloki CSS, a nie tylko linki do plików Javascript i CSS.źródło
@Darin Dimitrov i @ eth0 odpowiedzi do użycia przy użyciu rozszerzenia pakietu:
źródło