2013-07-22 48 views
1

在操作過濾器中將佈局設置爲null是否可行?例如我該如何將佈局設置爲空行動過濾器?

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

我想渲染

@Html.Action("someaction") 

一些動作它適用於現在。

但我想在2種模式下使用這個動作:就像孩子和不同情況下的主人一樣。我可以在視圖組佈局爲null這個

觀點:

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

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

像:

沒有部分

public ActionResult SomeAction() 
     { 
      return View(); 
     } 
行動

並在過濾器中將佈局設置爲null如果動作是孩子

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

      } 
     } 
    } 

它是可行的嗎?有任何想法嗎?

+2

這可能是重複的。 請參閱[接受此問題的答案](http://stackoverflow.com/questions/5161380/how-do-i-specify-different-layouts-in-the-asp-net-mvc-3-razor -viewstart-file) 希望這會有所幫助。 – Dmitry

回答

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; 
     } 
    } 
}