2014-02-19 9 views
5

Ich spiele mit der Rasiermesser-Engine und da ist etwas, das ich nicht ganz verstehe.Warum ist in der viewstart-Datei ein vollständiger Pfad zum Layout erforderlich, wenn Standorte in der Ansichts-Engine angegeben sind?

Die _ViewStart Datei legt ein Layout mit dem vollständigen Dateipfad wie folgt aus:

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

Wie ich es verstehe, den vollständigen Pfad und Erweiterung enthalten sein müssen. Sie nicht nur dies tun:

@{ 
    Layout = "_MasterLayout"; 
} 

jedoch der Ansicht Motor Standorte gibt für die Master-Ansichten zu suchen:

 MasterLocationFormats = new string[] { 
      "~/Views/{1}/{0}.cshtml", 
      "~/Views/Shared/{0}.cshtml" 
     }; 

Wie Sie den vollständigen Pfad zum Master-Layout-Datei kommen ist erforderlich in der _ViewStart-Datei?

Und wenn der vollständige Pfad angegeben ist, was ist dann der mögliche Speicherort in MasterLocationFormats[]?

aktualisieren

Nun, ich habe immer noch keine befriedigende Antwort auf diese Frage gefunden.

Von experimentieren, dass der MasterLocationFormats entweder ingored oder überschrieben erscheinen würde, wenn ein Layout im viewstart Datei angeben.

Ich könnte den MasterLayout.cshtml-Speicherort vollständig aus dem MasterLocationFormats entfernen und es machte keinen Unterschied für die Anzeige von Webseiten.

Meine persönliche Frage war aufgrund der Verwendung der MvcMailer package, die Sie eine Rasiereransicht als Vorlage zum Senden von HTML-E-Mail verwenden können angeben. Dies verwendet die MasterLocationFormats.

So bin ich immer noch etwas perplex, aber hoffe, dass dies von einige sein wird, die zu jedem kommen, der hier kommt. Auch this post may also be of help.

Antwort

3

In der CreateView-Implementierung von RazorViewEngine wird eine neue RazorView erstellt.

Und wenn RazorView RenderView-Methode von BuildManagerCompiledView überschreibt, die den tatsächlichen Aufruf der Render-Methode von IView macht.

Und am Ende dieser Implementierung wird diese Zeile aufgerufen.

webViewPage.ExecutePageHierarchy(new WebPageContext(context: viewContext.HttpContext, page: null, model: null), writer, startPage); 

Und das führt uns zu ExecutePageHierarchy Methode der WebViewPage der in System.Web.Mvc.dll ist.

public override void ExecutePageHierarchy() 
{ 
    TextWriter writer = this.ViewContext.Writer; 
    this.ViewContext.Writer = this.Output; 
    base.ExecutePageHierarchy(); 
    if (!string.IsNullOrEmpty(this.OverridenLayoutPath)) 
     this.Layout = this.OverridenLayoutPath; 
    this.ViewContext.Writer = writer; 
} 

Wie oben zu sehen ist, wird der Layoutpfad überschrieben.

Weitere Informationen finden Sie in den Klassen RazorView und WebViewPage.

+0

Ich habe nach all dieser Zeit nie eine Antwort erwartet. Schön! –