如何在动作过滤器中将布局设置为null?

时间:2013-07-22 18:07:43

标签: asp.net-mvc asp.net-mvc-3 asp.net-mvc-4

在动作过滤器中将布局设置为null是否可行?例如

public ActionResult SomeAction()
    {
        return PartialView();
    }

我想用

渲染一些动作
@Html.Action("someaction")

现在有效。

但是我想在两种模式下使用这个动作:像孩子一样,不同情况下的主人。我可以在此视图中将Layout设置为null

视图:

@{
   if(condtition)
   {
        Layout = null;
   }
}

但我想找到更优雅的方式:)

像:

没有部分

的行动
public ActionResult SomeAction()
        {
            return View();
        }

并在过滤器中将布局设置为null,如果action为child

 public class LayoutFilter : ActionFilterAttribute
    {
        public override void OnActionExecuting(ActionExecutingContext filterContext)
        {
           if(filterContext.IsChildAction)
           {
               //set the layout to NULL here!

           }
        }
    }

有可能吗?有什么想法吗?

1 个答案:

答案 0 :(得分:3)

在您的示例中,您已覆盖OnActionExecuting事件,但这种情况发生得太早。这些动作甚至还没有执行,也没有返回ActionResult,你已经在尝试设置它的布局了。

等待它完成,通过覆盖OnActionExecuted事件,从filterContext检索Result属性,如果它是ViewResult,则将其MasterName属性设置为null :

public class LayoutFilter : ActionFilterAttribute
{
    public override void OnActionExecuted(ActionExecutedContext filterContext)
    {
        var result = filterContext.Result as ViewResult;
        if (result != null)
        {
            result.MasterName = null;
        }
    }
}