Jak to się dzieje, kiedy mam Layout = null;
na widoku - nadal wciąga domyślny układ ?!
Czy jest jakaś sztuczka, aby to powstrzymać?
Oto mój widok bez układu:
@{
Layout = "";
}
<!DOCTYPE html>
<html>
<head>
<title>Index</title>
@{Html.RenderAction("Head", "Header");}
</head>
<body>
<div>
Home
</div>
</body>
</html>
Oto renderowane wyjście !!
<!DOCTYPE html>
<html>
<head>
<title>Index</title>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title></title>
<link href="/Content/Site.css" rel="stylesheet" type="text/css" />
<script src="/Scripts/jquery-1.5.1.min.js" type="text/javascript"></script>
<script src="/Scripts/modernizr-1.7.min.js" type="text/javascript"></script>
</head>
<body>
header
</body>
</html>
</head>
<body>
<div>
Home
</div>
</body>
</html>
asp.net-mvc
asp.net-mvc-3
layout
razor
Greg B.
źródło
źródło
null
na renderowanej stronie?Odpowiedzi:
Czy masz
_ViewStart.cshtml
w tym katalogu? Miałem ten sam problem, który masz, gdy próbowałem użyć _ViewStart. Następnie zmieniłem jego nazwę na _mydefaultview, przeniosłem go doViews/Shared
katalogu i przełączyłem na określanie braku widoku w plikach cshtml, w których go nie chcę, i określanie _mydefaultview dla reszty. Nie wiem, dlaczego było to konieczne, ale zadziałało.źródło
_ViewStart
Należy uruchomić przed kodu w widoku, więc ten problem nie powinien się zdarzyć. Czy masz coś niezwykłego w swoim _ViewStart?_ViewStart
. Zobacz moją odpowiedź.Myślę, że to :
@{ Layout = ""; }
to nie to samo co to:
@{ Layout = null; }
Używam drugiego i działa, nie zawiera _Viewstart.
źródło
Ty (i KMulligan) jesteście niezrozumiałymi
_ViewStart
stronami._ViewStart
zawsze będzie wykonywany przed uruchomieniem strony.Jest przeznaczony do inicjowania właściwości (takich jak
Layout
); generalnie nie powinien zawierać znaczników. (Ponieważ nie ma sposobu, aby to zmienić).Prawidłowym wzorcem jest utworzenie oddzielnej strony układu, która wywołuje
RenderBody
i ustawienieLayout
właściwości tak, aby wskazywała na tę stronę_ViewStart
.Następnie możesz zmienić
Layout
strony z treścią, a zmiany zaczną obowiązywać.źródło
_Layout.cshtml
zawiera wszystkie podstawowe projekty. i_ViewStart.cshtml
wywołuje_Layout.cshtml
. Każdy moduł mojej aplikacji ma własną stronę układu, ale ten układ używa pliku main_Layout.cshtml
. ponieważ aplikacja mvc zaczyna się od viewstartu, wydaje mi się, że moim jedynym rozwiązaniem było skomentowanie wszystkiego wewnątrz viewstart. i to nie powoduje żadnych dodatkowych problemów, ponieważ inne strony już używały_Layout.cshtml
. dość proste.Myślę, że lepiej jest pracować z indywidualnymi „widokami”, próbuję przejść z PHP na MVC4, jest to naprawdę trudne, ale jestem na dobrej drodze ...
Odpowiadając na Twoje pytanie, jeśli będziesz pracować na poszczególnych stronach, po prostu edytuj plik _ViewStart.cshtml
@{ Layout = null; }
Kolejna wskazówka, jeśli masz problemy ze ścieżką CSS ...
Umieść „../” przed adresem URL
Oto 2 problemy, które dziś napotykam i rozwiązuję je w ten sposób!
Pozdrowienia;
źródło
Logika określająca, czy widok powinien używać układu, czy nie, nie powinna znajdować się w
_viewStart
aniView
. Ustawienie wartości domyślnej w programie_viewStart
jest w porządku, ale dodanie jakiejkolwiek logiki układu w widoku view / viewstart zapobiega używaniu tego widoku w innym miejscu (z układem lub bez).Twoja akcja kontrolera powinna:
return PartialView()
Umieszczając ten typ logiki w Widoku, łamiesz zasadę pojedynczej odpowiedzialności w M (dane), V (wizualne), C (logika).
źródło
we could write code within our _ViewStart.cshtml file to programmatically set the Layout property for each View ... we could vary the Layout template that we use depending on what type of device is accessing the site – and have a phone or tablet optimized layout for those devices
Wyraźnie promuje _viewstart jako miejsce do używania logiki do przełączania układów (wspomina również o kontrolerach i filtrach akcji). Jest to więc bardziej kwestia preferencji niż absolutów: gdzie zmienić układy... may or may not (JSON/XML) not even be Html rendered by a View Engine
nie ma znaczenia. _Layout to po prostu widok, który otacza widok. (Nie wszystkie zaczynają się od<!DOCTYPE html>
). Więc może być całkowicie wykonalne, aby _ViewStart włączał i wyłączał _layouts według jakiejś właściwości, np. Dnia tygodnia. W danym kontekście mogłoby to złamać SRP, gdyby kontroler A dla ViewA decydował o tym, do której strony _layout wstrzyknąć ViewA, ponieważ wykracza to poza zakres SRP. Istnieje tylko do obsługi ViewA <> ViewModelA.Posługiwać się:
@{ Layout = null; }
pozbyć się układu określonego w _ViewStart.
źródło
Po prostu utwórz widok jako widok częściowy, aby nie był używany żaden plik układu.
źródło
Chciałem wyświetlić stronę logowania bez układu i działa to całkiem nieźle. (To jest plik _ViewStart.cshtml) Musisz ustawić ViewBag.Title w kontrolerze.
@{ if (! (ViewContext.ViewBag.Title == "Login")) { Layout = "~/Views/Shared/_Layout.cshtml"; } }
Wiem, że jest trochę późno, ale mam nadzieję, że to pomoże niektórym ciału.
źródło
Procedura 1: Sterowanie renderowaniem układów przy użyciu pliku _ViewStart w katalogu głównym folderu widoki
Ta metoda jest najprostszym sposobem dla początkujących na kontrolowanie renderowania układów w aplikacji ASP.NET MVC. Możemy zidentyfikować kontroler i wyrenderować Layouts jako kontroler par, w tym celu możemy napisać nasz kod w pliku _ViewStart w katalogu głównym folderu Views. Poniższy przykład pokazuje, jak można to zrobić.
@{ var controller = HttpContext.Current.Request.RequestContext.RouteData.Values["Controller"].ToString(); string cLayout = ""; if (controller == "Webmaster") { cLayout = "~/Views/Shared/_WebmasterLayout.cshtml"; } else { cLayout = "~/Views/Shared/_Layout.cshtml"; } Layout = cLayout; }
Procedura 2: Ustaw układ, powracając z ActionResult
Jedną z najlepszych funkcji ASP.NET MVC jest to, że możemy zastąpić domyślne renderowanie układu, zwracając układ z ActionResult. Jest to więc również sposób renderowania innego układu w aplikacji ASP.NET MVC. Poniższy przykładowy kod pokazuje, jak można to zrobić.
public ActionResult Index() { SampleModel model = new SampleModel(); //Any Logic return View("Index", "_WebmasterLayout", model); }
Procedura 3: Widok - mądry układ (poprzez zdefiniowanie układu w każdym widoku na górze)
ASP.NET MVC zapewnia nam tak wspaniałą funkcję i możliwość faksowania, aby zastąpić domyślne renderowanie układu przez zdefiniowanie układu w widoku. Aby to zaimplementować, możemy napisać nasz kod w następujący sposób w każdym widoku.
@{ Layout = "~/Views/Shared/_WebmasterLayout.cshtml"; }
Procedura 4: Umieszczenie pliku _ViewStart w każdym z katalogów
Jest to bardzo przydatny sposób ustawiania różnych układów dla każdego kontrolera w aplikacji ASP.NET MVC. Jeśli chcemy ustawić domyślny układ dla każdego katalogu, możemy to zrobić, umieszczając plik _ViewStart w każdym z katalogów z wymaganymi informacjami o układzie, jak pokazano poniżej:
@{ Layout = "~/Views/Shared/_WebmasterLayout.cshtml"; }
źródło
Jeśli pracujesz z aplikacjami, wypróbuj środek czyszczący. Naprawiono dla mnie.
źródło