私は単純なコントローラーを持っています:
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>
エラーのコンテンツ以外のすべてのコンテンツを削除する方法はありますか?