【问题标题】:How to set Razor Layout file just specifying the name?如何设置仅指定名称的 Razor 布局文件?
【发布时间】:2012-02-15 13:44:25
【问题描述】:

首先介绍一下上下文。当您调用 Html.RenderPartial 您发送视图名称时,将在 RazorViewEngine.PartialViewLocationFormats 指定的位置搜索该视图:

Html.RenderPartial("Post", item);

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

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

我需要这个,因为我覆盖了 RazorViewEngine.MasterLocationFormats。

目前我在控制器指定主控:

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

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

【问题讨论】:

标签: asp.net-mvc razor


【解决方案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");   
}

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

    • 我没有从控制器返回,这是我找到的解决方法。如果我不能只指定名称,RazorViewEngine.MasterLocationFormats 的用途是什么?
    • 这样做是有正当理由的。例如,您的主网站有一个插件项目,您希望允许使用完全不同的 wwwroot 等
    猜你喜欢
    • 2011-10-24
    • 2011-07-06
    • 1970-01-01
    • 1970-01-01
    • 2014-12-11
    • 1970-01-01
    • 1970-01-01
    • 2014-05-22
    • 2013-06-10
    相关资源
    最近更新 更多