如何在mvc中处理渲染异常?

时间:2011-04-10 22:17:23

标签: asp.net-mvc error-handling

如何在mvc中捕获渲染异常? (我正在使用第一版)

我从值得案例场景开始 - 在.ascx文件中编译时错误,这是我发现的:

1)在调试模式下,visual studio表示 Controller.ExecuteCore(),InvokeAction 行中存在未处理的异常:

try {
      string actionName = RouteData.GetRequiredString("action");
      if (!ActionInvoker.InvokeAction(ControllerContext, actionName)) { // this line
          HandleUnknownAction(actionName);
     }
}
finally {
   TempData.Save(ControllerContext, TempDataProvider);
}

2)不调用Application.OnError

3)未调用Controller.OnError

4)当我在这里注入catch()时,它也没有被触发。

5)尝试..不会触发主页中的catch(通过它在stacktrace中存在!)

6)尝试..页面中的catch没有被触发(它也出现在stacktrace中!)

当我包装特定的RenderPartial方法时,我能够捕获异常 ,如下所示:

<% try
   { %>
    <%Html.RenderPartial("Search/" + Model.SearchCategory + "SearchList", Model); %>
    <%}
   catch (Exception ex)
   { %><% HttpContext.Current.Response.Redirect("/en/App/Error"); %><% } %>

我能做些什么呢?

  • 我无法返回RedirectAction 因为我们不在控制器中
  • 我尝试了HttpContext.Current.Response.Redirect 但它并没有真正起作用(我是 有文字的页面:对象已移动 。)

2 个答案:

答案 0 :(得分:0)

不确定这是否有帮助,但您是否尝试在项目中打开MvcBuildViews选项?据我所知(我自己还在学习MVC),视图是“按需”编译的,而不是在项目构建时。这可能会显示以前未检测到的错误。默认设置为关闭。

要打开它,请在VS中卸载项目,打开项目文件并在XML中将MvcBuildViews选项更改为“true”。然后重新加载项目。

答案 1 :(得分:0)

看一下使用filter属性来捕获这种行为。

例如:

public class CustomAttribute : ActionFilterAttribute
{
      public override void OnResultExecuted(ResultExecutedContext filterContext)
      {
           if(filterContext.Exception != null)
           {
                //YOU SHOULD BE ABLE TO SEE YOUR EXCEPTION HERE. 
                Trace.WriteLine(Exception.Message);
           }
       }
}

然后用[CustomAttribute]

装饰您的控制器类
[CustomAttribute]
public class SomeController : Controller
{
 //Controller stuff
}

您还可以使用其他一些替代功能,请查看。