现在有如下一个简单的 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个了, 不能高分,
试试看将_ViewStart.cshtml定义成:
@{
if(!this.ViewContext.IsChildAction)
{
Layout = "~/Views/Shared/_Layout.cshtml";
}
}
谢谢. 原来这么简单, 我想多了.
在Error.cshtml里写就可以
@if(ViewContext.IsChildAction)
{
Layout = null;
}
谢谢. 原来这么简单, 我想多了.