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

インデックス.cshtml

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

Child1.cshtml

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

Child2.cshtml

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

Child3 は例外 throw new Exception("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>

エラーのコンテンツ以外のすべてのコンテンツを削除する方法はありますか?

4

1 に答える 1

0

私には解決策があります:

子アクションが例外をスローすると、カスタムExceptionFilterがそれを処理し、レイアウト以外のすべての親アクションの出力を削除します。

したがって、_ViewStart.cshtmlでは:

@{
if(!this.ViewContext.IsChildAction) {
    Layout = "~/Views/Shared/_Layout.cshtml";
}
}
于 2012-09-06T05:09:42.753 に答える