2016-09-01 3 views
2

Итак, я пишу код Asp.Net WebApi, чтобы использовать старый код C#, где нет класса модели. (Чистая dataTable, возвращаемая с DataAccess, Crazy правильно? Я знаю)Как вернуть один объект DataRow из Asp Web API?

Ниже приведен код, который я поставил на стороне сервера.

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 
} 

Я не хочу, чтобы все эти rowError, rowState .. .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); 

     } 

Я получаю это:

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

, который, к сожалению, отвергнут ngResource методом GET, поскольку она представляет собой массив, а не один Json Object.

Что мне делать? Если я просто хочу вернуть один dataRow как строку Json.

В идеале я хочу избегать перехода к пути создания объекта ответа, как это предлагает Маноз. (Спасибо за ваш ответ Manoz хотя)

Благодаря

ответ

0

Вы можете конвертировать ваши DataRow в Dictionary с помощью LINQ:

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 

Создайте отдельный класс, соответствующий вашему отклику. Я считаю, что формат ответа останется таким же всегда.

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

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

Теперь десериализации ответ, используя Newtonsoft.Json

var entities = SearchManager.Search(so); 

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

Помощь источник - https://www.nuget.org/packages/newtonsoft.json/

+0

Спасибо. Но, извините, я обновлю свой OP.Потому что я пытаюсь избежать создания модели для ответа. – TypingPanda

+0

то почему вы не можете просто запросить - result.Rows [0] .table [0] '? – Manoj

+0

Возвращает массив снова. То же, что 'Ok (результат)' – TypingPanda

0

Поскольку это опубликовано всего несколько месяцев назад, предположим, что вы используете API 2.x. Эта версия обрабатывает формат возврата автоматически и разумно, особенно нет необходимости реализовывать явный CAST. Вам просто нужно указать тип, который вы хотите. Например, в AngularJS, это покажет API, что вы ожидаете:

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

На сервере API, просто держать свой код. Во время выполнения он автоматически возвращает результат в формате JSON.

+0

Опять же, не нужно CAST вообще. – Jeb50

Смежные вопросы