webentwicklung-frage-antwort-db.com.de

JSON: ASP.NET-Kernbuchungs-Array-Objekt

Ich versuche, ein Array von Objekten aus meiner Sicht in meinem Controller zu posten, aber Params sind null. Ich habe gesehen, dass ich für ein einfaches Objekt [FromBody] in meine Controller-Aktion einfügen muss.

Hier ist mein 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"
    }
  ]
}

Hier ist meine Ajax-Anfrage:

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();
        }
    });
}

Hier ist meine Aktion:

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

Hier ist meine Klasse:

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

Jede Hilfe wird geschätzt :)

7
Shikei

Anstatt ReceiveTime[] rt zu verwenden, ist es möglicherweise besser, die Daten gemäß derselben Struktur zu modellieren, die Sie POST verwenden. Sie können beispielsweise eine Klasse erstellen, die folgendermaßen aussieht:

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

Ich weiß nicht, ob MesJours als Klassenname sinnvoll ist (ich spreche kein Französisch), aber die Idee ist immer noch klar - Sie können der Klasse einen beliebigen Namen geben.

Aus diesem Grund könnten Sie Ihren Controller folgendermaßen aktualisieren:

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

Dies würde die ASP.NET-MVC-Modellmappe befriedigen und Ihnen die Daten geben, die Sie gepostet haben. Dies hat auch den zusätzlichen Vorteil, dass zusätzliche Eigenschaften, die Sie POST wünschen, problemlos aufgenommen werden können.

7
Kirk Larkin

Der Name in der Ajax-js-Anforderung muss mit dem Namen des Parameters vom Back-End-Controller übereinstimmen.

Versuchen Sie, die Methodensignatur im Controller wie folgt zu aktualisieren:

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

Auch wenn ich die französische Sprache mag, möchte ich Ihnen vorschlagen, Englisch für die Benennung von Variablen zu verwenden. Bitte sei trotzdem nicht beleidigt, aber es ist wirklich empfehlenswert.

1
Florinache

1. Fügen Sie eine Klasse hinzu, Mesjours:

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

2.Und in der Controller-Aktion ändern Sie den Rückgabetyp in async Task (für Aspnetcore)

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

3. Stellen Sie in der Ansicht sicher, dass die gesendeten Daten denselben Namen haben wie der Parameter in der Controller-Aktion (in diesem Fall mesJourData). Beachten Sie die Syntax der Zeile mit den Datenparametern in der Ajax-Methode

$.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