Richtige Verwendung von _viewstart.cshtml und partiellen Razor-Ansichten?

156

Ich verwende _viewstart.cshtml , um meinen Ansichten automatisch dasselbe Rasiermesser-Layout zuzuweisen .

Es ist eine absolut einfache Datei im Stammverzeichnis meines Views-Ordners, die folgendermaßen aussieht:

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

Dies ist trockener als das Hinzufügen der @ Layout-Direktive zu jeder einzelnen Ansicht.

Dies stellt jedoch ein Problem für Razor- Teilansichten dar , da sie den Inhalt von _viewstart.cshtml ausführen und sich daher fälschlicherweise ein Layout zuweisen, wodurch sie nicht mehr teilweise sind.

Hier ist ein hypothetisches Projekt, das die Datei _viewstart.cshtml, die freigegebene Datei _layout.shtml und eine Teilansicht ("AnonBar.cshtml") zeigt.

Beispiel Projektstruktur

Derzeit kann ich dies umgehen, indem ich jeder Teilansicht die folgende Zeile hinzufüge:

@{
    Layout = "";
}

Dies scheint der falsche Weg zu sein, um eine Ansicht als Teil in Razor zu bezeichnen. (Beachten Sie, dass im Gegensatz zur Web Forms View Engine die Dateierweiterung für Teilansichten identisch ist.)

Andere Optionen habe ich in Betracht gezogen, aber das ist noch schlimmer:

  • Platzieren aller Teilansichten in einem gemeinsamen Ordner, damit sie eine gemeinsame _viewstart.cshtml gemeinsam nutzen können. Dies verstößt gegen die Konvention, dass sich Ansichten im selben Ordner wie ihr Controller befinden.
  • Keine Teilansichten verwenden.

Wird dies noch vom Razor View Engine-Team ausgearbeitet, oder fehlt mir ein grundlegendes Konzept?

Portman
quelle
3
Entschuldigung für offtopic, aber was sind diese Symbole neben den Dateinamen? :) Eine Art Quellcodeverwaltung, oder?
Alex
6
@ Jitbit: VisualSVN
Erict

Antworten:

237

Wenn Sie return PartialView()von Ihren Controllern (anstelle von return View()), dann _viewstart.cshtmlwird nicht ausgeführt.

Marcind
quelle
6
Aha, wusste nichts über die PartialViewResultKlasse. Das brauchte ich.
Portman
6
Als Folge habe ich festgestellt, dass ich anstelle des üblichen auch explizit den Rückgabetyp der Aktionsmethode festlegen muss . PartialViewResultActionResult
Portman
2
@Portman sehen Sie Probleme, wenn der Rückgabetyp der Aktionsmethode nicht lautet ActionResult? Ich bin überrascht, dass dies ein Problem ist, da sich die MVC-Laufzeit in diesem Fall nicht anders verhalten sollte (dh solange der von der Aktionsmethode zurückgegebene Typ ActionResultoder eine davon abgeleitete Klasse ist, sollten die Dinge einfach funktionieren).
Marcind
@marcind Ich erhalte einen Stapelüberlauf auf w3wp.exe, wenn ich den Rückgabetyp auf setze ActionResult. Funktioniert gut, wenn der Rückgabetyp ist PartialViewResult. Denken Sie, ich muss einen Connect-Fehler melden?
Portman
Klingt für mich nach einem - rufen Sie zurück, wenn Sie einen Connect-Fehler einreichen, und stimmen Sie ab.
Dav