Erzwingen Sie, dass alle Bereiche dasselbe Layout verwenden


87

Ich habe folgende Projektstruktur:

  • / Views / Shared / _Layout;

  • / Areas / Area1 / Views / ControllerName / Index;

...

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

Gibt es eine Möglichkeit , alle Bereiche zu zwingen , die verwenden _Layout als Basis - Layout ?

Gibt es eine Möglichkeit, dies zu tun, ohne die _ViewStart- Datei hinzuzufügen (z. B. über die Routing-Konfiguration)?

Siehe auch:

Wie gebe ich verschiedene Layouts in der ViewStart-Datei von ASP.NET MVC 3 an?


Hier ist eine gute Antwort und eine andere
Rafael Emshoff

Antworten:


154

Sie müssen nur eine Datei mit dem Namen hinzufügen:

_ViewStart.cshtml

Unter jedem Bereich Ansichten Ordner:

/Areas/Area1/Views/_ViewStart.cshtml

Bearbeiten Sie die Datei so, dass sie auf das Root-Layout verweist:

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

Damit dies funktioniert, müssen Sie keinen Wert in der Layout-Eigenschaft der Ansicht angeben. Andernfalls würden Sie das globale Layout überschreiben

Hinweis: Wie Tony bereits erwähnt hat, können Sie die Layout-Eigenschaften jeder Ansicht so bearbeiten, dass sie auf das Stammlayout verweisen. Dies ist jedoch nicht die empfohlene Methode, da Sie Ihre Ansichten mit Ihrem Layout koppeln und es schmerzhaft ändern würden

Bearbeiten 1

Wenn Sie Code zum Festlegen des Layouts der Standardansicht verwenden möchten, sollten Sie möglicherweise eine benutzerdefinierte Ansichts-Engine schreiben.

Versuchen Sie, über benutzerdefinierte RazorViewEngineund zu googelnRazorView

Dieser Artikel könnte ein guter Ausgangspunkt sein

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

Ich habe so etwas noch nicht gemacht, aber ich hoffe, ich zeige Ihnen die richtige Richtung


1
Gibt es eine Möglichkeit, dies zu tun, ohne die Datei "_ViewStart" hinzuzufügen (z. B. über die Routing-Konfiguration)?
Mikhail

2
Innerhalb des Routings denke ich nicht. Das sind zwei verschiedene Dinge. Das Routing ist dafür verantwortlich, zu versuchen, die aktuelle Anforderungs-URL mit einer in der RoutesTable registrierten Route abzugleichen. Wenn eine Übereinstimmung gefunden wird, wird ein IMvcRouteHandler erstellt und anschließend ein IHttpHandler (MvcHandler) für die Verarbeitung der Aktion Ihres Controllers verantwortlich. Wie Sie sehen, hat dies nichts mit Ansichten oder Layouts zu tun. Dies liegt daran, dass eine Route nicht unbedingt eine Ansicht zurückgibt, sondern JSON oder XML zurückgeben kann. Routing ist also nicht der richtige Ort, um so etwas zu implementieren.
Jupaol

Sie können das auch _ViewStartdirekt im Ordner "Bereich" hinzufügen , um es auf alle Bereiche anzuwenden.
Artur

21

Erweiterung der Antwort von Jupaol ....

Zumindest in VS2013 wird die Datei _ViewStart.cshtml beim Erstellen des Bereichs standardmäßig hinzugefügt, sodass sie bereits vorhanden ist. Sie können den Inhalt so ändern, wie er es bemerkt, um auf das Stammverzeichnis _Layout.cshtml zu verweisen. Sie können dann die Datei _Layout.cshtml in dem Bereich entfernen, da sie nicht mehr verwendet wird (und jetzt eine potenzielle Quelle der Verwirrung darstellt).

Bei diesem Routing in diesem Stammverzeichnis _Layout.cshtml müssen jedoch Bereiche berücksichtigt werden.
Die Standarddatei _Layout.cshtml enthält eine Reihe von ActionLink-Hilfsprogrammen, die geringfügig geändert werden müssen:

Fügen Sie den Parameter RouteValueDictionary zu allen ActionLink-Aufrufen hinzu, indem Sie Area = "" setzen. Beachten Sie, dass sich eine leere Zeichenfolge auf die Stammebene bezieht. Auf diese Weise funktionieren diese Links ordnungsgemäß, wenn sie aus einem Bereich heraus aufgerufen werden. Sie funktionieren weiterhin, wenn sie vom Stamm aus aufgerufen werden.

z.B:

<li>@Html.ActionLink("Home", "Index", "Home", new { Area = "" }, null)</li>

2

Sie legen ein Layout fest mit:

@ {Layout = "_Layout"; }}

Wenn Sie dies einfacher machen möchten, können Sie alles auf einmal ändern. Vielleicht könnten Sie es einfach als View-Bag-Variable festlegen und an den Controller übergeben. Um es noch einfacher zu machen, können Sie einen Basis-Controller erstellen, von dem die anderen Controller erben, und das Layout der Ansichtstasche dort zuweisen.

Ich bin mir nicht sicher, warum sich das Routing ändern müsste, oder ich verstehe es nicht. Hoffe das hilft :)

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.