Widok Razor bez układu

81

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>
Greg B.
źródło
Czy widzisz słowo nullna renderowanej stronie?
SLaks
Gdzie ustawiasz domyślny układ?
SLaks
Czy masz plik _viewstart.cshtml w tym katalogu? Miałem ten sam problem, który masz, kiedy próbowałem użyć _viewstart. Następnie zmieniłem jego nazwę na _mydefaultview, przeniosłem go do katalogu views / shared i przełączyłem się 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.
DMulligan,
ustaw to jako odpowiedź, a zaznaczę to jako poprawne. to musi być błąd w maszynce do golenia?
Nie jestem pewien, czy to błąd, _viewstarts nie mają być nadpisywane, czy też zrobiliśmy coś źle. Też chciałbym wiedzieć.
DMulligan,

Odpowiedzi:

14

Czy masz _ViewStart.cshtmlw 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 do Views/Sharedkatalogu 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.

DMulligan
źródło
To brzmi dziwnie. _ViewStartNależy uruchomić przed kodu w widoku, więc ten problem nie powinien się zdarzyć. Czy masz coś niezwykłego w swoim _ViewStart?
SLaks,
@ SLaks ♦ Zrobiłem _viewstart, który zawiera tylko „Hello World” do przetestowania, a Hello World nadal się wyświetla, nawet jeśli określę Layout = null. Jeśli jednak określę _mydefaultview jako układ, to również się pojawi. „Witaj świecie” pojawia się między tagami, w których mam @RenderBody () w _mydefaultview.
DMulligan,
4
Nie rozumiesz _ViewStart. Zobacz moją odpowiedź.
SLaks
162

Myślę, że to :

@{
    Layout = "";
 }

to nie to samo co to:

@{
    Layout = null;
 }

Używam drugiego i działa, nie zawiera _Viewstart.

Jean-Baptiste HENRY
źródło
4
Dlaczego to nie jest prawidłowa odpowiedź na to pytanie?
Piński
1
To ostatnie zadziałało dla mnie i było pierwszą rzeczą, która przyszła mi do głowy.
Stonetip,
@Pinski prawdopodobnie dlatego, że został dodany 2 lata później. :)
WildJoe
35

Ty (i KMulligan) jesteście niezrozumiałymi _ViewStartstronami.

_ViewStartzawsze 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 RenderBodyi ustawienie Layoutwłaściwości tak, aby wskazywała na tę stronę _ViewStart.

Następnie możesz zmienić Layoutstrony z treścią, a zmiany zaczną obowiązywać.

SLaks
źródło
Cóż, mój _Layout.cshtmlzawiera wszystkie podstawowe projekty. i _ViewStart.cshtmlwywoł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.
Wahid Masud
23

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;

saviiles
źródło
21

Logika określająca, czy widok powinien używać układu, czy nie, nie powinna znajdować się w _viewStartani View. Ustawienie wartości domyślnej w programie _viewStartjest 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).

Erik Philips
źródło
Jest to sprzeczne z tym, co mówi tutaj Scott Gu weblogs.asp.net/scottgu/asp-net-mvc-3-layouts . 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 devicesWyraź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.
ryzm
Wolę trzymać się wzorów. Możesz rzucić dostęp do bazy danych w swoim widoku, to także zła praktyka lub „kwestia preferencji”.
Erik Philips
Jest to dość hiperboliczna odpowiedź, podobnie jak stwierdzenie „dodanie jakiejkolwiek logiki układu w widoku / początku widoku uniemożliwia użycie tego widoku w innym miejscu”. Zależy to całkowicie od danej aplikacji. Istnieje niezliczona ilość przykładów, w których dany widok nie jest zależny od swojego pliku układu (głównego). Wzorzec jest po prostu dostępny dla marki lub nawigacji, a wszystko, czego możemy chcieć, to przełączanie się między układem mobilnym a stacjonarnym (odkładając układy płynne). Można nawet argumentować, że w rzeczywistości łamie się SRP, czyniąc kontroler również odpowiedzialnym za przełączanie układów w tym kontekście.
ryzm
Nie widzę twojego punktu widzenia w sprawie ostatniego stwierdzenia. Widok jest prezentacją danych. Jakakolwiek logika w tym widoku oznacza, że ​​nie może być używana w innym miejscu i zapobiega testowaniu tej logiki, co normalnie miałoby miejsce w kontrolerze. Kontroler ma już wbudowaną logikę w MVC ( IsAjaxRequest lub ChildActionOnly ), aby określić poprawną prezentację.
Erik Philips
1
Tutaj mówimy o _ViewStart, które są specyficzne dla ViewResult. Więc .. may or may not (JSON/XML) not even be Html rendered by a View Enginenie 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.
ryzm
11

Posługiwać się:

@{
    Layout = null;
 }

pozbyć się układu określonego w _ViewStart.

Soroush
źródło
2

Po prostu utwórz widok jako widok częściowy, aby nie był używany żaden plik układu.

nsdiv
źródło
2

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.

Souhaib Lamine
źródło
2

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";
}
Anand Gaikwad
źródło
-2

Jeśli pracujesz z aplikacjami, wypróbuj środek czyszczący. Naprawiono dla mnie.

Liam Fielding
źródło