2013-05-04 3 views
9

Я создаю приложение, используя Durandal, с WebAPI в качестве сервера. У меня есть сетка KendoUI, которая правильно отображает данные с сервера и функционирует должным образом, пока не будут вызваны методы POST или PUT. Вот мой метод GET: enter image description hereWebAPI Model Binding от JSON

, и вы можете видеть, что эти данные связываются с UI (используется data-bind extensibility в Дюрандала, чтобы изменить кендо привязок): enter image description here

Затем я редактировать данные в сетке и она проходит изменения внутри запроса к серверу, как вы можете видеть в этом результате Скрипач: enter image description here

на стороне сервера я не могу получить данные, которые передаются от клиента, чтобы связать к чему я отношу в качестве параметра для метода на POST или PUT. enter image description here

Я понимаю, что это несколько различных технологий для устранения неполадок (например, Durandal, KnockoutJs, Кендо DataBinding и WebAPI), но я думаю, что основные принципы работают, данные извлекаются и привязаны к пользовательскому интерфейсу и она размещена назад при изменении, но конечная точка WebAPI не может привязываться к данным.

Как я могу получить переданный массив моделей для привязки через структуру ModelBinding в WebAPI?

update- Вот полезная JSFiddle, который дал мне правильный Content-Type добавить: http://jsfiddle.net/Xhrrj/1/

new kendo.data.DataSource({ transport: { read: { type: "POST", url: "../cccs/service.svc/SupplierSearch", contentType: "application/json; charset=utf-8", dataType: 'json'...

это исходит из форума Telerik here

+0

Основываясь на примере запроса на скрипач, вы отправляете обратно данные, но не в нужном формате, поэтому Web.API не может его использовать. Поэтому проблема заключается в том, как вы сериализуете данные. Поэтому, пожалуйста, напишите код вашего метода изменений сохранения или создайте запрос 'put'. – nemesv

+2

Похоже, что он смешивал форму-urlencoded с json-форматом - он отправляет 'models =', а затем объекты urlencoded JSON следуют. –

+0

@nemesv, я использую функции javascript KendoUI, вот фрагмент, который, на мой взгляд, может быть полезным: parameterMap: function (options, operation) { if (operation! == "read" && options.models) { return { модели: kendo.stringify (options.models)}; } } - ссылка http://docs.kendoui.com/getting-started/web/grid/editing - также чтение этого, может быть, способ изменить json-модель, но не уверен - http: // docs .kendoui.com/get-started/framework/datasource/overview –

ответ

6

Это выглядит, как будто это было перепутать form-urlencoded с форматом json - если вы LookAt декодированной строки он отправляет models=, а затем urlencoded объекты JSON следовать.

+1

заголовки http форматировали строку для этого: Content-Type: application/x-www-form-urlencoded; кодировка = UTF-8. Поместив следующее в мой javascript-объект для PUT и POST, я получил правильные данные через - contentType: "application/json; charset = utf-8" –

0

Из моего опыта, я думаю, что ваша заявка на конечную точку PUT должна выглядеть примерно так:

[HttpPut] 
public void Put([FromBody]IEnumerable<Product> models) { } 

Итак, вам нужен атрибут FromBody, потому что ваш массив продуктов находится в теле (я думаю?), А не в URL-адресе запроса.

+0

Эй, Алекс, спасибо за ответ, но ваш ответ не изменил значения привязки, на самом деле я должен был явно указать заголовок Content-Type, чтобы получить данные JSON для привязки в методах API. –