2016-09-01 3 views
2

私は、モデルクラスが使用されていない古いC#バックエンドコードをフックするために、いくつかのAsp.Net WebApiコードを書いています。 (DataAccessから返された純粋なdataTable、Crazy権利ですか?私は知っています)Asp Web APIから単一のDataRowオブジェクトを返す方法はありますか?

以下は、サーバー側に書いたコードです。私はこのような応答を有するように期待してい

public IHttpActionResult GetProduct(int campaignID, int productID) 
    { 
     var so = new SearchOptions(campaignID) 
     { 
      ProductID = productID 
     }; 

     var result = SearchManager.Search(so); 
     if (result == null || result.Rows.Count == 0) 
      return NotFound(); 
     return Ok(result.Rows[0]); 

    } 

{ 
Field1: "field1", 
Field2: "field2", 
... 
} 

しかし、実際に私は、この持っています:

{ 
    "rowError": "", 
    "rowState": 2, 
    "table": [ 
    { 
     Field1 : "field1", 
     Field2 : "field2", 
     ... 
    } 
    ], 
    "itemArray": ["field1","field2"], 
    "hasErrors": false 
} 

を私はこれらすべてのrowErrorrowStateを望んでいません.. .etc

サーバー側でこれを行う場合は、

public IHttpActionResult GetProduct(int campaignID, int productID) 
     { 
      var so = new SearchOptions(campaignID) 
      { 
       ProductID = productID 
      }; 

      var result = SearchManager.Search(so); 
      if (result == null || result.Rows.Count == 0) 
       return NotFound(); 
      return Ok(result); 

     } 

私はこれを受け付けております:

それは配列ではなく、単一のJSONオブジェクトであるため、残念ながら ngResource getメソッドによって拒否され
[{Field1: "field1", Field2: "field2"..}] 

を。

どうすればよいですか?私はちょうどJsonの文字列として単一のdataRowを返す場合。

理想的には、Manozが提案したようにレスポンスオブジェクトを作成するパスに移動しないようにしたいと考えています。 (あなたも答えてくれてありがとうございます)

ありがとう

答えて

0

を:

public IHttpActionResult GetProduct(int campaignID, int productID) 
{ 
    var so = new SearchOptions(campaignID) 
    { 
     ProductID = productID 
    }; 

    var result = SearchManager.Search(so); 
    if (result == null || result.Rows.Count == 0) 
     return NotFound(); 

    var row = result.Rows[0]; 
    return Ok(row.Table.Columns 
     .Cast<DataColumn>() 
     .ToDictionary(c => c.ColumnName, c => row[c])); 
} 

アクションがJSONを返すことあなたが望むように:{ Field1: "field1", Field2: "field2", ... }

+0

チャームのように動作します。ありがとう! – TypingPanda

+0

@TypingPandaようこそ! – feeeper

1

デシリアライズしましたか?

Using NewtonSoft.Json 

レスポンスに合わせて別のクラスを作成します。私は、レスポンスの形式は常に同じであると信じています。

今Newtonsoft.Json

var entities = SearchManager.Search(so); 

var result= JsonConvert.DeserializeObject<Response>(entities) 
var endResult= result.table[0] //will get you result 

ヘルプソース使用して応答をデシリアライズ

public class Response{ 
    public List<response> table{ get;set; } 
} 

public class response { 
    public string Field1 { get;set; } 
    public string Field2 { get;set; } 
} 

- あなたはLINQを使用してDataRowDictionaryに変換することができhttps://www.nuget.org/packages/newtonsoft.json/

+0

ありがとうございました。しかし、申し訳ありませんが私は私のOPを更新します。なぜなら私はレスポンスのモデルを作成しないようにしようとしているからです。 – TypingPanda

+0

それでは、単に 'result.Rows [0] .table [0]'をクエリできないのですか? – Manoj

+0

私は再び配列を返します。 'Ok(result) 'と同じ – TypingPanda

0

これはわずか数か月前に投稿されているので、API 2.xを使用していると仮定します。このバージョンでは、明示的なCASTを実装する必要がなく、自動的かつインテリジェントに戻り形式を処理します。必要なタイプを指定するだけです。ちょうどあなたのコードを維持、

$http({ 
    method: 'GET', 
    responseType: 'json' 
    url: ... 
}).then(function mySuccess(response){ 
    $scope.theRow = response.data; 
}) 

をサーバーAPIで:AngularJSの例では、これはあなたが期待している何APIを教えてくれます。実行中、結果はJSON形式で自動的に返されます。

+0

もう一度CASTする必要はありません。 – Jeb50

関連する問題