是否可以为MVC Razor Layout指定可搜索的位置格式?

Pet*_*man 10 asp.net-mvc

在Razor中,加载局部视图时,可以只指定部分视图名称,Razor视图引擎将搜索RazorViewEngine.PartialViewLocationFormats:

@Html.RenderPartial("_PartialView", Model);
Run Code Online (Sandbox Code Playgroud)

实际上将搜索视图引擎中PartialViewLocationFormats中指定的位置,例如

~/Views/Home/_PartialView.cshtml
~/Views/Shared/_PartialView.cshtml
Run Code Online (Sandbox Code Playgroud)

但是,在指定布局时,我似乎被迫指定布局的特定路径:

@Layout = "~/Views/Shared/MyLayout.cshtml";
Run Code Online (Sandbox Code Playgroud)

我想做的是仅按名称指定布局,并通过搜索公共位置列表找到实际布局:

@Layout = "MyLayout";
Run Code Online (Sandbox Code Playgroud)

......但我找不到任何设施.由于我找不到任何关于此的文档,我尝试使用设置RazorViewEngine.MasterLocationFormats,但在查找布局时不使用此属性.

有人知道怎么做这个吗?

sow*_*e15 10

最近我在一个类似的问题上苦苦挣扎,在一个主题应用程序中,使用自定义ViewEngine首先搜索主题的位置以查看视图,我试图覆盖一些主文件.强制布局位置通过ViewEngine的FindView的一种方法是在返回时指定控制器操作中主视图的名称:

return View("myView", "myViewMaster");
Run Code Online (Sandbox Code Playgroud)

但是,如果"myViewMaster"也具有布局(嵌套布局),则此方法不适用于嵌套布局.到目前为止,我最好的解决方案是直接在视图中调用视图引擎:

@{
    Layout = (ViewEngines.Engines.FindView(this.ViewContext.Controller.ControllerContext, "myViewMaster", "").View as RazorView).ViewPath;
}
Run Code Online (Sandbox Code Playgroud)

这可以工作,但肯定可以封装在扩展方法中,以避免重复和抽象代码.

希望能帮助到你!

  • 创建您自己的WebViewPage <T> - 派生类,并使您的所有视图都从中继承.在其中,覆盖布局,并在get运行上面的代码.http://odetocode.com/Blogs/scott/archive/2011/01/09/razor-tip-2-inheritance-amp-configuration.aspx (2认同)