Mam tę sekcję zdefiniowaną w moim _Layout.cshtml
@RenderSection("Scripts", false)
Mogę z łatwością korzystać z widoku:
@section Scripts {
@*Stuff comes here*@
}
Mam problem z tym, jak uzyskać częściową treść w tej sekcji z częściowego widoku.
Załóżmy, że to moja strona widoku:
@section Scripts {
<script>
//code comes here
</script>
}
<div>
poo bar poo
</div>
<div>
@Html.Partial("_myPartial")
</div>
Muszę wstrzyknąć część treści Scripts
z _myPartial
częściowego widoku.
W jaki sposób mogę to zrobić?
Odpowiedzi:
Sekcje nie działają w widokach częściowych i jest to zgodne z projektem. Możesz użyć niestandardowych pomocników, aby osiągnąć podobne zachowanie, ale szczerze mówiąc, obowiązkiem widoku jest uwzględnienie niezbędnych skryptów, a nie częściowej. Polecam skorzystanie z sekcji @scripts w głównym widoku, aby to zrobić i nie martw się stronami o skrypty.
źródło
To dość popularne pytanie, więc opublikuję swoje rozwiązanie.
Miałem ten sam problem i chociaż nie jest idealny, myślę, że faktycznie działa całkiem dobrze i nie uzależnia częściowego od widoku.
Mój scenariusz polegał na tym, że akcja była dostępna sama w sobie, ale mogła być również osadzona w widoku - mapie google.
W moim
_layout
mam:Moim
index
zdaniem mam:Moim
clients
zdaniem mam (cała mapa i assoc. Html):Mój
Clients_Scripts
widok zawiera javascript do renderowania na stronieW ten sposób mój skrypt jest izolowany i może być renderowany na stronie tam, gdzie jest to wymagane, przy czym
body_scripts
tag jest renderowany tylko przy pierwszym wystąpieniu, w którym znajdzie go silnik przeglądania razor.To pozwala mi oddzielić wszystko - jest to rozwiązanie, które działa dla mnie całkiem dobrze, inni mogą mieć z tym problemy, ale naprawia dziurę „według projektu”.
źródło
Z rozwiązań w tym wątku wymyśliłem następujące prawdopodobnie skomplikowane rozwiązanie, które pozwala opóźnić renderowanie html (także skryptów) w bloku używającym.
STOSOWANIE
Utwórz „sekcję”
Typowy scenariusz: w widoku częściowym dołącz blok tylko jeden raz, bez względu na to, ile razy widok częściowy jest powtarzany na stronie:
W widoku częściowym dołącz blok za każdym razem, gdy użyty zostanie fragment:
W widoku częściowym dołącz blok tylko raz, bez względu na to, ile razy powtórzy się częściowy, ale później renderuj go konkretnie według nazwy
when-i-call-you
:Renderuj „sekcje”
(tzn. wyświetl opóźnioną sekcję w widoku rodzica)
KOD
źródło
isOnlyOne
, ale tylko jeśli chcesz wyrenderować go w określonej lokalizacji według nazwy, czy podajesz identyfikator, w przeciwnym razie zostanie porzuconyHtml.RenderDelayed()
.Miałem ten problem i użyłem tej techniki.
To najlepsze rozwiązanie, jakie znalazłem, które jest bardzo elastyczne.
Również proszę głosować tutaj , aby dodać wsparcie dla zbiorczej deklaracji sekcji
źródło
Jeśli masz uzasadnioną potrzebę uruchomienia niektórych
js
zpartial
, oto jak możesz to zrobić,jQuery
jest wymagane:źródło
Zgodnie z dyskretną zasadą nie jest wymagane, aby „_myPartial” wstrzykiwał zawartość bezpośrednio do sekcji skryptów. Możesz dodać te skrypty widoku częściowego do osobnego
.js
pliku i odwoływać się do nich w sekcji @scripts z widoku rodzica.źródło
W sposobie myślenia o sieci istnieje zasadnicza wada, szczególnie w przypadku korzystania z MVC. Wada polega na tym, że JavaScript jest poniekąd odpowiedzialnością widoku. Widok jest widokiem, JavaScript (behawioralny lub inny) to JavaScript. We wzorcu MVVM firmy Silverlight i WPF mamy do czynienia z „najpierw zobacz” lub „najpierw model”. W MVC zawsze powinniśmy starać się rozumować z punktu widzenia modelu, a JavaScript jest częścią tego modelu na wiele sposobów.
Sugerowałbym użycie wzorca AMD (ja sam lubię RequireJS ). Rozdziel swój JavaScript na moduły, zdefiniuj swoją funkcjonalność i podpisz się do kodu HTML od JavaScript zamiast polegać na widoku, aby załadować JavaScript. To wyczyści Twój kod, odseparuje Twoje obawy i ułatwi Ci życie za jednym zamachem.
źródło
window
obiekcie i dołączam skrypty biblioteczne przed częściami.Celem PO jest to, że chce zdefiniować wbudowane skrypty w swoim widoku częściowym, który zakładam, że ten skrypt jest specyficzny tylko dla tego widoku częściowego i aby ten blok był zawarty w jego sekcji skryptu.
Rozumiem, że chce, aby ten widok częściowy był samodzielny. Pomysł jest podobny do komponentów podczas korzystania z Angulara.
Moim sposobem byłoby po prostu zachować skrypty w częściowym widoku takim, jaki jest. Problem polega na tym, że podczas wywoływania widoku częściowego może on tam wykonać skrypt przed wszystkimi innymi skryptami (zwykle dodawanymi na dole strony układu). W takim przypadku po prostu skrypt Częściowego widoku czeka na pozostałe skrypty. Można to zrobić na kilka sposobów. Najprostszym, z którego korzystałem wcześniej, jest użycie zdarzenia
body
.W moim układzie miałbym na dole coś takiego:
Następnie w częściowym widoku (na dole):
Innym rozwiązaniem jest użycie stosu do wypchnięcia wszystkich skryptów i wywołania każdego z nich na końcu. Innym rozwiązaniem, jak już wspomniano, jest wzorzec RequireJS / AMD, który również działa naprawdę dobrze.
źródło
Pierwszym rozwiązaniem, jakie mogę wymyślić, jest użycie narzędzia ViewBag do przechowywania wartości, które należy renderować.
Po pierwsze, nigdy nie próbowałem, czy to działa z częściowego widoku, ale powinno imo.
źródło
ViewBag.RenderScripts = new List<string>();
u góry strony głównej, potem zadzwoniłem@Html.Partial("_CreateUpdatePartial",Model,ViewData)
, a potem umieściłem@section Scripts {@foreach (string script in ViewBag.RenderScripts) Scripts.Render(script); }}
. W widoku częściowym umieściłem@{ViewBag.RenderScripts = ViewBag.RenderScripts ?? new List<string>();ViewBag.RenderScripts.Add("~/bundles/jquery");}
.Nie trzeba używać sekcji w widoku częściowym.
Uwzględnij w częściowym widoku. Wykonuje funkcję po załadowaniu jQuery. Możesz zmienić klauzulę de condition dla swojego kodu.
Julio Spader
źródło
Możesz użyć tych metod rozszerzenia : (Zapisz jako PartialWithScript.cs)
Użyj w ten sposób:
Przykład częściowy: (_MyPartial.cshtml) Umieść HTML w if, a JS w else.
W pliku _Layout.cshtml lub w dowolnym miejscu, w którym mają być renderowane skrypty z części, umieść następujące (raz): Wyrenderuje tylko javascript wszystkich części na bieżącej stronie w tej lokalizacji.
Następnie, aby użyć częściowego, po prostu zrób to: Wyrenderuje tylko HTML w tej lokalizacji.
źródło
Istnieje sposób wstawiania sekcji w widokach częściowych, choć nie jest to ładne. Musisz mieć dostęp do dwóch zmiennych z widoku nadrzędnego. Ponieważ częścią twojego częściowego widoku jest utworzenie tej sekcji, sensowne jest wymaganie tych zmiennych.
Oto jak to wygląda wstawić sekcję w widoku częściowym:
A na stronie wstawianie widoku częściowego ...
Tej techniki można także użyć do programowego zdefiniowania zawartości sekcji w dowolnej klasie.
Cieszyć się!
źródło
Pomysł Plutona w ładniejszy sposób:
CustomWebViewPage.cs:
Widoki \ web.config:
Widok:
Częściowe (_BackendSearchForm.cshtml):
Strona układu:
źródło
To działało dla mnie, umożliwiając mi wspólną lokalizację javascript i HTML dla częściowego widoku w tym samym pliku. Pomaga procesowi myślenia zobaczyć HTML i powiązaną część w tym samym pliku widoku częściowego.
W widoku używającym widoku częściowego o nazwie „_MyPartialView.cshtml”
W pliku częściowego widoku
źródło
Rozwiązałem tę zupełnie inną trasę (ponieważ spieszyłem się i nie chciałem wdrożyć nowego HtmlHelper):
Owinęłam mój widok częściowy w dużą instrukcję if-else:
Następnie dwukrotnie wywołałem Partial z niestandardowym ViewData:
źródło
@Html.Partial("MyPartialViewScripts")
Miałem podobny problem, gdy miałem stronę wzorcową w następujący sposób:
ale widok częściowy zależał od niektórych skryptów JavaScript w sekcji Skrypty. Rozwiązałem go, kodując widok częściowy jako JSON, ładując go do zmiennej JavaScript, a następnie używając tego do wypełnienia div, więc:
źródło
wybieralnie, możesz użyć folderu / index.cshtml jako strony głównej, a następnie dodać skrypty sekcji. Następnie w swoim układzie masz:
i twój index.cshtml:
i będzie działać na wszystkich twoich częściowych przeglądach. To działa dla mnie
źródło
Za pomocą Mvc Core możesz stworzyć schludny TagHelper,
scripts
jak pokazano poniżej. Można to łatwo przekształcić wsection
tag, w którym również nadajesz nazwę (lub nazwa pochodzi od typu pochodnego). Należy pamiętać, że należy skonfigurować wstrzykiwanie zależnościIHttpContextAccessor
.Podczas dodawania skryptów (np. Częściowo)
Podczas wysyłania skryptów (np. W pliku układu)
Kod
źródło
Cóż, myślę, że inne plakaty zapewniły ci sposób na bezpośrednie dołączenie @section w swojej częściowej (za pomocą zewnętrznych pomocników HTML).
Ale sądzę, że jeśli twój skrypt jest ściśle powiązany z częściowym, po prostu umieść javascript bezpośrednio w wewnętrznym
<script>
znaczniku wewnątrz częściowego i załatw go (bądź ostrożny z duplikacją skryptu, jeśli zamierzasz używać częściowego więcej niż raz w jednym widoku);źródło
zakładamy, że masz częściowy widok o nazwie _contact.cshtml, twój kontakt może być osobą prawną (imię) lub fizyczną (imię, nazwisko). twój widok powinien zadbać o to, co jest renderowane i co można uzyskać za pomocą javascript. dlatego może być potrzebne opóźnione renderowanie i widok wewnętrzny JS.
jedyny sposób, w jaki myślę, jak można to pominąć, to stworzenie dyskretnego sposobu radzenia sobie z takimi obawami dotyczącymi interfejsu użytkownika.
zauważ także, że MVC 6 będzie miał tak zwany komponent widokowy, nawet futures MVC miały podobne rzeczy, a Telerik również obsługuje takie rzeczy ...
źródło
Właśnie dodałem ten kod do mojego częściowego widoku i rozwiązałem problem, choć niezbyt czysty, działa. Musisz się upewnić, że identyfikatory obiektów, które renderujesz.
źródło
Miałem podobny problem rozwiązałem to z tym:
To ładny sposób na zastrzyk.
źródło