Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/asp.net-mvc-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc 3 子操作异常处理程序_Asp.net Mvc 3_Exception_Filter_Child Actions - Fatal编程技术网

Asp.net mvc 3 子操作异常处理程序

Asp.net mvc 3 子操作异常处理程序,asp.net-mvc-3,exception,filter,child-actions,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 Action

我有一个简单的控制器:

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”内容,但仍输出“Layout”内容

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

…(版面内容)
…(Error.cshtml内容)
有没有办法删除除错误内容以外的所有内容?

我有一个解决方案:

当子操作引发异常时,CustomExceptionFilter将处理该异常,并删除除布局之外的所有父操作的输出

因此,在_ViewStart.cshtml中:

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

我没听懂。让error.cshtml处理错误有什么不对?