我有一个简单的控制器:
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”内容,但“布局”内容仍然存在。
<html>
...(Layout content)
<html>
...(Error.cshtml content)
</html>
</html>
有没有办法删除除错误内容以外的所有内容?
答案 0 :(得分:0)
我有一个解决方案:
当子操作抛出异常时,自定义ExceptionFilter处理它,并删除所有父操作的输出但布局。
所以,在_ViewStart.cshtml中:
@{
if(!this.ViewContext.IsChildAction) {
Layout = "~/Views/Shared/_Layout.cshtml";
}
}