剃刀查看引擎位置顺序不尊重?

时间:2015-07-08 18:38:16

标签: razor asp.net-mvc-5

我创建了一个RazorViewEngine子类来重新定义查找视图的位置。

我将PartialViewLocationFormats字符串数组设置为包含值

"~/Views/{1}/{0}.cshtml",
"~/Views/{1}/Partial/{0}.cshtml",
"~/Views/Shared/{0}.cshtml",

默认情况下,第一个和最后一个是默认的。第二个是我添加的那个,所以我可以在每个“Views / ControllerName”文件夹中有一个“Partial”子文件夹,用于仅由该控制器中的视图使用的部分视图,而不是将它们添加到“Views / Shared”文件夹

我遇到的问题是调用@Html.Partial("_TopNavbar")正在查找并呈现位于“Views / Shared”文件夹中的“_TopNavbar.cshtml”文件,而不是在我的DashBoards的“Views / Dashboard”下面的文件中/部分“文件夹。

换句话说,在两个不同的文件夹中有两个名为“_TopNavbar.cshtml”的不同文件,我希望它可以在一个位置找到,因为它更具体并且首先出现在数组中,但它不起作用那种方式由于某些原因我不明白。

Partial调用在“Views / Dashboard / Index.cshtml”中,我通过直接导航到“localhost:port / Dashboard / Index”来访问它,所以我确定控制器和操作是正确的。

1 个答案:

答案 0 :(得分:0)

我使用仅查找C#视图的子类RazorViewEngine取得了成功。我将其扩展为在特定的控制器文件夹中查找partials。

使用下面的CustomRazorViewEngine并请求/Home/Index在其视图中调用Html.Partial("_SomePartial")将按此顺序查找部分内容:

  1. /Views/Home/Partials/_SomePartial.cshtml
  2. /Views/Home/_SomePartial.cshtml
  3. /Views/Shared/_SomePartial.cshtml
  4. 这确实以正确的顺序返回部分视图。

    public class CustomRazorViewEngine : RazorViewEngine
    {
        public CustomRazorViewEngine()
        {
            ViewLocationFormats = new[]
            {
                "~/Views/{1}/{0}.cshtml",
                "~/Views/Shared/{0}.cshtml"
            };
    
            MasterLocationFormats = ViewLocationFormats;
    
            PartialViewLocationFormats = new[]
            {
                "~/Views/{1}/Partials/{0}.cshtml",
                "~/Views/{1}/{0}.cshtml",
                "~/Views/Shared/{0}.cshtml"
            };
        }
    }
    

    通过清除所有现有的并添加新的自定义视图引擎,确保您只使用子类视图引擎。

    <强>的Global.asax.cs

    ViewEngines.Engines.Clear();
    ViewEngines.Engines.Add(new CustomRazorViewEngine());