2011-07-07 10 views
44

Jak to się stało, kiedy mam Layout = null; moim zdaniem - to nadal ciągnie w układzie domyślnym ?!Razor Zobacz Bez Układ

Czy jest jakaś sztuczka, aby to powstrzymać?

Oto moim zdaniem 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> 
+0

Proszę pokazać nam swój kod. – SLaks

+0

Czy widzisz słowo "null" na renderowanej stronie? – SLaks

+0

@slaks - nie patrz powyżej – iwayneo

Odpowiedz

6

Czy masz _viewstart.cshtml w tym katalogu? Miałem ten sam problem, który wystąpił podczas próby użycia _viewstart. Potem zmieniłem nazwę _mydefaultview, przeniosłem ją do widoku/katalogu współużytkowanego i przełączyłem się na określanie braku widoku w plikach cshtml, gdzie nie chcę tego, i określanie _mydefaultview dla reszty. Nie wiem, dlaczego to było konieczne, ale zadziałało.

+0

To brzmi dziwnie. '_ViewStart' powinien działać przed kodem w widoku, więc ten problem nie powinien wystąpić. Czy masz coś niezwykłego w swoim _ViewStart? – SLaks

+0

@ SLaks ♦ Zrobiłem _viewstart, który po prostu zawiera "Hello World", aby przetestować, a Hello World nadal się wyświetla, nawet jeśli podam Layout = null. Jeśli jednak podaję _modelefault jako układ, to również się pojawi. "Witaj świecie" pojawia się pomiędzy tagami, gdzie mam @RenderBody() w _mydefaultview. – DMulligan

+3

Mylnie interpretujesz '_ViewStart'. Zobacz moją odpowiedź. – SLaks

28

You (i KMulligan) są nieporozumienia _ViewStart stron.

_ViewStart będzie zawsze wykonać, zanim rozpocznie się twoja strona.
Jest przeznaczony do inicjowania właściwości (takich jak Layout); na ogół nie powinien zawierać znaczników. (Ponieważ nie ma sposobu, aby to zmienić).

Poprawny wzór to utworzenie osobnej strony układu, która wywołuje RenderBody i ustawienie właściwości Layout w celu wskazania tej strony w _ViewStart.

Następnie można zmienić Layout na stronach z treścią, a zmiany zostaną wprowadzone.

74

myślę tak:

@{ 
    Layout = ""; 
} 

nie jest taki sam jak ten:

@{ 
    Layout = null; 
} 

używam drugi i to działa, nie _Viewstart włączone.

+3

Jak to nie jest poprawna odpowiedź na to pytanie? – Pinski

+0

Ten ostatni pracował dla mnie i był pierwszą rzeczą, która przyszła mi do głowy. – Stonetip

+0

@Pinski prawdopodobnie dlatego, że został dodany 2 lata później. :) – WildJoe

1

Wystarczy utworzyć widok w częściowym widokiem tak, że nie jest używany plik układ.

+0

Niestety jakoś to nie działa w MVC5 – mcy

5

myślę, że lepiej pracować z poszczególnymi „widoki”, Im próbuje przenieść z PHP do MVC4, jej naprawdę ciężko, ale im na dobrej drodze ...

Odpowiadając na pytanie, czy będzie to praca indywidualna stron, po prostu edytować _ViewStart.cshtml

@{ 
    Layout = null; 
} 

Kolejna wskazówka, jeśli jesteś coraz pewne problemy ze ścieżką CSS ...

put "../" przed url

To są 2 problemy, które dostaję dzisiaj, i postanawiam w ten sposób!

Pozdrawiam;

11

Logic do określania, czy należy użyć Zobacz układ czy nie, nie powinno być w _viewStart ani View.Ustawienie wartości domyślnej w _viewStart jest w porządku, ale dodanie dowolnej logiki układu w widoku/widoku spowoduje, że widok nie będzie używany nigdzie indziej (z układem lub bez niego).

Twój Action Controller powinien:

return PartialView() 

Stawiając ten rodzaj logiki w widoku ty zerwania Single responsibility principle regułę wm (dane), V (wizualne), C (logika).

+0

Jest to sprzeczne z tym, co Scott Gu mówi tutaj: http://weblogs.asp.net/scottgu/asp-net-mvc-3-layouts. "moglibyśmy napisać kod w naszym pliku _ViewStart.cshtml, aby programowo ustawić właściwość Layout dla każdego widoku ... mogliśmy zmieniać szablon układu, którego używamy w zależności od tego, jaki typ urządzenia uzyskuje dostęp do witryny - i mieć zoptymalizowany telefon lub tablet układ tych urządzeń "Wyraźnie promuje _viewstart jako miejsce do użycia logiki do przełączania układów (wspomina także kontrolery i filtry akcji). Więc jest bardziej kwestią preferencji niż absolutes re: gdzie przełączać układy. – rism

+0

Ja wolę trzymać się wzorów wzorów. Możesz rzucić dostęp do bazy danych w swoim widoku, to także zła praktyka lub "kwestia preferencji". –

+0

To dość hiperboliczna odpowiedź, podobnie jak stwierdzenie "dodanie dowolnej logiki układu w widoku/widoku uniemożliwia wykorzystanie tego widoku w innym miejscu". To zależy całkowicie od aplikacji, o której mowa. Istnieją niezliczone przykłady, w których dany widok nie jest zależny od jego układu (głównego) pliku. Mistrz jest po prostu dla marki lub nav i wszystko, co możemy chcieć zrobić, to przełączać się między układem mobilnym i stacjonarnym (odkładanie płynów na bok). Można nawet argumentować, że faktycznie łamiemy SRP przez uczynienie kontrolera również odpowiedzialnym za przełączanie układów w tym kontekście. – rism

2

Chciałem wyświetlić stronę logowania bez układu i to działa całkiem nieźle (jest to plik _ViewStart.cshtml) Musisz ustawić ViewBag.Title w kontrolerze.

@{ 
    if (! (ViewContext.ViewBag.Title == "Login")) 
    { 
     Layout = "~/Views/Shared/_Layout.cshtml";   
    } 
} 

Wiem, że to trochę późno, ale mam nadzieję, że to pomoże trochę ciała.

6

Zastosowanie:

@{ 
    Layout = null; 
} 

pozbyć układzie określonym w _ViewStart.

1

Procedura 1: Układy sterujące renderowania za pomocą pliku _ViewStart w katalogu głównego folderu Widoki

Metoda ta jest najprostszym sposobem dla początkujących, aby kontrolować Układy renderowania w aplikacji ASP.NET MVC. Możemy zidentyfikować kontroler i wyrenderować układy jako kontroler par, aby to zrobić, możemy napisać nasz kod w pliku _ViewStart w katalogu głównym w folderze Widoki. 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: Zestaw Układ powracając z ActionResult

jednym z wielką cechą ASP.NET MVC jest to, że możemy zastąpić domyślny układ rendering wracając układ z ActionResult. Jest to również sposób renderowania różnych układów w aplikacji ASP.NET MVC. Poniższy przykład kodu 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 Layout (Układ Definiując ramach każdego widokiem na góry)

ASP.NET MVC daje nam taką wielką cechą & faxibility nadpisać domyślny układ przez rendering definiowanie 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: Umieszczanie pliku _ViewStart w każdym z katalogów

Jest to bardzo skuteczny sposób, aby ustawić różne układy dla każdego kontrolera w aplikacji ASP.NET MVC. Jeśli chcemy, aby ustawić domyślny układ dla poszczególnych katalogów niż możemy to zrobić poprzez umieszczenie pliku _ViewStart w każdym z katalogów z wymaganymi informacjami Układ jak pokazano poniżej:

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