【问题标题】:Setting Layout in ActionFilterAttribute.OnActionExecuted is problematic在 ActionFilterAttribute.OnActionExecuted 中设置 Layout 有问题
【发布时间】:2016-02-23 03:50:33
【问题描述】:

我正在尝试在自定义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();
    }
}

【问题讨论】:

  • 您是否创建了控制器布局?
  • 不,没有任何名为 'Layouts' 的控制器
  • 请添加一个名为 layouts 的新控制器,然后创建一个名为 Test 的新操作结果并返回视图,这应该可以工作
  • 所有项目中都有 Layouts 文件夹吗?
  • 没有。只有库项目具有该文件夹。我试图向 mvc 项目添加一个空文件夹,但没有任何改变:(

标签: c# asp.net asp.net-mvc asp.net-mvc-4 razorgenerator


【解决方案1】:

result.MasterName = "~/Views/Layouts/Test.cshtml" 更改为result.MasterName ="~/Views/Shared/Test.cshtml"。 按照惯例,框架会在您的 asp.net mvc 解决方案中的 ~/Views/Shared/ 目录中查找布局页面。 在我看来,您是动态地或在运行时选择母版页。

【讨论】:

    【解决方案2】:

    错误显示LayoutInjecter 工作正常。你说:

    这里的 Test.cshtml 是不同项目中的预编译视图。

    但是,开箱即用不支持使用来自不同(来自 Web 项目之外)的 razor 视图。但是,有一个工具可以预编译剃刀视图,然后您可以将它们放入任何名为 RazorGenerator 的 DLL 中。 编译器找不到指定的主布局文件并显示此错误。

    更多信息请看

    编辑:PrecompiledMvc​​ViewEngine 如何知道要渲染哪个视图?

    PrecompiledMvcViewEngine 仍然依赖于 ASP.NET MVC 视图文件夹约定,使用相对文件路径来定位视图。但是,这有点误导。 PrecompiledMvcViewEngine 不查看物理文件;它会查找 Razor 单一文件生成器添加到它生成的每个视图中的 System.Web.WebPages.PageVirtualPathAttribute,其中包括视图的相对文件路径。

    编辑 2:我相信您的问题的指导可以在 GitHub 中找到。

    【讨论】:

    • 我实际上已经使用 RazorGenerator。
    • @Kaan 我对我的答案进行了编辑。您能否检查生成的文件是否出现在您项目的obj 目录中,并且视图是否已编译到您的项目程序集中?
    • 我不知道为什么,但是如果两个项目都在同一个解决方案中,它就可以工作。但是如果他们在单独的解决方案中,它就行不通了!
    • @Kaan 请看我的Edit 2
    • 我的所有视图都标记为“内容”。我认为这对我没有帮助。
    【解决方案3】:

    它有效。确保布局路径"~/Views/Layouts/Test.cshtml" 正确。

    另外,请确保“Test.cshtml”是布局页面,而不是视图/部分视图。

    【讨论】:

    • 路径正确,Test.chstml 只是一个布局页面。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-17
    • 1970-01-01
    相关资源
    最近更新 更多