Wymuś, aby wszystkie obszary używały tego samego układu

Mam następującą strukturę projektu:

  • /Views / Shared/_Layout;

  • /Area / Area1/Views/ControllerName / Index;

...

  • / Areas / AreaN/Views/ControllerName / Index.

Czy Jest jakiś sposób, aby zmusić wszystkie obszary do użycia _Layout jako układ podstawowy?

Czy można to zrobić bez dodawania pliku _ViewStart (na przykład poprzez routing konfiguracja)?

Zobacz Też:

Jak określić różne układy w ASP.NET plik MVC 3 razor viewstart?

Author: Community, 2012-11-07

3 answers

Wystarczy dodać plik o nazwie:

_ViewStart.cshtml

W folderze widoków każdego obszaru:

/Areas/Area1/Views/_ViewStart.cshtml

I edytować plik, aby wskazać układ główny w następujący sposób:

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

Aby to zadziałało, nie musisz określać wartości we właściwości layout widoku, jeśli to zrobisz, nadpiszesz układ globalny

Uwaga: jak wspomniał Tony, możesz edytować właściwości układu każdego widoku, aby wskazać układ główny, jednak nie jest to zalecany sposób na to ponieważ łączyłbyś swoje poglądy ze swoim układem i zmieniał, byłoby to bolesne

Edycja 1

Jeśli chcesz użyć kodu do ustawienia domyślnego układu widoku, być może powinieneś rozważyć napisanie niestandardowego silnika widoku.

Spróbuj wyszukać w Google o custom RazorViewEngine i RazorView

Ten artykuł może być dobrym punktem wyjścia

Http://weblogs.asp.net/imranbaloch/archive/2011/06/27/view-engine-with-dynamic-view-location.aspx

Nie zrobiłem coś w tym stylu, ale mam nadzieję, że wskazuję ci właściwy kierunek

 130
Author: Jupaol,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-11-07 20:51:52

Rozszerzanie odpowiedzi przez Jupaol....

Przynajmniej w VS2013, _ViewStart.plik cshtml jest dodawany domyślnie podczas tworzenia obszaru, więc już tam jest i możesz zmienić zawartość, jak zauważa, aby wskazywać na główny _Layout.cshtml. Następnie można usunąć _Layout.cshtml w obszarze, ponieważ nie jest już używany (i potencjalne źródło zamieszania teraz)

Jednakże, poprzez routing wykonywany w tym root _Layout.cshtml będzie musiał rozważyć obszary.
Na default _Layout.cshtml ma wiele pomocników ActionLink, które wymagają niewielkiej modyfikacji:

Dodaj RouteValueDictionary param do wszystkich wywołań ActionLink, ustawiając Area="". Zauważ, że pusty łańcuch odnosi się do poziomu głównego. Pozwoli to na poprawne działanie tych łączy, gdy są wywoływane z obszaru, a nadal działają, gdy są wywoływane z katalogu głównego.

Np.:

<li>@Html.ActionLink("Home", "Index", "Home", new { Area = "" }, null)</li>
 20
Author: Rob Campbell,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-12-08 18:12:08

Określasz układ używając:

@{ Layout = " _Layout"; }

Jeśli chcesz to łatwiej zmienić na raz. Być może możesz po prostu ustawić go jako zmienną worka widoku i przekazać go na kontrolerze. Aby było to jeszcze łatwiejsze, możesz utworzyć kontroler bazowy, który odziedziczą inne kontrolery i przypisać układ do worka widoków.

Nie wiem, dlaczego routing musiałby się zmienić, a może nie rozumiem. Mam nadzieję, że to pomoże:)

 2
Author: Tony,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-11-07 20:00:37