2012-09-06 24 views
1

我有一個簡單的控制器:兒童行動異常處理

public class RedirectController : Controller { 
    public ActionResult Index() { 
     return View(); 
    } 

    [ChildActionOnly] 
    public ActionResult Child1() { 
     return View(); 
    } 


    [ChildActionOnly] 
    public ActionResult Child2() { 
     return View(); 
    } 

[ChildActionOnly] 
    public ActionResult Child3() { 
     throw new Exception("abc");   
    } 
} 

Index.cshtml

... 
@Html.Action("Child1") 
... 

Child1.cshtml

... 
@Html.Action("Child2") 
... 

Child2.cshtml

... 
@Html.Action("Child3") 
... 

Child3會拋出異常 拋出新異常(「abc」) 出於某種原因,我爲error.cshtml設置了佈局,最後導出的內容包含Index.cshtml,Child1.cshtml,Child2.cshtml和Error.cshtml

所以我定義的自定義ExceptionFilter來處理這個異常

public class MyExceptionAttribute : ActionFilterAttribute , IExceptionFilter { 

    public void OnException(ExceptionContext filterContext) { 
    ... 
     ... 
     if(filterContext.ParentActionViewContext != null) { 
    //remove parent actions' exported contents 
      ViewContext par = filterContext.ParentActionViewContext; 
      while(null != par){ 
       var wtr = (StringWriter)par.Writer; 
       wtr.GetStringBuilder().Clear(); 
       par = par.ParentActionViewContext; 
      } 

     } 
... 
... 

做過濾,最終輸出HTML刪除「索引」,「Child1」和「CHILD2」的內容,但「佈局」的內容仍然outputed後。

<html> 
    ...(Layout content) 
    <html> 
    ...(Error.cshtml content) 
    </html> 
</html> 

是否有任何方法可以刪除除錯誤內容之外的所有內容?

+0

我不繼。讓你的error.cshtml處理錯誤有什麼問題? –

回答

0

我有一個解決辦法:

當孩子動作拋出一個異常,自定義ExceptionFilter處理它,並刪除所有家長行動輸出,但佈局。

所以,在_ViewStart.cshtml:

@{ 
if(!this.ViewContext.IsChildAction) { 
    Layout = "~/Views/Shared/_Layout.cshtml"; 
} 
}