2013-12-09 6 views
2

asp.net mvc 응용 프로그램에서 오류를 처리하기 위해 CustomErrorHandler 특성을 사용하고 있습니다. 코드는 다음과 같습니다 :asp.net MVC 3.0의 경우 JSON 오류 응답을 표시하는 방법 MVC 3.0 App의 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의 형태로 오류 메시지를 보여주고 싶다. 이 data.ErrorMessage에 대한 정의되지 않은 말 대신 실제 오류 메시지가 표시되고,

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

그러나 :

내가 좋아하는 어떤 것을 시도했다.

처리 방법에 대한 도움/제안 바랍니다.

Updated2는 :이가 해결 됐는지입니다 : 제대로 return 문을 형성하지 않는 것 같은

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); 이상의 복잡한 대화 상자 같은 오류 메시지를 표시 할 수 있습니다. 코드에서 Ajax 요청의 경우 filterContext.ExceptionHandled = true;을 설정하지 않았기 때문에 현재 코드의 주된 문제가 있다고 가정합니다.

현재 코드에 대한 작은 말 : .Headers["X-Requested-With"] 대신에 IsAjaxRequest 확장자 (형식 : if (filterContext.HttpContext.Request.IsAjaxRequest()) {...})를 사용할 수 있다고 생각합니다.

+0

@ Oleg .. 나는 Jquery unobstrusive ajax를 사용하고 있습니다 .. –

+0

@ Oleg..it는 실패한 함수입니다.하지만 오류 정보를 가져올 수 없습니다. –

+0

@Avinash :'data.ErrorMessage'를 사용합니다 (게시 한 코드 참조). 대신에'$ .parseJSON (data.responseText) .ErrorMessage' (내 대답 참조)를 사용해야합니다. – Oleg

1

것 같습니다. 당신의 JsonResult 액션에서 시도 :

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

를이 방법으로 문제가 해결되지 않으면 :

  • 는 자바 스크립트에서 AJAX 응답 객체에 CONSOLE.LOG를 수행합니다.
  • 올바른 속성 이름에 액세스하고 있는지 확인하십시오.
  • JavaScript가 유효한 객체로 반환을 인식하는지 확인하십시오. 이 문자열 형태로 여전히 경우 수행해야 할 수 있습니다 :

    var returnedObj = JSON.parse(jsonString); 
    

내 webAPI 컨트롤러 중 하나의 응답의 CONSOLE.LOG을이 생산되었다

Json response

JSON 개체는 응답 속성 중 하나에서 문자열 형식입니다. returnedObj의 CONSOLE.LOG 생산

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

:

enter image description here