Rasiermesseransicht ohne Layout

80

Wie kommt es, wenn ich Layout = null;in meiner Ansicht habe - es zieht immer noch das Standardlayout?!

Gibt es einen Trick, um das zu verhindern?

Hier ist meine Ansicht ohne Layout:

@{
    Layout = "";
}

<!DOCTYPE html>

<html>
<head>
    <title>Index</title>
    @{Html.RenderAction("Head", "Header");}
</head>
<body>
    <div>
        Home
    </div>
</body>
</html>

Hier ist die gerenderte Ausgabe !!

<!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.
quelle
Sehen Sie das Wort nullauf der gerenderten Seite?
SLaks
Wo legen Sie das Standardlayout fest?
SLaks
Haben Sie eine _viewstart.cshtml in diesem Verzeichnis? Ich hatte das gleiche Problem, das Sie hatten, als ich versuchte, _viewstart zu verwenden. Dann habe ich es in _mydefaultview umbenannt, in das Verzeichnis views / shared verschoben und in cshtml-Dateien, in denen ich es nicht möchte, keine Ansicht angegeben und für den Rest _mydefaultview angegeben. Ich weiß nicht, warum das notwendig war, aber es hat funktioniert.
DMulligan
Bitte setzen Sie das als Antwort und ich werde es richtig markieren. Das muss sicher ein Fehler im Rasiermesser sein?
Ich bin mir nicht sicher, ob es sich um einen Fehler handelt, _viewstarts nicht überschrieben werden sollen oder ob wir etwas falsch gemacht haben. Ich würde es auch gerne wissen.
DMulligan

Antworten:

14

Haben Sie eine _ViewStart.cshtmlin diesem Verzeichnis? Ich hatte das gleiche Problem, das Sie hatten, als ich versuchte, _ViewStart zu verwenden. Dann habe ich es in _mydefaultview umbenannt, in das Views/SharedVerzeichnis verschoben und zu "Keine Ansicht in cshtml-Dateien angeben, in denen ich es nicht möchte" und für den Rest _mydefaultview angegeben. Ich weiß nicht, warum das notwendig war, aber es hat funktioniert.

DMulligan
quelle
Das klingt komisch. Das _ViewStartsollte vor dem Code in der Ansicht ausgeführt werden, damit dieses Problem nicht auftritt. Haben Sie etwas Ungewöhnliches in Ihrem _ViewStart?
SLaks
@ SLaks ♦ Ich habe einen _viewstart erstellt, der nur "Hello World" zum Testen enthält, und die Hello World wird immer noch angezeigt, auch wenn ich Layout = null angegeben habe. Wenn ich jedoch _mydefaultview als Layout spezifiziere, wird dies auch angezeigt. Die "Hallo Welt" wird zwischen Tags angezeigt, bei denen ich @RenderBody () in _mydefaultview habe.
DMulligan
4
Du verstehst falsch _ViewStart. Siehe meine Antwort.
SLaks
155

Ich denke das :

@{
    Layout = "";
 }

ist nicht dasselbe wie das:

@{
    Layout = null;
 }

Ich benutze die zweite und es funktioniert, kein _Viewstart enthalten.

Jean-Baptiste HENRY
quelle
4
Wie ist das nicht die richtige Antwort auf diese Frage?
Pinski
1
Letzteres hat bei mir funktioniert und war das erste, was mir in den Sinn kam.
Stonetip
@Pinski wahrscheinlich, weil es 2 Jahre später hinzugefügt wurde. :)
WildJoe
35

Sie (und KMulligan) verstehen _ViewStartSeiten falsch .

_ViewStartwird immer ausgeführt, bevor Ihre Seite startet.
Es soll zum Initialisieren von Eigenschaften (z. B. Layout) verwendet werden. Es sollte im Allgemeinen kein Markup enthalten. (Da es keine Möglichkeit gibt, es zu überschreiben).

Das richtige Muster besteht darin, eine separate Layoutseite zu erstellen, die aufruft RenderBody, und die LayoutEigenschaft so festzulegen, dass sie auf diese Seite in verweist _ViewStart.

Sie können dann LayoutIhre Inhaltsseiten ändern , und die Änderungen werden wirksam.

SLaks
quelle
Nun, meine _Layout.cshtmlenthält alle grundlegenden Designs. und _ViewStart.cshtmlruft die _Layout.cshtml. Jedes Modul meiner App hat eine eigene Layoutseite, aber dieses Layout verwendet die Hauptseite _Layout.cshtml. Da die MVC-App vom Viewstart aus startet, war meine einzige Lösung wohl, alles in Viewstart zu kommentieren. und das verursacht keine zusätzlichen Probleme, da andere Seiten bereits verwendet wurden _Layout.cshtml. ziemlich einfach.
Wahid Masud
23

Ich denke, es ist besser, mit individuellen "Ansichten" zu arbeiten. Ich versuche, von PHP zu MVC4 zu wechseln. Es ist wirklich schwierig, aber ich bin auf dem richtigen Weg ...

Wenn Sie Ihre Frage beantworten und einzelne Seiten bearbeiten, bearbeiten Sie einfach die Datei _ViewStart.cshtml

@{
  Layout = null;
}

Ein weiterer Tipp, wenn Sie Probleme mit dem CSS-Pfad haben ...

Setzen Sie "../" vor die URL

Dies sind die 2 Probleme, die ich heute bekomme und die ich auf diese Weise löse!

Grüße;

Saviiles
quelle
21

Logik zum Bestimmen, ob eine Ansicht ein Layout verwenden soll oder nicht, sollte NICHT in der _viewStartnoch der sein View. Das Festlegen einer Standardeinstellung in _viewStartist in Ordnung, aber das Hinzufügen einer Layoutlogik in der Ansicht / im Ansichtsstart verhindert, dass diese Ansicht an einer anderen Stelle (mit oder ohne Layout) verwendet wird.

Ihre Controller-Aktion sollte:

return PartialView()

Indem Sie diese Art von Logik in die Ansicht einfügen, brechen Sie die Grundregel der Einzelverantwortung in M (Daten), V (visuell), C (Logik).

Erik Philips
quelle
Dies steht im Widerspruch zu dem, was Scott Gu hier sagt: 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 devicesEr wirbt eindeutig für _viewstart als einen Ort, an dem Logik zum Wechseln von Layouts verwendet werden kann (erwähnt auch Controller und Aktionsfilter). Es ist also eher eine Frage der Präferenz als der absoluten Frage, wo Layouts gewechselt werden sollen.
Rism
Ich halte mich lieber an Designmuster. Sie können den Datenbankzugriff in Ihre Ansicht werfen, es ist auch eine schlechte Praxis oder "eine Frage der Präferenz".
Erik Philips
Dies ist eine ziemlich hyperbolische Antwort, ebenso wie die Aussage "Das Hinzufügen einer Layoutlogik in der Ansicht / im Ansichtsstart verhindert, dass diese Ansicht irgendwo anders verwendet wird". Es hängt ganz von der jeweiligen Anwendung ab. Es gibt unzählige Beispiele, in denen eine bestimmte Ansicht nicht von ihrer Layoutdatei (Masterdatei) abhängig ist. Der Master ist einfach für ein Branding oder Navi da und alles, was wir tun möchten, ist zwischen einem mobilen und einem Desktop-Layout zu wechseln (flüssige Layouts beiseite). Man könnte sogar argumentieren, dass Sie SRP tatsächlich brechen, indem Sie einen Controller in diesem Zusammenhang auch für das Wechseln von Layouts verantwortlich machen.
Rism
Ich sehe Ihren Standpunkt in Ihrer letzten Aussage nicht. Die Ansicht ist die Darstellung von Daten. Jede Logik in dieser Ansicht bedeutet, dass sie nicht anderweitig verwendet werden kann, und verhindert das Testen dieser Logik, die normalerweise in der Steuerung stattfinden würde. Der Controller verfügt bereits über eine in MVC integrierte Logik ( IsAjaxRequest oder ChildActionOnly ), um die korrekte Darstellung zu ermitteln.
Erik Philips
1
Hier geht es um _ViewStart, die ViewResult-spezifisch sind. Hat .. may or may not (JSON/XML) not even be Html rendered by a View Enginealso keine Bedeutung. Ein _layout ist nur eine Ansicht, die eine Ansicht umschließt. (Sie beginnen nicht alle mit <!DOCTYPE html>). Daher ist es möglicherweise durchaus möglich, dass _ViewStart _Layouts je nach Eigenschaft, z. B. Wochentag, ein- und ausschaltet. In einem bestimmten Kontext kann es zu einer Unterbrechung der SRP führen, wenn ControllerA für eine ViewA festgelegt wird, in welche _layout-Seite ViewA eingefügt werden soll, da dies außerhalb des SRP-Bereichs liegt. Es ist nur zur Unterstützung von ViewA <> ViewModelA vorhanden.
Rism
11

Verwenden:

@{
    Layout = null;
 }

um das in _ViewStart angegebene Layout zu entfernen.

Soroush
quelle
2

Erstellen Sie die Ansicht einfach als Teilansicht, damit keine Layoutdatei verwendet wird.

nsdiv
quelle
2

Ich wollte die Anmeldeseite ohne Layout anzeigen und das funktioniert ziemlich gut für mich. (Dies ist die Datei _ViewStart.cshtml.) Sie müssen den ViewBag.Title im Controller festlegen.

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

Ich weiß, dass es ein bisschen spät ist, aber ich hoffe, dass dies einem Körper hilft.

Souhaib Lamine
quelle
2

Prozedur 1: Steuern Sie das Rendern von Layouts mithilfe der Datei _ViewStart im Stammverzeichnis des Ordners Ansichten

Diese Methode ist für Anfänger die einfachste Möglichkeit, das Rendern von Layouts in Ihrer ASP.NET MVC-Anwendung zu steuern. Wir können den Controller identifizieren und die Layouts als Par-Controller rendern. Dazu können wir unseren Code in die _ViewStart-Datei im Stammverzeichnis des Views-Ordners schreiben. Das folgende Beispiel zeigt, wie es gemacht werden kann.

 @{
 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;
 }

Prozedur 2: Legen Sie das Layout fest, indem Sie von ActionResult zurückkehren

Eine der großartigen Funktionen von ASP.NET MVC ist, dass wir das Standard-Layout-Rendering überschreiben können, indem wir das Layout aus dem ActionResult zurückgeben. Auf diese Weise können Sie auch ein anderes Layout in Ihrer ASP.NET MVC-Anwendung rendern. Das folgende Codebeispiel zeigt, wie es gemacht werden kann.

public ActionResult Index()
{
 SampleModel model = new SampleModel();
 //Any Logic
 return View("Index", "_WebmasterLayout", model);
}

Prozedur 3: Ansichtsweises Layout (durch Definieren des Layouts in jeder Ansicht oben)

ASP.NET MVC bietet uns eine großartige Funktion und Faxbarkeit, um das Standard-Layout-Rendering zu überschreiben, indem das Layout in der Ansicht definiert wird. Um dies zu implementieren, können wir unseren Code in jeder Ansicht folgendermaßen schreiben.

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

Prozedur 4: Platzieren der _ViewStart-Datei in jedem der Verzeichnisse

Dies ist eine sehr nützliche Methode, um unterschiedliche Layouts für jeden Controller in Ihrer ASP.NET MVC-Anwendung festzulegen. Wenn Sie das Standardlayout für jedes Verzeichnis festlegen möchten, können Sie dies tun, indem Sie die _ViewStart-Datei in jedes der Verzeichnisse mit den erforderlichen Layoutinformationen einfügen, wie unten gezeigt:

@{
  Layout = "~/Views/Shared/_WebmasterLayout.cshtml";
}
Anand Gaikwad
quelle
-2

Wenn Sie mit Apps arbeiten, versuchen Sie es mit einer Reinigungslösung. Für mich behoben.

Liam Fielding
quelle