检测是否在视图中指定了布局?

时间:2017-06-02 17:44:52

标签: asp.net-mvc razor

在某些情况下,我想强制执行一项规则,阻止我的团队中的开发人员在其剃刀视图中指定任何@Layout。在我们的一些观点中,布局将保持不变,因此我不希望我的团队成员必须正确设置它,甚至不关心设置它。

为此,我将创建一个动作过滤器并检测ViewResult.MasterName是否为空/空,然后抛出一个带有洞察力的错误消息的异常。我已尝试过ActionExecuting,ActionExecuted,ResultExecuted操作过滤器,但在所有情况下,即使在视图中指定了.MasterName属性,它也始终为空。是否无法在动作过滤器中检测到这一点,因为它稍后在管道中设置?如果在动作过滤器中不可用,是否有其他机制可以挂钩以检测并停止它?

1 个答案:

答案 0 :(得分:0)

MasterName属性在ViewResult类中设置,因此在例如{1}}中设置此属性ActionFilter会覆盖Razor视图中@Layout指定的内容:

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

我认为没有办法直接阻止在剃刀视图中设置@Layout,但即使有人在视图中设置了@Layout,它仍然会被覆盖使用以上内容。您仍然可以通过[LayoutFilter]属性有选择地应用适用的控制器/操作。

另一种方法是根据答案hereRouteConfig然后override ViewResult设置所需的布局:

无论哪种方式,希望它有所帮助。