In Razor, when loading a partial view, it is possible to just specify the partial view name, and the Razor view engine will search the RazorViewEngine.PartialViewLocationFormats:
@Html.RenderPartial("_PartialView", Model);
will actually search the locations specified in PartialViewLocationFormats in the view engine, such as for example
~/Views/Home/_PartialView.cshtml
~/Views/Shared/_PartialView.cshtml
However, when specifying the Layout, I seem to be forced to specify a specific path to the layout:
@Layout = "~/Views/Shared/MyLayout.cshtml";
What I would like to do would be to specify the layout just by name, and have the the actual layout be found by searching a list of common locations:
@Layout = "MyLayout";
…but I can’t find any facilities to do so. Since I could not find any documentation regarding this, I tried playing with setting RazorViewEngine.MasterLocationFormats, but this property is not used when locating layouts.
Does anybody know how to do this?
Recently I was struggling on a similar issue where, in a themed application that uses a custom ViewEngine to search theme’s location first for views, I was trying to override some master files. One way to force the location of the layout to go through the ViewEngine’s FindView is to specify the name of the master view in a controller action when returning:
However, if “myViewMaster” also has a layout (nested layouts), this method doesn’t work for the nested layout. My best solution so far is to call the view engine directly in the view:
This works but could certainly be encapsulated in a extension method to avoid repetition and abstract the code.
Hope it helps!