2013-09-11 4 views
3

Кажется, у меня проблема с передачей объекта javascript, который содержит массив, на мой MVC-контроллер. У меня есть объект, который содержит две строки и строковый массив. Две строки связываются правильно, но как только я добавляю массив к объекту, я получаю следующую ошибку:привязка объекта json в MVC

Коллекция доступна только для чтения.

Вот мой JS + Ajax код:

$('.submit').on('click', function() { 

     var viewModel = { 
      FName: "John", 
      LName: "Doe", 
      DaysOfTheWeek: ['sun', 'mon', 'tue', 'wed', 'thu', 'fri', 'sat'] 
     }; 

     console.log(viewModel); 

     $.ajax({ 
      url: "/Home/JsonMethod", 
      type: "POST", 
      data: JSON.stringify(viewModel), 
      dataType: 'json', 
      contentType: 'application/json; charset=utf-8', 
      success: function (data) { 
       console.log(data); 
      } 
     }); 

    }); 

Вот мой MVC контроллер:

public JsonResult JsonMethod(Person person) 
    { 
     return Json(person, JsonRequestBehavior.AllowGet); 
    } 

Вот класс Person:

public class Person 
    { 
     public string FName { get; set; } 
     public string LName { get; set; } 
     public string[] DaysOfTheWeek { get; set; } 

     public Person() 
     { 
      DaysOfTheWeek = new string[7]; 
     } 
    } 

У меня было смотреть онлайн, но я не могу найти ничего, что касается следующей проблемы. Любая помощь в этом вопросе была бы замечательной.

+1

Вы пробовали использовать дженерики: Список вместо строки [] в классе Person? –

+0

Изменил его из массива в список, и он сработал! Спасибо @Adam – gb1986

ответ

6

Проблема может быть в том, что вы инициализировали массив в конструкторе Person, и когда десериализатор видит, что уже есть коллекция, он пытается добавить к нему вместо создания нового. Попробуйте либо удалить инициализацию из конструктора, либо изменить тип в List.

+0

Не мог себе представить, в чем проблема. – joym8

0

Связывание списков является простым и понятным, но существуют действительные времена (или неуправляемые времена) для работы с массивами в качестве параметров для действий контроллера.

Вы можете изменить свой вызов $ .ajax, чтобы установить параметр traditional в значение true, которое работает с ожиданиями связующего объекта модели по умолчанию в MVC Framework.

$.ajax({ 
     url: "/Home/JsonMethod", 
     traditional: true, 
     type: "POST", 
     data: JSON.stringify(viewModel), 
     dataType: 'json', 
     contentType: 'application/json; charset=utf-8', 
     success: function (data) { 
      console.log(data); 
     } 
    }); 

подробнее и примеры здесь: http://theycallmemrjames.blogspot.ca/2010/05/aspnet-mvc-and-jquery-part-4-advanced.html

Приветствия.

0

Вы должны изменить свойство от:

public string[] DaysOfTheWeek { get; set; } 

To:

public List<string> DaysOfTheWeek { get; set; } 
Смежные вопросы