在某些情况下,我想强制执行一项规则,阻止我的团队中的开发人员在其剃刀视图中指定任何@Layout。在我们的一些观点中,布局将保持不变,因此我不希望我的团队成员必须正确设置它,甚至不关心设置它。
为此,我将创建一个动作过滤器并检测ViewResult.MasterName是否为空/空,然后抛出一个带有洞察力的错误消息的异常。我已尝试过ActionExecuting,ActionExecuted,ResultExecuted操作过滤器,但在所有情况下,即使在视图中指定了.MasterName属性,它也始终为空。是否无法在动作过滤器中检测到这一点,因为它稍后在管道中设置?如果在动作过滤器中不可用,是否有其他机制可以挂钩以检测并停止它?
答案 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]
属性有选择地应用适用的控制器/操作。
另一种方法是根据答案here在RouteConfig
然后override ViewResult
设置所需的布局:
无论哪种方式,希望它有所帮助。