在ActionFilterAttribute.OnActionExecuted中设置布局有问题
本文关键字:布局 有问题 设置 ActionFilterAttribute OnActionExecuted | 更新日期: 2023-09-27 18:22:50
我正试图在自定义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
的帮助下)。
但它给了我一个错误:
未找到视图"索引"或其主视图,或者没有视图引擎支持搜索的位置。搜索了以下位置:~/Views/Home/Index.cshtml~/Views/Shared/Index.cshtml~/Views/Home/Index.aspx~/Views/Home/Index.ascx~/Views/Shared/Index.aspx~/Views/Shared/Index.ascx~/Views/Layouts/Test.cshtml
控制器其实很简单:
[LayoutInjecter]
public class HomeController : Controller
{
public ActionResult Index()
{
return View();
}
}
错误表明LayoutInjecter
工作正常。你说:
在这里,Test.cshtml是另一个项目中的预编译视图。
但是,不支持开箱即用地使用来自不同(来自web项目外部)的剃刀视图。然而,有一个工具可以预编译razor视图,然后您可以将它们放在任何名为RazorGenerator的DLL中。编译器找不到指定的主布局文件,并显示此错误
有关更多信息,请查看
- 使用RazorGenerator MVC和MVC 4中的预编译视图引擎
- 将你的asp.net mvc Razor视图编译到一个单独的dll中
编辑:PrecompiledMvcViewEngine是如何知道要渲染哪个视图的
PrecompiledMvcViewEngine
仍然依赖ASP.NET MVC Views文件夹约定,使用相对文件路径来定位视图。然而,这有点误导。PrecompiledMvcViewEngine
不查看物理文件;它查找Razor Single File Generator添加到它生成的包括视图的相对文件路径的每个视图中的CCD_ 6。
编辑2:我相信你的问题指南可以在GitHub中找到。
它是有效的。确保布局路径"~/Views/Layouts/Test.cshtml"
正确无误。
此外,请确保"Test.cs.html"是一个布局页面,而不是视图/局部视图。
将result.MasterName = "~/Views/Layouts/Test.cshtml"
更改为result.MasterName ="~/Views/Shared/Test.cshtml"
。按照惯例,框架在asp.net mvc解决方案中的~/Views/Shared/目录中查找布局页面。在我看来,您是在动态地或在运行时选择母版页。