web-dev-qa-db-fra.com

JSON d'objet de matrice de publication ASP.NET Core

J'essaye de poster un tableau d'Object de mon point de vue dans mon contrôleur mais les paramètres sont nuls. J'ai vu que pour un simple objet, je dois mettre [FromBody] dans l'action de mon contrôleur.

Voici mon 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"
    }
  ]
}

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

Voici mon action:

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

Voici ma classe:

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

Toute aide est appréciée :)

7
Shikei

Au lieu d'utiliser ReceiveTime[] rt, il peut être préférable de modéliser les données selon la même structure que celle que vous avez postée. Par exemple, vous pouvez créer une classe qui ressemble à ceci:

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

Je ne sais pas si MesJours a du sens en tant que nom de classe (je ne parle pas français), mais l'idée est toujours claire: vous pouvez nommer la classe comme bon vous semble.

Compte tenu de cela, vous pouvez mettre à jour votre contrôleur de la manière suivante:

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

Cela satisferait le classeur de modèle ASP.NET MVC et devrait vous donner les données que vous avez POSTées. Cela présente également l’avantage supplémentaire de pouvoir accueillir facilement toutes les propriétés supplémentaires que vous souhaitez POST.

7
Kirk Larkin

1.Ajouter une classe, Mesjours:

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

2.Et dans l'action du contrôleur, changez le type de retour en tâche asynchrone (pour aspnetcore)

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

3.dans la vue, assurez-vous que les données postées ont le même nom que le paramètre dans l'action du contrôleur (dans ce cas, mesJourData). Prenez note de la syntaxe de la ligne contenant le paramètre de données dans la méthode ajax

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