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

时间:2015-11-20 15:31:59

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

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

3 个答案:

答案 0 :(得分:7)

错误显示Source: local data frame [2 x 2] A B (chr) (chr) 1 NY ABc 2 NY ABC 工作正常。你说:

  

在这里,Test.cshtml是另一个项目中的预编译视图。

但是,不支持使用来自不同(来自Web项目外部)的剃刀视图。但是,有一个预编译剃刀视图的工具,然后你可以把它们放在任何调用RazorGenerator的DLL中。 编译器找不到指定的主布局文件并显示此错误。

有关详细信息,请参阅

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

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