首页 新闻 搜索 专区 学院

Child Action 的错误处理

0
悬赏园豆:5 [已解决问题] 解决于 2012-09-06 12:58

现在有如下一个简单的 Controller

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 View 里调用 @Html.Action("Child1")
在 Child1 View 里调用 @Html.Action("Child2")
在 Child2 View 里调用 @Html.Action("Child3")

Action Child3 会抛出一个异常.这个异常会在自定义的 IExceptionFilter 里处理掉. 并在 Error.cshtml 里展示.
为了统一页面样式, 我给 Error.cshtml 指定了 Layout.这就出现了一个问题:

Index, Child1, Child2 的内容都会显示在 最终的页面上, 在 Child3 的位置会显示 Error.cshtml 的完整内容.

我想在这种情况下,只显示 Error.cshtml 的容,把 Index, Child1, Child2 的内容全部给移除, 于是我这样写:
public class MyExceptionAttribute : ActionFilterAttribute , IExceptionFilter {

public void OnException(ExceptionContext filterContext) {
...
...
if(filterContext.ParentActionViewContext != null) {
//循环移除父 Action 的输出
ViewContext par = filterContext.ParentActionViewContext;
while(null != par){
var wtr = (StringWriter)par.Writer;
wtr.GetStringBuilder().Clear();
par = par.ParentActionViewContext;
}

}
...
...
这样可以将 Index, Child1, Child2 的输出全去掉,但是 _Layout 的内容却没有移除, 最终输出的 Html 如下:
<html>
...(Layout 的输出)
<html>
...(Error.cshtml 的输出)
</html>
</html>

请问, 有没有什么好的方法在自定义的 ExceptionFilter 里将父 Action 及 Layout 的内容给移除?

谢谢.

我的园豆只有9个了, 不能高分,

xling的主页 xling | 初学一级 | 园豆:6
提问于:2012-09-06 11:26
< >
分享
最佳答案
1

试试看将_ViewStart.cshtml定义成:

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

收获园豆:5
Artech | 菜鸟二级 |园豆:287 | 2012-09-06 12:03

谢谢. 原来这么简单, 我想多了.

xling | 园豆:6 (初学一级) | 2012-09-06 12:58
其他回答(1)
0

在Error.cshtml里写就可以

@if(ViewContext.IsChildAction)
{
Layout = null;
}

zhangweiwen | 园豆:904 (小虾三级) | 2012-09-06 12:04

谢谢. 原来这么简单, 我想多了.

支持(0) 反对(0) xling | 园豆:6 (初学一级) | 2012-09-06 12:58
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册