2013-04-07 1 views
1

Я использую MVC 4 и пытаюсь получить Json от клиента, созданного Knockout.Js, назад к моему Action Controller. Json получает одобренное сообщение и изучает его в Fiddler, все кажется прекрасным, но когда JsonResults Action связывает его, у созданного объекта нет ICollection, который присутствовал в Json.JsonResult не подбирает ICollection в объекте, когда я отправляю сообщение из ajax

Мой клиент Ajax пост выглядит следующим образом:

$.ajax({ 
      url: location.href, 
      type: 'POST', 
      data: ko.toJSON(this.Orders), 
      dataType: "json", 
      contentType: "application/json charset=utf-8", 
      success: function (data) { 
       alert(data.Message); 
      } 
     }); 

Это производит следующий JSon:

[{"Number":1,"Properties":{"Id":2,"Title":"#333"},"UnitCost":"20"}] 

Моя структура ViewModel на стороне сервера так:

модель Заказать

 public class VmOrder 

{ 

    public int Number 
    { 
     get; 
     set; 
    } 

    public ICollection<VmProperty> Properties 
    { 
     get; 
     set; 
    } 

    public decimal UnitCost 
    { 
     get; 
     set; 
    } 

} 

модель недвижимости

public class VmProperty 
    { 

    public int Id 
    { 
     get; 
     set; 
    } 

    public string Title 
    { 
     get; 
     set; 
    } 
} 

И, наконец, мой контроллер выглядит следующим образом:

[HttpPost] 
    public JsonResult Order(ICollection<VmOrder> Orders) 
    { 

     // further server-side validation, save to database, etc 
     return Json("Saved", ""); 
    } 

Хотя я получить номер и UnitCost коллекция свойства равно нулю, какие идеи?

+0

'" Свойства ": {" Id ": 2," Title ":" # 333 "}' содержит только объект, а не массив. Версия массива будет выглядеть так: '' Properties ': [{"Id": 2, "Title": "# 333"}] '. Итак, на стороне C# вам нужны 'public VmProperty Properties { get; комплект; } 'вместо коллекции. – nemesv

+0

Это сделало, спасибо. Я установил модель свойств как и наблюдаемый массив в нокаут, но по какой-то причине он не передал JSON в виде массива? – Fishbaum

ответ

0

Как сказал Немцев, «Свойства»: {«Id»: 2, «Title»: «# 333»} содержит только объект, а не массив. Версия массива будет выглядеть так: «Свойства»: [{«Id»: 2, «Title»: «# 333»}]. Итак, на стороне C# вам нужны публичные свойства VmProperty {get; задавать; } вместо коллекции.

1

Try замена:

contentType: "application/json charset=utf-8" 

с:

contentType: "application/json; charset=utf-8" 

Вы пропускали ; и, таким образом, в результате недопустимого и несуществующей заголовка Content-Type запроса.

+0

Спасибо, я сделал это изменение, но это не было проблемой, на самом деле это не имело никакого значения. – Fishbaum

+0

На самом деле это имеет значение. После того, как вы исправили свою реальную ошибку (формат массива JSON), вы также должны убедиться, что заголовок Content-Type установлен правильно, иначе привязка модели не привяжет вашу модель. –

+0

честный, это действительно не имело никакого значения – Fishbaum

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