125

jQuery の ajax() 関数を使用して、オブジェクトの配列を MVC コントローラー メソッドに渡そうとしています。PassThing() C# コントローラー メソッドに入ると、引数 "things" が null です。引数に List の型を使用してこれを試しましたが、それも機能しません。私は何を間違っていますか?

<script type="text/javascript">
    $(document).ready(function () {
        var things = [
            { id: 1, color: 'yellow' },
            { id: 2, color: 'blue' },
            { id: 3, color: 'red' }
        ];

        $.ajax({
            contentType: 'application/json; charset=utf-8',
            dataType: 'json',
            type: 'POST',
            url: '/Xhr/ThingController/PassThing',
            data: JSON.stringify(things)
        });
    });
</script>

public class ThingController : Controller
{
    public void PassThing(Thing[] things)
    {
        // do stuff with things here...
    }

    public class Thing
    {
        public int id { get; set; }
        public string color { get; set; }
    }
}
4

15 に答える 15

206

NickW の提案を使用して、things = JSON.stringify({ 'things': things });Here is the complete code を使用してこれを機能させることができました。

$(document).ready(function () {
    var things = [
        { id: 1, color: 'yellow' },
        { id: 2, color: 'blue' },
        { id: 3, color: 'red' }
    ];      

    things = JSON.stringify({ 'things': things });

    $.ajax({
        contentType: 'application/json; charset=utf-8',
        dataType: 'json',
        type: 'POST',
        url: '/Home/PassThings',
        data: things,
        success: function () {          
            $('#result').html('"PassThings()" successfully called.');
        },
        failure: function (response) {          
            $('#result').html(response);
        }
    }); 
});


public void PassThings(List<Thing> things)
{
    var t = things;
}

public class Thing
{
    public int Id { get; set; }
    public string Color { get; set; }
}

このことから学んだことは次の 2 点です。

  1. ajax() 関数では contentType と dataType の設定が絶対に必要です。それらが欠けていると機能しません。試行錯誤の末、これにたどり着きました。

  2. オブジェクトの配列を MVC コントローラー メソッドに渡すには、単純に JSON.stringify({ 'things': things }) 形式を使用します。

これが他の誰かに役立つことを願っています!

于 2012-11-06T16:38:40.603 に答える
14

問題になる可能性のあるデータのフォーマット。次のいずれかを試してください。

data: '{ "things":' + JSON.stringify(things) + '}',

または(フォームなしで文字列の配列をASP.NET MVCコントローラーに投稿するにはどうすればよいですか?

var postData = { things: things };
...
data = postData
于 2012-11-06T00:51:52.910 に答える
2

asp.netコア2.1でコンテンツタイプを削除すると、ajax呼び出しが機能することが確認できました。

function PostData() {
    var answer = [];

    for (let i = 0; i < @questionCount; i++) {
        answer[i] = $(`#FeedbackAnswer${i}`).dxForm("instance").option("formData");
    }

    var answerList = { answers: answer }

    $.ajax({
        type: "POST",
        url: "/FeedbackUserAnswer/SubmitForm",
        data: answerList ,
        dataType: 'json',
        error: function (xhr, status, error) { },
        success: function (response) { }
    });
}
[HttpPost]
public IActionResult SubmitForm(List<Feedback_Question> answers)
{}
于 2021-07-08T12:38:41.697 に答える
1
     var List = @Html.Raw(Json.Encode(Model));
$.ajax({
    type: 'post',
    url: '/Controller/action',
    data:JSON.stringify({ 'item': List}),
    contentType: 'application/json; charset=utf-8',
    success: function (response) {
        //do your actions
    },
    error: function (response) {
        alert("error occured");
    }
});
于 2017-01-04T09:32:31.660 に答える
0

ASP.NET Web API を使用している場合は、 data: JSON.stringify(things).

コントローラーは次のようになります。

public class PassThingsController : ApiController
{
    public HttpResponseMessage Post(List<Thing> things)
    {
        // code
    }
}
于 2015-12-25T10:07:51.667 に答える