自定义RazorViewEngine无法正常工作

时间:2014-07-23 20:05:55

标签: asp.net-mvc razorengine

我有控制器和视图的单独dll(通常的文件夹结构)。这是我的自定义视图引擎:

public class SettingsViewEngine : RazorViewEngine
{
    public SettingsViewEngine()
    {
        //if I commit this nothing changes
        MasterLocationFormats = new[]
        {
            "~/bin/Views/{1}/{0}.cshtml",
            "~/bin/Views/Shared/{0}.cshtml"
        };

        ViewLocationFormats = new[]
        {
            "~/bin/Views/{1}/{0}.cshtml", //if I commit this line it starts look at 
                                          //at shared folder.Looks like only first
                                          //line of ViewLocationFormats  array used always.
            "~/bin/Views/Shared/{0}.cshtml"
        };
    }
}

- 视图被复制到bin文件夹。没有Layout属性,一切正常。但是当设置它时我得到错误它无法在

找到
"~/bin/Views/MyLayout.cshtml"

有什么想法吗?感谢。

更新

我已经用下一个ovveride更新了我的搜索引擎:

    protected override IView CreateView(ControllerContext controllerContext, string viewPath, string masterPath)
    {
        // "~/bin/Views/Shared/_SettingsManagerLayout.cshtml" works (able find)
        return base.CreateView(controllerContext, viewPath, masterPath);
    }

虽然调试我能够看到master是空字符串。如果我直接传递路径我从布局中得到了奇怪的错误 -

  

System.Web.WebPages.Html.HtmlHelper'不包含' ActionLink'的定义和最好的扩展方法重载

     

System.Web.Mvc.Html.LinkExtensions.ActionLink(System.Web.Mvc.HtmlHelper,string,string,object)'有一些无效的论点

以下是我的观点:

@inherits System.Web.Mvc.WebViewPage
@{
    Layout="_SettingsManagerLayout.cshtml";
}

...

更新

一些想法:我有错误 -

  

布局页面" _SettingsManagerLayout.cshtml"无法在以下路径找到:"〜/ bin / Views / Settings / _SettingsManagerLayout.cshtml"

但我希望视图引擎会检查MasterLocationFormats(ViewLocationFormats)中指定的几个路径,这是针对具有相同视图引擎的根项目的控制器视图完成的。

结束诊断

自定义视图引擎忽略MasterLocationFormats并仅使用ViewLocationFormats中的第一个项目。

1 个答案:

答案 0 :(得分:0)

您在视图中明确设置了布局

Layout = "~/Views/Shared/_Layout.cshtml";

〜由虚拟路径提供程序翻译成您的Web应用程序的根目录 - 没有引擎发挥作用。

可以使用如下指定正确的绝对路径:

Layout = "~/bin/Views/Shared/_Layout.cshtml";

或者指定从视图到布局视图的相对路径,如:

Layout = "../Shared/_Layout.cshtml";