1

我有一个字符串化的 JSON 对象,该对象正确显示在警报中,正确显示在浏览器调试器的 post 部分中,但在控制器中显示为 null。我不确定它是如何丢失信息的。

这是JS代码:

 var assessmentStatus = [];

            $("select.assessmentSelect").each(function () {
                assessmentStatus.push({
                    assessmentname: $(this).attr("id"),
                    assessmentstatus: $(this).val()
                });


            });
alert(JSON.stringify(assessmentStatus));


            $.ajax({
                url: '@Url.Action("testAS")',
                type: "POST",
                contentType: 'application/json',
                data: JSON.stringify({
                    AS: assessmentStatus,
                    AS2: assessmentStatus

                })

            });

这是警报中出现的内容:

[{"assessmentname":"testassessment","assessmentstatus":"Design"},{"assessmentname":"DepressionUpload","assessmentstatus":"Design"}]

这是帖子中出现的内容:

[Object { assessmentname="testassessment", assessmentstatus="Design"}, Object { assessmentname="DepressionUpload", assessmentstatus="Design"}]

我的控制器看起来像这样:

public ActionResult testAS (string[] AS, string AS2)

string[] AS returns [0]null  [1]null
string AS2 just returns null.

为什么它在发送到控制器时没有被字符串化?

4

3 回答 3

2

您似乎正在尝试传递具有 2 个属性的复杂对象数组:

assessmentStatus.push({
    assessmentname: $(this).attr("id"),
    assessmentstatus: $(this).val()
});

到一个简单的字符串数组:string[] as. 这显然行不通。

所以从定义一个视图模型开始:

public class AssessmentViewModel
{
    public string Name { get; set; }
    public string Status { get; set; }
}

然后调整您的控制器操作:

public ActionResult TestAS(AssessmentViewModel[] assessments)
{
    ...
}

最后是你的javascript:

var assessments = [];
$('select.assessmentSelect').each(function () {
    assessments.push({
        name: $(this).attr("id"),
        status: $(this).val()
    });
});
$.ajax({
    url: '@Url.Action("testAS")',
    type: "POST",
    contentType: 'application/json',
    data: JSON.stringify({ assessments: assessments })
});
于 2012-05-24T15:00:34.143 回答
1

您不必自己对参数进行编码,因为看起来很简单。只需将带有您的属性的对象交给 jQuery,它就会为您编码。

       $.ajax({
            url: '@Url.Action("testAS")',
            type: "POST",
            contentType: 'application/json',
            data: {
                AS: assessmentStatus,
                AS2: assessmentStatus

            )

        });
于 2012-05-24T14:37:44.000 回答
1

我以前遇到过这个。你需要设置 jQuery 的 ajaxSettings.traditional = true。前段时间,他们改变了序列化数组的方式。它搞砸了asp.net mvc。

这个问题谈到了它:

如何在没有表单的情况下将字符串数组发布到 ASP.NET MVC 控制器?

这样做:http: //forum.jquery.com/topic/nested-param-serialization

所以只要放:

jQuery.ajaxSettings.traditional = true;

然后像 Pointy 说的那样做,不要对你的数据进行字符串化。

于 2012-05-24T14:54:25.653 回答