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