如何设置Razor Layout文件只是指定名称?

时间:2012-02-15 01:34:49

标签: asp.net-mvc razor

首先是一个小环境。当您调用Html.RenderPartial发送视图名称时,将在RazorViewEngine.PartialViewLocationFormats指定的位置搜索该视图:

Html.RenderPartial("Post", item);

在Razor页面设置Layout属性时,您不能只说出名称,您需要指定路径。我怎样才能指定名称?

//Layout = "_Layout.cshtml";
Layout = "_Layout"; //Dont work

我需要这个,因为我重写了RazorViewEngine.MasterLocationFormats。

目前我在控制器指定Master:

return View("Index", "_Layout", model);

这样可行,但我更喜欢在View中执行此操作。

2 个答案:

答案 0 :(得分:1)

没有直接的方法, 但是我们可以写一个像“RenderPartial()”这样的HtmlExtension,它将在运行时提供完整的布局路径。

public static class HtmlExtensions
{
    public static string ReadLayoutPath<T>(this HtmlHelper<T> html,string layoutName)
    {
        string[] layoutLocationFormats = new string[] {
        "~/Views/{1}/{0}.cshtml",
            "~/Views/Shared/{0}.cshtml"
        };

        foreach (var item in layoutLocationFormats)
        {                
            var controllerName= html.ViewContext.RouteData.Values["Controller"].ToString();
            var resolveLayoutUrl = string.Format(item, layoutName, controllerName);
        string fullLayoutPath = HostingEnvironment.IsHosted ? HostingEnvironment.MapPath(resolveLayoutUrl) : System.IO.Path.GetFullPath(resolveLayoutUrl);
        if (File.Exists(fullLayoutPath))
            return resolveLayoutUrl;
        }
        throw new Exception("Page not found.");
    }
}

在视图中我们可以将其用作

@{
Layout = Html.ReadLayoutPath("_Layout");   
}

答案 1 :(得分:0)

我可以问你为什么这样做或者更具体地说你为什么要从控制器返回布局页面?你似乎错过了母版页的重点。

您不能只指定“名称”,您需要指定布局视图的路径,以便它可以依次应用于视图渲染。

Layout = "~/SomeCustomLocation/SomeFolder/_Layout.cshtml"