子动作异常处理程序

时间:2012-09-06 03:49:47

标签: asp.net-mvc-3 exception filter child-actions

我有一个简单的控制器:

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删除了“Index”,“Child1”和“Child2”内容,但“布局”内容仍然存在。

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

有没有办法删除除错误内容以外的所有内容?

1 个答案:

答案 0 :(得分:0)

我有一个解决方案:

当子操作抛出异常时,自定义ExceptionFilter处理它,并删除所有父操作的输出但布局。

所以,在_ViewStart.cshtml中:

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