2017-02-21 9 views
0

私はこれでかなり新しいので、私に同行してください。私はAJAX経由で私のコントローラでJsonResultメソッドを呼び出しています。 JsonResultアクションメソッドは、ストアドプロシージャを呼び出し、オブジェクトにデータをロードし、それを返してシリアライズし、クライアントのAJAX呼び出しに戻すプライベートメソッドを呼び出します。[]を付けないでJsonResultでエラーを返す

すべてがうまくいくが、Oracleの例外をキャッチすると、エラーを返すことができるようにしたい。私は現在、私のキャッチで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

なぜキャッチして、JavaScriptをエラーハンドラに返すのですか?問題は、あなたのシナリオでまだ空のリストを返すということです。これは[]にシリアル化されます。 – 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

申し訳ありませんが、私は答えとしてマークして、それほど長い時間がかかりました。私はまだ実装していませんが、私はこのソリューションが大好きで、すぐにそうしていきます。ありがとう! –

関連する問題