Je travaille dans un projet dont j'ai besoin pour utiliser un appel ajax pour enregistrer les données d'objet de ma page contenant les détails de la commande. Lorsque j'utilise un projet avec .NET Framework version 4.5, cela fonctionne très bien - mais lorsque j'utilise ASP.NET Core MVC, cela ne fonctionne pas. Avez-vous de l'aide, s'il vous plaît?
J'ai tout essayé dans des questions similaires, mais cela n'a pas fonctionné. Par exemple, j'utilise la notation [frombody]
- mais j'ai toujours le même problème.
J'ai l'action de contrôleur suivante:
public class T_POS_ENT_ORDER_DETIALS_Temp { public string LocPrice { get; set; } public string LocProductID { get; set; } public string discount { get; set; } public string posNumber { get; set; } public string productName { get; set; } public int productQynt { get; set; } }
Et j'ai l'appel ajax suivant:
var DATA = []; DATA.push({ LocPrice: "12" }); DATA.push({ LocProductID: "1002" }); DATA.push({ discount: "0" }); DATA.push({ posNumber: "1" }); DATA.push({ productName: "soap" }); DATA.push({ productQynt: "1" }); $.ajax({ url: '/AjaxT_POS_ENT_ORDER/CreateOrders', data: JSON.stringify({ 'billArray': DATA }), contentType: "application/json; charset=utf-8", dataType: "json", type: "POST", async: false, success: OnSuccess, });
J'ai aussi cette classe:
public ActionResult CreateOrders([FromBody] T_POS_ENT_ORDER_DETIALS_Temp []T_POS_ENT_ORDER_Data) { GRepository<T_POS_ENT_ORDER_DETIALS_Temp> t_pos_ent_orderOpr = new GRepository<T T_POS_ENT_ORDER_DETIALS_Temp>(); T_POS_ENT_ORDER_Data.order_Date = DateTime.Now; t_pos_ent_orderOpr.Add(T_POS_ENT_ORDER_Data); return Json(new { msg = "Successfully added " }); }
Il n'y a pas erreur indiquant uniquement les détails de la commande est toujours nulle ...
3 Réponses :
Je ne vois pas de tableau dans vos données, il n'y a qu'un seul objet avec quelques champs. De plus, billArray
ne correspond pas à T_POS_ENT_ORDER_Data
, et la liaison de modèle se fait par correspondance de nom.
Pour résoudre ce problème, vous devez ajuster votre code pour ne publier et recevoir qu'un seul objet .:
public ActionResult CreateOrders(T_POS_ENT_ORDER_DETIALS_Temp T_POS_ENT_ORDER_Data) ... var DATA = { LocPrice: "12", LocProductID: "1002", discount: "0", posNumber: "1", productName: "soap", productQynt: "1" }); $.ajax({ url: '/AjaxT_POS_ENT_ORDER/CreateOrders', data: JSON.stringify(DATA), contentType: "application/json; charset=utf-8", dataType: "json", type: "POST", async: false, success: OnSuccess });
Mineure, il y a une faute de frappe dans le nom de la classe "DETIALS" -> "DETAILS".
J'ai fait tout ce que vous avez dit mais l'objet est toujours nul lorsque je fais le débogage dans le contrôleur
Essayez de réduire l'objet transmis à une seule chaîne, revenez directement aux bases et construisez à partir de là. DATA = "XXX" et dans votre contrôleur, utilisez [HttpPost] CreateOrders (string thing) etc ...
Vous devez changer JSON.stringify ({'billArray': DATA})
en JSON.stringify (DATA)
comme ci-dessous:
1.Afficher:
DATA.push({ LocPrice: "12",LocProductID: "1002" ,discount: "0",posNumber: "1" ,productName: "soap",productQynt: "1"});
2.Contrôleur :
[HttpPost] public ActionResult CreateOrders([FromBody] T_POS_ENT_ORDER_DETIALS_Temp[] T_POS_ENT_ORDER_Data) { //your logic... return Json(new { msg = "Successfully added " }); }
Au fait, si vous voulez les transmettre comme un objet tableau au lieu de six tableaux, vous devez changer vos données comme ci-dessous: p >
<script> $(document).ready(function () { var DATA = []; DATA.push({ LocPrice: "12" }); DATA.push({ LocProductID: "1002" }); DATA.push({ discount: "0" }); DATA.push({ posNumber: "1" }); DATA.push({ productName: "soap" }); DATA.push({ productQynt: "1" }); $.ajax({ url: '/AjaxT_POS_ENT_ORDER/CreateOrders', data: JSON.stringify(DATA), contentType: "application/json; charset=utf-8", dataType: "json", type: "POST", async: false }); }); </script>
Je travaille dans .Net Core 3.1 et cela fonctionne pour moi:
1. Contrôleur
Essayez [FromForm] à la place de [FromBody final
var DATA = []; DATA.push({ LocPrice: "12", LocProductID: "1002", discount: "0", posNumber: "1", productName: "soap", productQynt: "1" }); DATA.push({ LocPrice: "23", LocProductID: "1003", discount: "0", posNumber: "1", productName: "shampoo", productQynt: "1" }); DATA.push({ LocPrice: "7",LocProductID: "1004" ,discount: "0",posNumber: "2" ,productName: "sponge",productQynt: "2"}); $.post( '@Url.Content("~/home/CreateOrdersPOSTObject")', { "prm": DATA }, function () { alert( "success" ); }) .fail(function() { alert( "error" ); });
2. Appel AJAX
Ni JSON.stringfy () ni contentType ne doivent être utilisés.
var DATA = []; DATA.push({ LocPrice: "12", LocProductID: "1002", discount: "0", posNumber: "1", productName: "soap", productQynt: "1" }); DATA.push({ LocPrice: "23", LocProductID: "1003", discount: "0", posNumber: "1", productName: "shampoo", productQynt: "1" }); DATA.push({ LocPrice: "7",LocProductID: "1004" ,discount: "0",posNumber: "2" ,productName: "sponge",productQynt: "2"}); $.ajax({ url: '@Url.Content("~/home/CreateOrdersPOSTObject")', data: { "prm": DATA }, type: "POST", dataType: "json", async: true });