我尝试在自定义ActionFilterAttribute
中设置布局路径,我写了如下:
public class LayoutInjecterAttribute : ActionFilterAttribute
{
public override void OnActionExecuted(ActionExecutedContext filterContext)
{
base.OnActionExecuted(filterContext);
var result = filterContext.Result as ViewResult;
if (result != null)
{
result.MasterName = "~/Views/Layouts/Test.cshtml"
}
}
}
在这里,Test.cshtml是在不同项目中预编译的视图(在RazorGenerator
的帮助下)。
但它给了我错误:
视图'索引'或者找不到它的主人,或者没有视图引擎支持搜索到的位置。搜索了以下位置: 〜/浏览/首页/ Index.cshtml 〜/查看/共享/ Index.cshtml 〜/浏览/首页/的Index.aspx 〜/浏览/首页/ Index.ascx 〜/查看/共享/的Index.aspx 〜/查看/共享/ Index.ascx 〜/查看/布局/ Test.cshtml
和控制器实际上很简单:
[LayoutInjecter]
public class HomeController : Controller
{
public ActionResult Index()
{
return View();
}
}
答案 0 :(得分:7)
错误显示Source: local data frame [2 x 2]
A B
(chr) (chr)
1 NY ABc
2 NY ABC
工作正常。你说:
在这里,Test.cshtml是另一个项目中的预编译视图。
但是,不支持使用来自不同(来自Web项目外部)的剃刀视图。但是,有一个预编译剃刀视图的工具,然后你可以把它们放在任何调用RazorGenerator的DLL中。 编译器找不到指定的主布局文件并显示此错误。
有关详细信息,请参阅
编辑:PrecompiledMvcViewEngine如何知道要渲染哪个视图?
LayoutInjecter
仍然依赖于ASP.NET MVC Views文件夹约定,使用相对文件路径来定位视图。但是,这有点误导。 PrecompiledMvcViewEngine
不会查看物理文件;它查找Razor单文件生成器为其生成的每个视图添加的PrecompiledMvcViewEngine
,其中包括视图的相对文件路径。
修改2 :我相信您的问题指南可在GitHub中找到。
答案 1 :(得分:4)
有效。确保布局路径"~/Views/Layouts/Test.cshtml"
正确无误。
另外,请确保" Test.cshtml"是布局页面,而不是视图/局部视图。
答案 2 :(得分:3)
将result.MasterName = "~/Views/Layouts/Test.cshtml"
更改为result.MasterName ="~/Views/Shared/Test.cshtml"
。
按照惯例,框架在您的asp.net mvc解决方案的〜/ Views / Shared /目录中查找布局页面。
在我看来,您是动态地或在运行时选择母版页。