2017-03-23 3 views
1

Ma méthode de commande avec WebApi2Comment envoyer un objet JSON en utilisant la méthode GET

[HttpGet] 
    public IEnumerable<Products> GetProducts(ProductSearchCriteria searchCriteria) 
    { 
     //searchCriteria is always null here!!! Why? 
     return db.Instance.LoadProducts(searchCriteria); 
    } 

Mes critères de recherche classe

public class ProductSearchCriteria 
{ 
    private int id; 
    private string name; 
    private DateTime createdOn; 

    [JsonProperty] 
    public string Name 
    { 
     get { return this.name; } 
     set { this.name = value; } 
    } 

    [JsonProperty] 
    public DateTime CreatedOn 
    { 
     get { return this.createdOn; } 
     set { this.createdOn = value; } 
    } 

    [JsonProperty] 
    public int ID 
    { 
     get { return this.id; } 
     set { this.id = value; } 
    } 
} 

Mon script dans la page html

<script> 
    $("#btnTest").on("click", function() { 
     var searchCriteria = {}; 
     searchCriteria.ID = 0; 
     searchCriteria.Name = ""; 
     //searchCriteria.CreatedOn = ""; 
     var url = "http://localhost:8080/api/products" 
     $.getJSON(url, searchCriteria).done(processResponse); 
    }); 

    function processResponse(response){ 
    } 
</script> 

J'arrive ma méthode de contrôleur (mode de débogage) mais le paramètre searchSearchriteria ProductSearchCriteria est toujours null. Comment puis-je envoyer mon objet JSON en utilisant la méthode get avec JQuery et WebApi2?

+0

Une requête GET ne doit pas avoir de corps car elle sera ignorée par le serveur, donc vous devez passer les données de la chaîne de requête en tant que paramètres simples et marquer le gestionnaire avec [FromUri] ou mieux, utilisez la méthode POST . – Gusman

Répondre

0

Vous envoyez la requête au serveur en utilisant $.getJSON(url, searchCriteria) et getJSONsends the searchCriteria as a url-encoded query string parce que vos critèreRech correspondraient à la définition d'un Côté serveur, la liaison par défaut des paramètres pour le serveur est la suivante: L'API Web .NET recherchera dans l'URL les types de données "simples" (par ex. int, double, string), sinon il retombera sur le contenu du corps.

Pour obtenir le modèle de l'API Web de liaison pour extraire un type complexe de l'URL, comme votre classe ProductSearchCriteria vous devez ajouter l'attribut [FromUri] en face du paramètre comme celui-ci:

[HttpGet] 
public IEnumerable<Products> GetProducts([FromUri] ProductSearchCriteria searchCriteria) {} 

Voir ici pour plus de détails Parameter Binding in ASP.NET Web API

Je dirais qu'il vaut la peine d'essayer de préserver la sémantique GET plutôt que de passer à POST, comme certains l'ont suggéré, parce que votre code est en train de faire efficacement ce qui ressemble à un lire opération et aussi longtemps que vous ne modifiez pas les données ou l'état ... un GET semble applicable.

0

Essayez ce code

[HttpGet] 
public IEnumerable<Products> GetProducts([FromUri]ProductSearchCriteria searchCriteria) 
{ 
    //searchCriteria is always null here!!! Why? 
    return db.Instance.LoadProducts(searchCriteria); 
} 
0

Vous pouvez essayer de décorer votre paramètre avec [FromUri].

[HttpGet] 
public IEnumerable<Products> GetProducts([FromUri] ProductSearchCriteria searchCriteria) 
{ 
    //searchCriteria is always null here!!! Why? 
    return db.Instance.LoadProducts(searchCriteria); 
} 

Une autre option consiste à stringifier votre objet JSON et à le dégonfler dans votre code côté serveur. Vous pouvez le faire en utilisant des convertisseurs tels que JSON.NET ou vous pouvez utiliser un convertisseur de type personnalisé, un classeur de modèle ou un fournisseur de valeur. Plus d'infos peut être trouvé here.

0

Utiliser un post plutôt:

$("#btnTest").on("click", function() { 
    var searchCriteria = {}; 
    searchCriteria.ID = 0; 
    searchCriteria.Name = ""; 
    //searchCriteria.CreatedOn = ""; 
    var url = "http://localhost:8080/api/products" 
    $.post(url, data, processResponse, 'json'); 

}); 

et changement attribut méthode:

[HttpPost] 
public IEnumerable<Products> GetProducts(ProductSearchCriteria searchCriteria)