0

我从主 MVC 项目(我们称之为 Main)在一个单独的项目(我们称之为 Shared)中创建了一个布局视图,并使用 RazorGenerator 编译了该视图。当我在 Main 的任何 MVC 页面中使用布局时,它工作正常:

@{
   Layout = "~/Views/Shared/_Layout.cshtml";
}

但是,当我以这种方式使用 ActionFilter 设置布局时:

public class LayoutAttribute : ActionFilterAttribute
{
    public override void OnActionExecuted(ActionExecutedContext filterContext)
    {
        base.OnActionExecuted(filterContext);
        var viewResult = filterContext.Result as ViewResult;
        viewResult.MasterName = "~/Views/Shared/_Layout.cshtml";
    }
}

只需在 Main 的控制器中使用它,如下所示:

[Layout]
public class HomeController : Controller
{
    // GET: Home
    public ActionResult Index()
    {
        return View();
    }
}

我收到此错误:

未找到视图“索引”或其主视图,或者没有视图引擎支持搜索的位置。搜索了以下位置:~/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/Shared/_Layout.cshtml

我真的很想使用 Shared 项目中内置的 ActionFilter,这样我就可以在 Main 项目(或任何其他项目)中的任何控制器中使用它。

任何想法为什么我会收到此错误?

4

1 回答 1

0

从此更改您的操作:

public class LayoutAttribute : ActionFilterAttribute

    {
        public override void OnActionExecuted(ActionExecutedContext filterContext)
        {
            base.OnActionExecuted(filterContext);
            var viewResult = filterContext.Result as ViewResult;
            viewResult.MasterName = "~/Views/Shared/_Layout.cshtml";
        }
    }

到下面这个:

public class LayoutAttribute : ActionFilterAttribute
{
    public override void OnActionExecuted(ActionExecutedContext filterContext)
    {
        base.OnActionExecuted(filterContext);
        var viewResult = filterContext.Result as ViewResult;
        if (viewResult != null)
        {
             viewResult.MasterName = "~/Views/Shared/_Layout.cshtml";
         }
    }
}

希望有帮助。

于 2016-04-25T17:45:20.463 回答