1
votes

Passez le tableau d'objets au contrôleur par jQuery AJAX, les données d'action sont toujours nulles dans ASP.NET Core 2.2 MVC - cela fonctionne avec .NET Framework 4.5

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


0 commentaires

3 Réponses :


0
votes

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


2 commentaires

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



0
votes

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

3.Résultat: entrez la description de l'image ici

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>


0 commentaires

1
votes

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


0 commentaires