ASP.NET MVC: Jaki jest cel @section? [Zamknięte]


134

W przypadku aplikacji ASP.NET MVC widziałem ten artykuł na blogu . Autor ScottGu dodaje @sectionplik Index.cshtml.

Mam kilka pytań (w odniesieniu do powyższego artykułu):

  • Czy plik Index.cshtml jest udostępnionym widokiem?
  • Przykładowy kod używa @sectionkodu w określonym widoku. Czemu?

Czy ktoś może wyjaśnić, dlaczego i kiedy powinienem używać @sectionw widoku?



1
Chociaż można argumentować, że lepszym powodem zamknięcia w dzisiejszych czasach byłby „głównie oparty na opinii”, nadal byłby zamknięty. Nie ma ostatecznego sposobu używania sekcji.
Richard

2
Nie ma ostatecznego sposobu na użycie czegokolwiek. Spójrz tylko, jak ludzie korzystają z internetu ...
keji

Odpowiedzi:


140

@sectionsłuży do definiowania treści, które są zastępowane z widoku współdzielonego. Zasadniczo jest to sposób na dostosowanie udostępnionego widoku (podobnie do strony wzorcowej w formularzach sieci Web).

Może się okazać, że artykuł Scotta Gu na ten temat jest bardzo interesujący .

Edycja: na podstawie dodatkowego wyjaśnienia pytania

@RenderSectionSkładnia idzie do podzieliła pogląd, takich jak:

<div id="sidebar">
    @RenderSection("Sidebar", required: false)
</div>

Zostanie to następnie umieszczone w Twoim widoku za pomocą @Sectionskładni:

@section Sidebar{
    <!-- Content Here -->
}

W MVC3 + możesz albo bezpośrednio zdefiniować plik układu, który ma być używany dla widoku, albo możesz mieć domyślny widok dla wszystkich widoków.

Typowe ustawienia widoku można ustawić w _ViewStart.cshtml, który definiuje domyślny widok układu podobny do tego:

@{
    Layout = "~/Views/Shared/_Layout.cshtml";
}

Możesz również ustawić widok udostępniony, aby był używany bezpośrednio w pliku, na przykład index.cshtml bezpośrednio, jak pokazano w tym fragmencie.

@{
    ViewBag.Title = "Corporate Homepage";
    ViewBag.BodyID = "page-home";
    Layout = "~/Views/Shared/_Layout2.cshtml";
}

Istnieje wiele sposobów dostosowania tego ustawienia za pomocą kilku innych wymienionych w tej odpowiedzi SO .


Dzięki Frazell! Dodałem więcej do mojego pytania w odniesieniu do tego samouczka. Czy możesz wyjaśnić więcej? Dzięki jeszcze raz!
A Bogus

Hej @ABogus Zaktualizowałem odpowiedź. Mam nadzieję, że te dodatkowe informacje
okażą się

21

Dobrym przykładem jest Javascript. Chcesz, aby znajdował się u dołu strony wyświetlanej w przeglądarce, ponieważ jest to sprawdzona metoda.

Jak byś to zrobił z widoku opartego na układzie / stronie głównej, gdzie masz dostęp tylko do środka strony?

Robisz to, deklarując sekcję Skrypty na dole strony Układ. Następnie możesz dodać zawartość, w tym przypadku Javascript (mam nadzieję!), Ze strony widoku na dół strony układu.


4

Chcesz używać sekcji, gdy chcesz, aby fragment kodu / treści był renderowany w symbolu zastępczym, który został zdefiniowany na stronie układu.

W konkretnym przykładzie, który utworzyłeś, zdefiniował on RenderSection w pliku _Layout.cshtml. Każdy widok, który używa tego układu, może zdefiniować sekcję @ o tej samej nazwie, jak zdefiniowano w układzie, i zastąpi wywołanie RenderSection w układzie.

Być może zastanawiasz się, skąd wiemy, że Index.cshtml używa tego układu? Wynika to z trochę konwencji MVC / Razor. Jeśli spojrzysz na okno dialogowe, w którym dodaje widok, pole „Użyj układu lub strony wzorcowej” jest zaznaczone, a tuż poniżej jest napisane „Pozostaw puste, jeśli jest ustawione w pliku Razor _viewstart”. Nie jest wyświetlany, ale wewnątrz tego pliku _ViewStart.cshtml znajduje się kod podobny do:

@{
    Layout = "~/Views/Shared/_Layout.cshtml";
}

Sposób działania ViewStart jest taki, że każdy plik cshtml w tym samym katalogu lub katalogach podrzędnych będzie uruchamiał ViewStart przed jego uruchomieniem.

To właśnie mówi nam, że Index.cshtml używa Shared / _Layout.cshtml.


Ładne wyjaśnienie _ViewStart.
ᴍᴀᴛᴛ ʙᴀᴋᴇʀ

3

Pozwala zdefiniować @Sectionkod w szablonie, który można następnie dołączyć do innych plików. Na przykład do paska bocznego zdefiniowanego w szablonie można się odwoływać w innym dołączonym widoku.

//This could be used to render a @Section defined as @Section SideBar { ...
@RenderSection("SideBar", required: false);

Mam nadzieję że to pomoże.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.