我有控制器和视图的单独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中的第一个项目。
答案 0 :(得分:0)
您在视图中明确设置了布局
Layout = "~/Views/Shared/_Layout.cshtml";
〜由虚拟路径提供程序翻译成您的Web应用程序的根目录 - 没有引擎发挥作用。
可以使用如下指定正确的绝对路径:
Layout = "~/bin/Views/Shared/_Layout.cshtml";
或者指定从视图到布局视图的相对路径,如:
Layout = "../Shared/_Layout.cshtml";