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

313

Ich möchte 2 separate Layouts in meiner Anwendung haben. Angenommen, einer ist für den öffentlichen Bereich der Website und der andere für die Mitgliederseite.

Nehmen wir zur Vereinfachung an, die gesamte Logik für jede dieser Sites ist ordentlich in zwei verschiedene Controller verpackt.

  • PublicController
  • StaffController

Und dass sie jeweils ein entsprechendes Layout für die gesamte Ansicht haben.

  • _PublicLayout.cshtml
  • _StaffLayout.cshtml

Wie verwende ich die Datei _ViewStart.cshtml, um anzugeben, dass alle Ansichten / Aktionen unter "Öffentlich" das PublicLayout und alle unter "Mitarbeiter" das StaffLayout verwenden?

Vielen Dank!

Justin
quelle
4
Nur für den Fall: Wenn Sie das Layout für eine bestimmte RazorAnsicht entfernen möchten , setzen Sie einfachLayout = null;
Leniel Maccaferri
3
Nur als Kommentar zu Ihrem Beispiel sollten Sie wahrscheinlich keine Controller mit dem Namen Public and Staff haben. Controller werden am häufigsten als Einstiegspunkt für CRUD-ähnliche Aktionen für bestimmte wichtige Geschäftseinheiten wie EventController, UserController oder dergleichen implementiert. Wenn Ihre Anwendung relativ groß ist, ist die Verantwortung eines öffentlichen / Personal-Controllers viel zu weit gefasst. Betrachten Sie stattdessen Bereiche. msdn.microsoft.com/en-us/library/ee671793%28VS.100%29.aspx Sie wissen das vielleicht, aber jemand anderes, der dies liest, hat möglicherweise die falsche Idee, also nur für die Aufzeichnung.
Alex

Antworten:

558

Sie können eine _ViewStart.cshtmlDatei in den /Views/PublicOrdner einfügen, die die Standarddatei im /ViewsOrdner überschreibt und das gewünschte Layout angibt:

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

Analog könnten Sie eine andere _ViewStart.cshtmlDatei in den /Views/StaffOrdner legen mit:

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

Sie können auch angeben, welches Layout verwendet werden soll, wenn eine Ansicht innerhalb einer Controller-Aktion zurückgegeben wird. Dies gilt jedoch pro Aktion:

return View("Index", "~/Views/Shared/_StaffLayout.cshtml", someViewModel);

Eine weitere Möglichkeit ist ein benutzerdefinierter Aktionsfilter, der das Layout überschreibt. Wie Sie sehen, gibt es viele Möglichkeiten, dies zu erreichen. Sie können selbst entscheiden, welches am besten zu Ihrem Szenario passt.


AKTUALISIEREN:

Wie im Kommentarbereich angefordert, ist hier ein Beispiel für einen Aktionsfilter, der eine Masterseite auswählen würde:

public class LayoutInjecterAttribute : ActionFilterAttribute
{
    private readonly string _masterName;
    public LayoutInjecterAttribute(string masterName)
    {
        _masterName = masterName;
    }

    public override void OnActionExecuted(ActionExecutedContext filterContext)
    {
        base.OnActionExecuted(filterContext);
        var result = filterContext.Result as ViewResult;
        if (result != null)
        {
            result.MasterName = _masterName;
        }
    }
}

und dekorieren Sie dann einen Controller oder eine Aktion mit diesem benutzerdefinierten Attribut, das das gewünschte Layout angibt:

[LayoutInjecter("_PublicLayout")]
public ActionResult Index()
{
    return View();
}
Darin Dimitrov
quelle
1
@DarinDimitrov Wo ich erstellen werde LayoutInjecterAttribute. ? Gibt es einen bestimmten Ort?
kbvishnu
2
@VeeKeyBee, Sie könnten es in einen ActionFiltersUnterordner legen .
Darin Dimitrov
Ein mögliches Problem mit LayoutInjecterAttribute: Es wird vor der OnExceptionMethode des Controllers aufgerufen . Wenn der Controller während der Ausnahmebehandlung ein Ansichtsergebnis liefert, wird das Layout nicht festgelegt.
Jeff Sharp
Als Neuling bei MVC möchte ich mich dafür bedanken, dass Sie mir in dieser Antwort viel beigebracht haben. Ich verstehe jedoch nicht, was drinnen los ist OnActionExecuted. Können Sie bitte die Antwort für mich aktualisieren?
Imad
29

Eine weitere Methode besteht darin, das Layout in der Ansicht zu definieren:

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

Weitere Möglichkeiten finden Sie hier . Ich hoffe, dies hilft jemandem.

Shaijut
quelle
1
Dies funktioniert nicht - ohne die separate Datei _ViewStart.cshtml wird Ihre Ansicht weiterhin in der Methode @RenderBody () im anderen Layout gerendert.
Tillman32
Diese! Warum stellen alle diese äußerst komplexen Prozesse vor, wenn Sie dies nur tun müssen?
George Harnwell
15

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

Lesen Sie den vollständigen Artikel hier "So rendern Sie unterschiedliche Layouts in ASP.NET MVC"

Anil Sharma
quelle