Как установить файл Razor Layout, просто указав имя? - PullRequest
0 голосов
/ 15 февраля 2012

Сначала маленький контекст. Когда вы вызываете Html.RenderPartial, вы отправляете имя представления, в этом представлении будет выполняться поиск в местоположениях, указанных в RazorViewEngine.PartialViewLocationFormats:

Html.RenderPartial("Post", item);

Когда вы устанавливаете свойство Layout на странице Razor, вы не можете просто произнести имя, вам нужно указать путь. Как я могу просто указать имя?

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

Мне это нужно, потому что я переопределил RazorViewEngine.MasterLocationFormats.

В настоящее время я указываю Мастер на контроллере:

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

Это работает, но я предпочитаю делать это в View.

Ответы [ 2 ]

1 голос
/ 15 февраля 2012

Нет прямого способа сделать это, Но мы можем написать HtmlExtension, например, «RenderPartial ()», который даст полный путь к макету во время выполнения.

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");   
}
0 голосов
/ 15 февраля 2012

Могу ли я спросить, почему вы делаете это или более конкретно, почему вы возвращаете страницу макета из контроллера?Кажется, вы упускаете суть мастер-страниц.

Вы не можете указать только «имя», вам нужно указать путь к макету, чтобы он, в свою очередь, мог быть применен к представлению при рендеринге.

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