Właściwy sposób korzystania z _viewstart.cshtml i częściowych widoków Razor?

156

Używam _viewstart.cshtml, aby automagicznie przypisać ten sam układ Razor do moich widoków.

To martwy prosty plik w katalogu głównym mojego folderu Widoki, który wygląda następująco:

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

Jest to bardziej SUCHE niż dodanie dyrektywy @Layout do każdego widoku.

Stanowi to jednak problem w przypadku widoków częściowych Razor , ponieważ uruchamiają one zawartość _viewstart.cshtml i dlatego niepoprawnie przypisują sobie układ, co sprawia, że ​​nie są już częściowe.

Oto hipotetyczny projekt przedstawiający plik _viewstart.cshtml, udostępniony plik _layout.shtml i częściowy widok („AnonBar.cshtml”).

Przykładowa struktura projektu

Obecnie sposobem na obejście tego jest dodanie następującego wiersza do każdego widoku częściowego:

@{
    Layout = "";
}

Wydaje się, że to zły sposób na określenie poglądu jako częściowego w Razor. (Należy pamiętać, że w przeciwieństwie do mechanizmu wyświetlania formularzy internetowych rozszerzenie pliku jest takie samo dla widoków częściowych).

Inne opcje, które rozważałem, ale są jeszcze gorsze:

  • Umieszczanie wszystkich widoków częściowych we wspólnym folderze, aby mogły udostępniać wspólny plik _viewstart.cshtml. Łamie to konwencję widoków znajdujących się w tym samym folderze, co ich kontroler.
  • Nie używam częściowych widoków.

Czy jest to coś, co jest nadal opracowywane przez zespół silnika widoku Razor, czy też brakuje mi podstawowej koncepcji?

Portman
źródło
3
Przepraszam za offtopic, ale jakie są te ikony obok nazw plików? :) Jakiś rodzaj kontroli źródła, prawda?
Alex
6
@jitbit: VisualSVN
erict

Odpowiedzi:

237

Jeśli jesteś return PartialView()z kontrolerów (zamiast return View()), to _viewstart.cshtmlnie zostanie wykonany.

marcind
źródło
6
Aha, nie wiedziałem o PartialViewResultklasie. To było to, czego potrzebowałem.
Portman
6
W ramach kontynuacji odkryłem, że muszę również jawnie ustawić typ zwracania metody akcji na PartialViewResultzamiast zwykłej ActionResult.
Portman
2
@ Portman, czy widzisz problemy, gdy typ zwrotu metody akcji jest inny ActionResult? Dziwię się, że jest to problem, ponieważ środowisko wykonawcze MVC nie powinno zachowywać się inaczej w tym przypadku (tj. Dopóki typ zwracany przez metodę akcji jest ActionResultlub jakakolwiek klasa pochodna od niego powinna działać).
marcind
@marcind Otrzymuję przepełnienie stosu na w3wp.exe, jeśli ustawię typ zwracania na ActionResult. Działa dobrze, jeśli typem zwrotu jest PartialViewResult. Myślisz, że muszę zgłosić błąd w Connect?
Portman
Dla mnie brzmi jak jeden - krzycz, jeśli zgłosisz błąd w Połączeniu, zagłosuję na to.
Dav