2014-02-19 42 views
5

我正在玩剃须刀视图引擎,有些东西我不太明白。为什么在视图引擎中指定位置时,viewstart文件中需要布局的完整路径?

的_ViewStart文件规定,像这样完整的文件路径布局:

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

据我了解,完整的路径和扩展名必须包括在内。您不能只是这样做:

@{ 
    Layout = "_MasterLayout"; 
} 

但是视图引擎指定位置搜索的主观点:

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

怎么来的完整路径,主布局文件_ViewStart文件中需要?

如果指定了完整路径,那么在MasterLocationFormats[]中指定可能的位置有什么意义?

更新

嗯,我还没有找到一个满意的答案。

从尝试它会出现在MasterLocationFormats要么ingored指定在viewstart文件中的布局时,覆盖

我可以从MasterLocationFormats中完全删除MasterLayout.cshtml位置,它对网页的显示没有任何影响。

我的个人问题是由于使用MvcMailer package,它允许您指定一个剃须刀视图用作发送html电子邮件的模板。这样做使用MasterLocationFormats。

所以我仍然有点困惑,但希望这将是一些使用任何人来到这里。另外,this post may also be of help

回答

3

在RazorViewEngine的CreateView实现中,创建了一个新的RazorView。

而RazorView覆盖了BuildManagerCompiledView的RenderView方法,它使得实际调用了IView的Render方法。

并且在该实现结束时调用该行。

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

而这导致我们到System.Web.Mvc.dll中的WebViewPage的ExecutePageHierarchy方法。

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

正如您在上面看到布局路径被覆盖。

欲了解更多信息,你可以检查RazorView和WebViewPage类。

+0

我从来没有想过在这段时间后的答案。好一个! –

相关问题