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.
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?
quelle
Antworten:
Wenn Sie
return PartialView()
von Ihren Controllern (anstelle vonreturn View()
), dann_viewstart.cshtml
wird nicht ausgeführt.quelle
PartialViewResult
Klasse. Das brauchte ich.PartialViewResult
ActionResult
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 TypActionResult
oder eine davon abgeleitete Klasse ist, sollten die Dinge einfach funktionieren).ActionResult
. Funktioniert gut, wenn der Rückgabetyp istPartialViewResult
. Denken Sie, ich muss einen Connect-Fehler melden?