1

アラートに正しく表示され、ブラウザー デバッガーの投稿セクションに正しく表示される文字列化された JSON オブジェクトがありますが、コントローラーでは 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 の 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 に答える
1

単純なアクションのように見えるため、パラメーターを自分でエンコードする必要はありません。プロパティを含むオブジェクトをjQueryに渡すだけで、それがエンコードされます。

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

            )

        });
于 2012-05-24T14:37:44.000 に答える