2011-05-13 115 views
33

是否有内置的或正确的方法来处理asp.net mvc 3中的错误?在asp.net mvc 3中的错误处理

这就是我想做的事:

  1. 如果应用程序崩溃或抛出一个错误,它关系到一个特定的错误页面。
  2. 我可以从控制器操作中抛出我自己的错误。 (并进入错误页面)。

我发现下面的方法:

  1. 我看到有一个很长的路做 here。 (对于v1和v2,但 也适用于v3)。
  2. 使用错误句柄属性here

我该如何处理正确的方法?

如果解决方案与上面列表中的类似或类似#1,我正在使用ninject,并且我没有创建基类。我仍然如何做到这一点?

回答

13

处理
全球所有的错误,你需要做的是改变的customErrors模式=“开”在web.config中翻阅Error.cshtml所在的共享文件夹中
会显示错误。

确保Error.cshtml布局不为空
[它应该是这样的:@ {Layout =“〜/ Views/Shared/_Layout.cshtml”; }
或者删除布局=零码块]
的样品标记为Error.cshtml: -

@{ Layout = "~/Views/Shared/_Layout.cshtml"; } 

@model System.Web.Mvc.HandleErrorInfo 

<!DOCTYPE html> 
<html> 
<head> 
    <title>Error</title> 
</head> 
<body> 
    <h2> 
     Sorry, an error occurred while processing your request. 
    </h2> 
    <p>Controller Name: @Model.ControllerName</p> 
    <p>Action Name : @Model.ActionName</p> 
    <p>Message: @Model.Exception.Message</p> 
</body> 
</html> 

为特定错误处理
添加的HandleError属性特定动作在控制器类。针对该特定错误提供“视图”和“异常类型”。
样本NotImplemented异常处理程序:

public class MyController: Controller 
    { 
     [HandleError(View = "NotImplErrorView", ExceptionType=typeof(NotImplementedException))] 
     public ActionResult Index() 
     { 
      throw new NotImplementedException("This method is not implemented."); 
      return View(); 
     } 
} 
15

我会建议实现一个自定义HandleErrorAttribute操作过滤器。

请参阅此链接了解详情:
http://msdn.microsoft.com/en-us/library/dd410203%28v=vs.90%29.aspx

建立一个HandleErrorAttribute动作过滤器为您提供了哪些动作是由过滤器处理的完全控制权,并可以很容易地设置在控制器级,甚至在通过在自定义的基础控制器上设置它,并让所有的控制器从基础控制器继承。

我做的其他事情是,我有一个单独的HandleJsonErrorAttribute,通过返回Json响应而不是自定义页面来响应Ajax调用。

UPDATE:

每下面的一些问题,这里是一个HandleJsonErrorAttribute,我使用的例子:

public class HandleJsonErrorAttribute : HandleErrorAttribute 
{ 
    public override void OnException(ExceptionContext filterContext) 
    { 
     var serviceException = filterContext.Exception as ServiceException; 

     filterContext.HttpContext.Response.StatusCode = (int)HttpStatusCode.InternalServerError; 

     filterContext.Result = new JsonResult { Data = new { message = serviceException == null ? "There was a problem with that request." : serviceException.Message } }; 

     filterContext.ExceptionHandled = true; 
    } 
} 

这里是我用来处理这些unhanded例外jQuery的:

$(document).ajaxError(function (event, jqXHR, ajaxSettings, thrownError) { 
    showPopdown($.parseJSON(jqXHR.responseText).message); 
}); 

这允许我的Ajax方法非常轻量级 - 它们只是处理返回正常的Json,并且如果发生非常规异常,则带有错误状态代码的消息将被包装在Json中并返回。

另外,在我的实现中,我有一个自定义的ServiceException,我从服务中抛出,并从服务层发送消息而不是通用消息。

+0

你能否举一个例子说明如何使用'HandleJsonErrorAttribute'处理这些ajax错误调用? – AdrianoRR 2011-10-01 15:55:29

+0

是的,我很感兴趣,也HandleJsonErrorAttribute。你能给我更多的信息和/或例子吗? – 2012-03-07 14:22:50

+0

不错的代码!这个对我有用。谢谢!我只改变了的StatusCode为“好”,以及如何在自己的代码除外。 对于大家正在寻找如何使用:只要把属性在行动(如:HandleJsonErrorAttribute]公共JsonResult ActionNameX(对象someArgs){...} – 2013-11-19 04:33:01

2

我觉得既然已经准备好随时使用您创建一个新的ASP.NET MVC 3项目的最简单方法是使用的ExceptionHandler属性。您仍然可以像往常一样配置Web.config以使用自定义错误页面并在全局Application_Error方法中处理异常,但是当发生异常时,URL不会像新MVC 3那样好。

+1

的确切属性名称的HandleError – 2011-05-15 11:39:00