2015-11-25 2 views
2

jqgrid данных сообщений JSon в буфере запроса POST, какКак получить динамические данные в Web API метод управления Post

{"headerData": { 
    "Tasudok": "134", 
    "Kuupaev": "2015-11-23", 
    "Dokumnr": "135319" 
    }, 


"rowData": { 
    "Toode":"", 
    "Kogus":"0.0000", 
    "Nimetus":"öäölä<a", 
    "_rowsum":"0.00", 
    "Id":"1639", 
    "Dokumnr":"135319", 
    "_oper":"edit", 
    "_rowid":"1639" 
    } 
} 

Данные размещены на ASP.NET MVC4 Web API, используя URL как API/Entity/someid?culture=en&layout=1 с маршрутизацией по умолчанию.

headerData и rowData свойства значения определены во время выполнения и могут отличаться.

Например, в некоторых строках запросаData может содержать дополнительные свойства, и некоторые свойства rowData могут отсутствовать.

culture и layout параметры строки запроса необязательны.

Как получить параметры в контроллере WebAPI?

Я попытался

public class EntityController : APIController 
{ 

public class PostParams { 
    public string culture { get; set; } 
    public int? layout { get; set; } 
    } 

    public HttpResponseMessage Post(string id, 
     [FromUri]PostParams optionalParams, 
     [FromBody]IList<NameValue> headerData, 
     [FromBody]IList<NameValue> rowData) 
    { ... } 


public class NameValue 
{ 
    public string name, value; 
} 
} 

Но headerData и ROWDATA пустуют. Как получить все параметры?

ответ

1

Если структура JSON не изменяет

Имея это позволит вам отправить тело, как тот, который вы указали в URL, как API/Entity/someid? Культуры = еп & макета = 1.

Чтобы указать дополнительный параметр запроса в маршруте контроллера, дать им значение по умолчанию, как:

public class EntityController : APIController 
{ 
    public HttpResponseMessage Post([FromUri]string culture="EN", [FromUri]int layout=1, YourBody body) 
    { ... } 
} 

Если YourBody всегда, как тот, который вы упоминалось, что-то подобное должно быть десериализован автоматически:

public class YourBody 
{ 
    public Dictionary<string, string> HeaderData {get; set;} 
    public Dictionary<string, string> RowData{get; set;} 
} 

и предоставит вам полный доступ к любому элементу кузова.

Если структура JSON может изменить

Нечто подобное позволило бы получить какой-либо JSON:

public HttpResponseMessage Post([FromBody]JToken body) 
{ 
    // Process the body 
    return ... 
} 

Вам потребуется некоторое дополнительное подтверждение, так как ни один объект десериализации не будет. Единственное, что вы знаете, это то, что ваше тело - JSON.

Поэтому вы можете проанализировать его, чтобы увидеть, похоже ли оно на то, что вы ожидаете. См. that post about how to access element of a JSON with JToken.

Например, вы могли бы сделать что-то вроде следующего, чтобы справиться с меняющимся содержанием тела и по-прежнему обрабатывать дополнительные параметры запроса по маршруту:

public HttpResponseMessagePost([FromBody]JToken body, [FromUri]string culture="EN", [FromUri]int layout=1) 
{ 
    JObject headerData= body["headerData"].Value<JObject>(); 
    JObject headerData= body["rowData"].Value<JObject>(); 
    return ...; 
} 

Вы также можете прочитать this о других альтернативах для размещения исходных данных в целях контроллер webapi.

+0

Первая подпись метода подписи вызывает ошибку компиляции 'Необязательные параметры должны появиться после всех необходимых параметров' – Andrus

+0

Ваш компилятор прав!Я обновляю свой пост (я написал этот код в текстовом редакторе, без доступа к VS или компилятору). А что вы получаете, если делаете то, что компилятор вам говорит? Скомпилирует ли он? – plog17

+0

Да, тогда он компилируется. Отличный ответ и отличная ссылка, спасибо. – Andrus

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