2017-02-21 1 views
0

저는이 모든 것에 매우 익숙하므로 제발 저를 참아주십시오. 내 컨트롤러에서 AJAX를 통해 JsonResult 메서드를 호출하려고합니다. JsonResult 액션 메서드는 저장 프로 시저를 호출하고 객체에 데이터를로드 한 다음이를 반환하여 직렬화하고 클라이언트 AJAX 호출에 반환하는 비공개 메소드를 호출합니다.[없음]없이 JsonResult를 통해 오류가 반환되었습니다.

모두 훌륭하지만, 오라클 예외를 잡으면 오류를 반환 할 수 있기를 원합니다. 나는 현재 내 잡기에 Response.Write를하고 있지만 JsonResult 액션을 거치므로 메시지에 []을 추가 할 것이다. 나는 항상 클라이언트 쪽에서 그것을 다듬을 수 있었지만 나는 이렇게하지 말아야한다는 느낌을 받았다. 또는 더 깨끗한 방법이있다.

AJAX 호출 :

$.ajax({ 
    type: "GET", 
    url: "/Controller/JsonResultActionMethod", 
    dataType: "json", 
    data: { someVar: someData }, 
    cache: false, 
    success: function (results) { 
     // Do some stuff 
    }, 
    error: function (xhr, status, error) { 
     alert(xhr.responseText); 
    } 
}); 

JsonResult 작업 :

[HttpGet] 
    public JsonResult JsonResultActionMethod(string someVar) 
    { 
     var myObjects = GetObjects(someVar); 
     return Json(myObjects , JsonRequestBehavior.AllowGet); 
    } 

있는 getObjects 방법 (즉, myObject의 통화 저장 프로 시저 반환 목록)

private List<myObject> GetObjects(string someVar) 
    { 
     var myObjList = new List<InspectionModel>(); 

     try 
     { 
      // call stored procedure, create new instance of object, and load up myObjList. All of this works just fine 
     } 
     catch (OracleException ex) 
     { 
      // error handling is a bit more robust. simplified for example. ex.Message, when returned to page and displayed via xhr.responseText will appear as such: "Some error message from Oracle[]" 
      Response.Write(ex.Message); 
     } 

     return disasterList; 
    } 

오류를 반환 할 수있는 방법이 있나요 catch {}의 메시지를 JSON 객체로 직렬화 할 수있는 방법으로? myObject에 List 속성을 추가하고 거기에 오류를 저장하는 방법에 대해 생각했습니다. 이 작업을 수행하는 더 좋은 방법이 있습니까?

+1

왜 잡아서 자바 스크립트의 오류 처리기로 500을 반환할까요? 문제는 시나리오에서 여전히 빈 목록을 반환한다는 것입니다. 이것은 []로 직렬화 될 것입니다. – Fran

+0

저장 프로 시저가 실제로 이유 (데이터가 없거나 대기열에 대한 데이터가 더 이상 없음)를 반환하고 최종 사용자를위한 메시징에 도움이되므로 캐치하고자합니다. 방금 500을 반환하면 클라이언트 측에서 구문 분석하여 ORA 오류 메시지를 가져와야합니다. 솔직히 궁금한데, 그렇게해야합니까? 그게 내가 500이라는 메시지를 파싱하여 원하는 메시지를 얻는 올바른 방법일까요? –

+0

catch 블록을 제거하고 javascript를 디버그 한 다음 확인하십시오. ORA 메시지는 내부 예외에 묻힐 수 있습니다. 나는 내 머리 꼭대기를 모른다. – Fran

답변

0

일반적으로 API 디자인과 관련하여 실제로 이것은 좋은 질문입니다. 나는 이것에 "최고의"해결책을 찾을 수 없었습니다. 하지만 예외 필드와 실제 개체 자체를 포함하는 BaseResponse 클래스를 만들었습니다. 이와 같이 :

public class BaseResponse<T> { 
    public T Data { get; set; } 
    public Exception Error { get; set; } 

    public object GetResponse() { 

     //If an exception has not been thrown then just return your data 
     if(Error == null) 
      return Data; 

     //If an exception has been thrown, return the exception 
     return Error; 
    } 
} 

그런 다음 컨트롤러에서이 BaseResponse 클래스를 사용할 수 있습니다.

[HttpGet] 
public JsonResult GetObjects(string someVar) 
{ 
    var response = BaseResponse<InspectionModel>(); 

    try { 
     response.Data = GetObjects(someVar); 
    } 
    catch(Exception e) { 
     response.Error = e; 
    } 

    return Json(response.GetResponse() , JsonRequestBehavior.AllowGet); 
} 

필터를 사용하여이 모든 것을 마무리하는 더 좋은 방법이 있습니다. 그러면 모든 것이 백그라운드에서 발생할 수 있으므로이 코드를 모든 곳에서 복제 할 필요가 없습니다.

+0

죄송합니다. 응답 시간이 너무 길어 답을 표시하지 않았습니다. 아직 구현하지는 못했지만이 솔루션이 맘에 들지만 곧 그렇게 될 것입니다. 감사! –

관련 문제