web-dev-qa-db-fra.com

jQuery publie la valeur null au lieu de JSON dans l'API Web ASP.NET

Je n'arrive pas à faire en sorte que ça fonctionne ... J'ai un jQuery comme celui-ci sur le client:

$.ajax({
    type: "POST",
    url: "api/report/reportexists/",
    data: JSON.stringify({ "report":reportpath }),
    success: function(exists) {
        if (exists) {
            fileExists = true;
        } else {
            fileExists = false;
        }
    }
});

Et dans mon contrôleur Web.API, j'ai une méthode comme celle-ci:

[HttpPost]
public bool ReportExists( [FromBody]string report )
{
    bool exists = File.Exists(report);
    return exists;
}

Je vérifie simplement pour voir si un fichier vit sur le serveur, et pour retourner un booléen pour savoir si c'est le cas ou non. La chaîne de rapport que j'envoie est un chemin UNC. Reportpath ressemble donc à '\\ some\path \'.

Je peux bien exécuter le script et atteindre un point d'arrêt dans ma méthode ReportExists, mais la variable de rapport est toujours nulle.

Qu'est-ce que je fais mal?

Je vois aussi un moyen de publier avec .post et postJSON. Peut-être que je devrais en utiliser un? Si oui, quel serait mon format?

Mise à jour: Un indice supplémentaire peut-être- si je supprime [FromBody], mon point d'arrêt ne sera pas touché du tout- «Aucune ressource http correspondant à la demande n'a été trouvée». Les exemples que je regarde montrent que [FromBody] n'est pas nécessaire ...?

14
Nicros

J'ai donc trouvé le problème et la solution. Alors, première chose en premier. Le contentType ne peut pas être 'application/json', il doit être vide (par défaut, application/x-www-form-urlencoded je crois). Bien qu'il semble que vous deviez envoyer JSON, mais sans nom dans la paire nom-valeur. L'utilisation de JSON.stringify gâche également cela. Donc, le code de travail complet jQuery est comme ceci:

$.ajax({
    type: "POST",
    url: "api/slideid/reportexists",
    data: { "": reportpath },
    success: function(exists) {
        if (exists) {
            fileExists = true;
        } else {
            fileExists = false;
        }
    }
});

Du côté Web.API, vous DEVEZ avoir l'attribut [FromBody] sur le paramètre, mais à part cela, c'est plutôt standard. Le vrai problème (pour moi) était le post.

Dans Fiddler, le corps de la requête ressemblait à ceci "=% 5C% 5Croot% 5Cdata% 5Creport.html"

Ce post a vraiment eu la réponse, et lié à this article qui était également très utile.

25
Nicros

jQuery.ajax() définit par défaut le contentType sur application/x-www-form-urlencoded. Vous pouvez envoyer la demande en application/json à la place. En outre, vous devez envoyer vos données sous forme de chaîne et le modèle sera lié au paramètre report pour votre méthode de publication:

$.ajax({
    type: "POST",
    url: "api/report/reportexists/",
    contentType:  "application/json",
    data: JSON.stringify(reportpath),
    success: function(exists) {
        if (exists) {
            fileExists = true;
        } else {
            fileExists = false;
        }
    }
});
12
Maggie Ying

Cela a fonctionné pour moi, toutes les autres approches n'ont pas:

function addProduct() {
        var product = { 'Id': 12, 'Name': 'Maya', 'Category': 'newcat', 'Price': 1234 };             
        $.ajax({
            type: "POST",
            url: "../api/products",
            async: true,
            cache: false,
            type: 'POST',
            data: product,
            dataType: "json",
             success: function (result) {

            },
            error: function (jqXHR, exception) {
                alert(exception);
            }
        });
    }

Du côté serveur:

 [HttpPost]
    public Product[] AddNewProduct([FromBody]Product prod)
    {
        new List<Product>(products).Add(prod);
        return products;
    }
6
user3596399

Si vous utilisez l'attribut FromBody de MVC, le classeur MVC considère cela comme un paramètre facultatif. Cela signifie que vous devez être explicit sur les noms de paramètre même si vous ne disposez que d'un seul paramètre FromBody.

Vous devriez être capable de travailler avec quelque chose d'aussi simple que ceci:

Manette:

[HttpPost]
public bool ReportExists( [FromBody]string report )
{
    bool exists = File.Exists(report);
    return exists;
}

Javascript :

$.ajax({
    type: "POST",
    url: "api/report/reportexists/",
    data: { "report":reportpath },
    success: function(exists) {
    ...

Vous devez vous assurer que votre objet de données dans jQuery correspond aux noms de paramètre de vos contrôleurs exactement.

0
abbottdev

$ .post a été utile pour moi. Supprimez le [FromBody] de l’API Web et indiquez l’URL dans le paramètre URL du client $ .post dans jQuery. Ça a marché!

0
Pratik Patel