2013-12-09 48 views
2

我正在使用CustomErrorHandler属性来处理我的asp.net mvc应用程序中的错误。代码如下:如何在MVC 3.0中接收并显示JSON错误响应MVC 3.0中的Ajax应用程序

public class CustomHandleErrorAttribute : HandleErrorAttribute // Error handler 
    { 
     public override void OnException(ExceptionContext filterContext) 
     { 
      if (filterContext.ExceptionHandled || !filterContext.HttpContext.IsCustomErrorEnabled) 
      { 
       return; 
      } 
      if (new HttpException(null, filterContext.Exception).GetHttpCode() != 500) 
      { 
       return; 
      } 
      if (!ExceptionType.IsInstanceOfType(filterContext.Exception)) 
      { 
       return; 
      } 

      // if the request is AJAX return JSON else view. 
      if (filterContext.HttpContext.Request.Headers["X-Requested-With"] == "XMLHttpRequest") 
      { 
       filterContext.Result = AjaxError(filterContext.Exception.Message, filterContext); 
      } 
      else 
      { 
       filterContext.ExceptionHandled = true; 
       var controllerName = (string)filterContext.RouteData.Values["controller"]; 
       var actionName = (string)filterContext.RouteData.Values["action"]; 
       var model = new HandleErrorInfo(filterContext.Exception, controllerName, actionName); 

       filterContext.Result = new ViewResult 
       { 
        ViewName = View, 
        MasterName = Master, 
        ViewData = new ViewDataDictionary<HandleErrorInfo>(model), 
        TempData = filterContext.Controller.TempData 
       }; 
      } 

     } 
     protected JsonResult AjaxError(string message, ExceptionContext filterContext) 
     { 
      if (String.IsNullOrEmpty(message)) 
       message = "Something went wrong while processing your request. Please refresh the page and try again."; 
      filterContext.HttpContext.Response.StatusCode = (int)HttpStatusCode.InternalServerError; 
      filterContext.HttpContext.Response.TrySkipIisCustomErrors = true; 
      return new JsonResult { Data = new { ErrorMessage = message }, ContentEncoding = System.Text.Encoding.UTF8, JsonRequestBehavior = JsonRequestBehavior.AllowGet }; 
     } 
    } 
} 

它有能力捕获正常错误和Ajax错误。

在正常误差的情况下,我建立的误差模型,并显示错误观点

,但在阿贾克斯错误的情况下,我想表现出JSON形式的错误消息。

我试着像一些事情:

function Failed(data) { // Onfailed call of MVC Ajax form 
     alert("Sorry,An error occured while processing your request"); 
     alert(data.ErrorMessage); 
    } 

但是,它是为data.ErrorMessage说不确定的,而不是显示实际的错误消息。

请帮助/建议如何处理此问题。

Updated2:这是它是怎么解决的:

function Failed(jqXHR, textStatus, errorThrown) { 
     var Error = $.parseJSON(jqXHR.responseText); 
     alert("Sorry,An error occured while processing your request"); 
     alert(Error.ErrorMessage); 
    } 

回答

3

我觉得奇怪的是,要在阿贾克斯的情况下显示一些HTML表单错误。 Ajax请求通常使用.fail()方法或error回调jQuery.ajax来获取错误信息。在回调内部,可以使用var error = $.parseJSON(jqXHR.responseText);解码服务器响应,然后显示一些错误消息,如alert(error.ErrorMessage);或更复杂的对话框。我想你当前代码中的主要问题是因为你的代码中没有设置filterContext.ExceptionHandled = true;以防Ajax请求。

对当前代码的小备注:我认为您可以安全使用IsAjaxRequest扩展名(格式为if (filterContext.HttpContext.Request.IsAjaxRequest()) {...}),而不是测试.Headers["X-Requested-With"]

+0

@ Oleg ..我正在使用jquery unobstrusive ajax .. –

+0

@ Oleg..it是击中失败的函数..但我无法从中检索错误信息。 –

+0

@Avinash:您使用'data.ErrorMessage'(请参阅您发布的代码)。而不是你应该使用'$ .parseJSON(data.responseText).ErrorMessage'(请参阅我的答案)。 – Oleg

1

它看起来就像你不能正确形成return语句。在你的JsonResult动作,尝试:

var returnObj = new { ErrorMessage = message }; 
return Json(returnObj, JsonRequestBehavior = JsonRequestBehavior.AllowGet); 

如果这不能解决问题:

  • 不要在你的JavaScript Ajax响应对象上的console.log。
  • 确保您正在访问正确的属性名称。
  • 确保JavaScript将您的回报识别为有效的对象。如果仍然以字符串形式,你可能需要做:

    var returnedObj = JSON.parse(jsonString); 
    

从我的WebAPI控制器的一个响应的执行console.log正在产生这样的:

Json response

JSON对象以响应属性之一的字符串形式存在。我得到了我想要做的对象:

var returnedObj = JSON.parse(response.responseText); 

的returnedObj的生产的console.log:

enter image description here

相关问题