3

我似乎在将包含数组的 javascript 对象传递给我的 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];
        }
    }

我在网上看了看,但我找不到任何处理以下问题的东西。对此事的任何帮助都会很棒。

4

3 回答 3

6

问题可能是因为您已经在 Person 的构造函数中初始化了数组,并且当反序列化器看到已经存在集合时 - 它会尝试添加而不是创建新集合。尝试从构造函数中删除初始化或将类型更改为 List。

于 2013-09-11T08:19:51.873 回答
0

列表绑定简单明了,但有有效时间(或不可控时间)将数组用作控制器操作的参数。

您可以修改 $.ajax 调用以将traditional参数设置为 true,这与 MVC 框架中默认模型绑定器的预期相符。

    $.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

干杯。

于 2013-09-11T16:29:27.730 回答
0

您需要从以下位置更改属性:

public string[] DaysOfTheWeek { get; set; }

至:

public List<string> DaysOfTheWeek { get; set; }
于 2013-09-11T19:13:43.543 回答