web-dev-qa-db-ja.com

ASP.NET Core Posting Array Object JSON

ビュー内のObjectの配列をコントローラーに投稿しようとしていますが、paramsがnullであるため、コントローラーアクションに[FromBody]を配置する必要があるのは単純なオブジェクトだけです。

ここに私のJSONがあります:

{
  "monJour": [
    {
      "openTime": "04:00",
      "closedTime": "21:30",
      "id": "0"
    },
    {
      "openTime": "08:00",
      "closedTime": "17:30",
      "id": "1"
    },
    {
      "openTime": "08:00",
      "closedTime": "17:30",
      "id": "2"
    },
    {
      "openTime": "08:00",
      "closedTime": "17:30",
      "id": "3"
    },
    {
      "openTime": "08:00",
      "closedTime": "17:30",
      "id": "4"
    },
    {
      "openTime": "08:00",
      "closedTime": "17:30",
      "id": "5"
    },
    {
      "openTime": "08:00",
      "closedTime": "17:30",
      "id": "6"
    }
  ]
}

これが私のAjaxリクエストです:

function SendAllDay() {
    var mesJours = {};
    var monJour = [];
    mesJours.monJour = monJour;

    var senddata ='';

    $('div[id^="Conteneur"]').each(function () {
        var idDiv = $(this).attr("id");
        var jour = idDiv.substr(9, idDiv.length - 9);
        var opentps = $("#O" + jour).val();
        var closetps = $("#C" + jour).val();
        var monid = $("#id" + jour).val();

        monJour = {
            openTime: opentps,
            closedTime: closetps,
            id: monid
        }

        mesJours.monJour.Push(monJour);
    });

    $.ajax({
        url: '@Url.Action("ReceiveAll")',
        dataType: 'json',
        type: 'POST',
        //data: JSON.stringify(monJours),
        data: JSON.stringify(mesJours),
        contentType:'application/json',
        success: function (response) {
            console.log('ok');
            //window.location.reload();
        },
        error: function (response) {
            console.log('error');
            //alert(response)
            //window.location.reload();
        }
    });
}

私のアクションは次のとおりです。

[HttpPost]
public void ReceiveAll([FromBody]ReceiveTime [] rt) { }

これが私のクラスです:

public class ReceiveTime
{
    public string openTime { get; set; }
    public string closedTime { get; set; }
    public string id { get; set; }
}

どんな助けも大歓迎です:)

9
Shikei

ReceiveTime[] rtを使用する代わりに、POSTするのと同じ構造に従ってデータをモデル化することをお勧めします。たとえば、次のようなクラスを作成できます。

public class MesJours
{
    public ReceiveTime[] MonJour { get; set; }
}

MesJoursがクラス名として意味があるかどうかはわかりませんが(フランス語は話せません)、アイデアはまだ明確です-クラスには好きな名前を付けることができます。

これを前提として、次のようにコントローラーを更新できます。

[HttpPost]
public void ReceiveAll([FromBody] MesJours mesJours)
{
    // Access monJour via mesJours.
    var rt = mesJours.MonJour;
}

これにより、ASP.NET MVCモデルバインダーが満たされ、POSTしたデータが提供されます。これには、POSTしたい追加プロパティを簡単に収容できるという追加の利点もあります。

10
Kirk Larkin

Ajax jsリクエストの名前は、バックエンドコントローラーからのパラメーターの名前と一致する必要があります。

次のように、コントローラーのメソッドシグネチャを更新してみてください。

public void ReceiveAll([FromBody]ReceiveTime [] monJour)

また、フランス語は好きですが、変数の命名に英語を使用することをお勧めします。とにかく気分を害することはありませんが、本当にお勧めです。

1
Florinache

1.クラスMesjoursを追加します。

public class MesJours
{
    public ReceiveTime[] MonJour { get; set; }
}   

2.コントローラーのアクションで戻り値のタイプを非同期タスクに変更します(aspnetcoreの場合)

[HttpPost]
public async Task<IActionResult> ReceiveAll([FromBody]MesJours mesJourData)
{
    var rt = mesJourData.MonJour;
}

3.ビューで、投稿されたデータの名前がコントローラーアクションのパラメーター(この場合はmesJourData)と同じであることを確認します。 ajaxメソッドでdataパラメーターを含む行の構文に注意してください

$.ajax({
        url: '@Url.Action("ReceiveAll")',
        dataType: 'json',
        type: 'POST',
        data:{mesJourData: mesJours} ,
        contentType:'application/json',
        success: function (response) {
            console.log('ok');
            //window.location.reload();
        },
        error: function (response) {
            console.log('error');
            //alert(response)
            //window.location.reload();
        }
    });
0
Divine Dela