1

これは、HTMLテーブルを見て、trと入力フィールドの値からIDを取得し、それらをオブジェクトに入れてjson文字列化してMVCコントローラーに投稿する私のjQueryです。jQuery 1.8.2 を使用しています

      var rowdata = [];
            $('table').find('tr').each(function () {
                myjson = [];
                item = {}
                item["id"] = $(this).attr('id');
                item["reason"] = $(this).find('input').val();
                myjson.push(item);
                rowdata.push(myjson);
            });
            jsonstring = JSON.stringify(rowdata);
            $.ajax({
                url: '@Url.Action("AbsentReason", "Attendance")',
                data: jsonstring,
                type: 'POST',
                traditional: true,
                contentType: 'json',
                success: function (data) {
                    $('#message').html("Reason was updated");
                }
            });

これは、有効性をチェックする結果の JSON です。

[[{}],[{"id":"6","re​​ason":""}],[{"id":"7","re​​ason":""}],[{"id": "15","理由":""}],[{"id":"23","理由":""}],[{"id":"29","理由":""}] ,[{"id":"30","理由":""}],[{"id":"31","理由":""}],[{"id":"35"," reason":""}],[{"id":"40","re​​ason":""}],[{"id":"41","re​​ason":""}],[{"id ":"42","理由":""}],[{"id":"48","理由":""}],[{"id":"49","理由":""}],[{"id":"50","理由":""}],[{"id":"51","理由":""}],[{"id":"52" ,"理由":""}],[{"id":"53","理由":""}],[{"id":"54","理由":""}],[{ "id":"55","理由":""}],[{"id":"56","理由":""}],[{"id":"57","理由": ""}],[{"id":"58","理由":""}],[{"id":"59","理由":""}],[{"id":" 60","理由":""}],[{"id":"61","理由":""}],[{"id":"62","理由":""}],[{"id":"63","理由":""}],[{"id":"74","理由":""}],[{"id":"75" ,"理由":""}],[{"id":"80","理由":""}],[{"id":"81","理由":""}],[{ "id":"87","理由":""}],[{"id":"88","理由":""}],[{"id":"90","理由": ""}],[{"id":"91","理由":""}],[{"id":"105","理由":""}],[{"id":" 106","理由":""}],[{"id":"107","理由":""}],[{"id":"108","理由":""}],[{"id":"110","理由":""}],[{"id":"111","理由":""}],[{"id":"119 "、"理由":""}]]:

これが私のコントローラーの始まりです。

 [HttpPost]
    public ActionResult AbsentReason(string jsonstring)
    {            
        return View("Index");
    }

jsonstring パラメータは常に null です。誰が何が間違っているかを見ることができますか?

アップデート

これは、モデルを使用し、MVC が私のために作業できるようにするためのコメントに基づいた新しいコントローラーです。

 [HttpPost]
    public ActionResult AbsentReason(IEnumerable<VMAttendance> jsonstring)
    {            
        return View("Index");
    }

そして私のビューモデル

public class VMAttendance
{
    public int PersonID
    {
        get;
        set;
    }
    public string Reason
    {
        get;
        set;
    }
}

パラメータはまだヌルです。また、正しいjsonを送信するためにjQueryを更新します。

   var data = $('table').find('tr').map(function () {
                var id = $(this).attr('id');
                var reason = $(this).find('input').val();

                var rowdata = { "PersonID": id, "Reason": reason };
                return rowdata;
            }).get();


            $.ajax({
                url: '@Url.Action("AbsentReason", "Attendance")',
                data: data,
                type: 'POST',
                traditional: true,
                contentType: 'json',
                success: function (data) {
                    $('#message').html("Reason was updated");
                }
            });

テストjsonをコントローラーに送信しようとしましたが、パラメーターはまだnullです。

var data = '{"PersonID":"6","Reason":""},{"PersonID":"7","Reason":""}'
4

3 に答える 3

3

contentType を「json」から「application/json;」に変更することで、これが機能しました。charset=utf-8' ヘッダーのテーブルの余分な tr から作成された json の最初の空のオブジェクトを削除します。jsonは次のように見えました

[{},{"PersonID":"6","Reason":""},{"PersonID":"7","Reason":""}]

いつこのように見えるべきか

[{"PersonID":"6","Reason":""},{"PersonID":"7","Reason":""}]

私のコントローラーはこのように見え、うまく機能します。

  [HttpPost]
    public ActionResult AbsentReason(IEnumerable<VMAttendance> jsonstring)
    {            
        return View("Index");
    }

Duy さん、ご協力ありがとうございます。

于 2013-11-13T14:02:52.407 に答える
1

ajax オブジェクトの contentType を文字列に変更します。

JSONをオブジェクトではなく文字列として扱いたい理由が知りたいです。通常、C# ビューモデルを用意し、シリアライザーに json オブジェクトをコントローラーの C# ビュー モデルにマップさせます。

于 2013-11-12T03:12:36.563 に答える