在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();
    }
}

在ActionFilterAttribute.OnActionExecuted中设置布局有问题

错误表明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/目录中查找布局页面。在我看来,您是在动态地或在运行时选择母版页。