Comment passer un object complexe à ASP.NET WebApi GET depuis un appel ajax jQuery?

J’ai l’object complexe suivant en JavaScript qui contient des options de filtrage

var filter={caseIdentifiter:'GFT1',userID:'2'}; 

que je veux transmettre à un contrôleur ASP.NET MVC4 WebApi GET

 [HttpGet] public IEnumerable Get([FromBody]Repository.InputModels.CaseListFilter filter) { try { return Case.List(filter); } catch (Exception exc) { //Handle exception here... return null; } } 

en utilisant un appel jQuery ajax

 var request = $.ajax({ url: http://mydomain.com/case, type: 'GET', data: JSON.ssortingngify(filter), contentType: 'application/json; charset=utf-8', cache: false, dataType: 'json' }); 

L’object “filtre” de la méthode du contrôleur ASP.NET est “null”. Si je le change en POST, l’object filtre est correctement transmis. Existe-t-il un moyen de passer un object complexe à un GET?

Je ne veux pas séparer les parameters de l’URL, car il y en aura un certain nombre qui le rendrait inefficace, il serait difficile d’avoir des parameters facultatifs et, de cette manière, la signature de la méthode rest constante même si de nouveaux parameters sont ajoutés.

Après avoir trouvé cette question / réponse StackOverflow

Le type complexe devient nul dans un paramètre ApiController

l’atsortingbut [FromBody] sur la méthode du contrôleur doit être [FromUri] puisqu’un GET n’a pas de corps. Après cette modification, l’object complexe “filter” est correctement transmis.

Si vous ajoutez des données JSON à la chaîne de requête et que vous les parsingz plus tard, côté API Web. vous pouvez parsingr un object complexe. C’est utile plutôt que de poster un style d’object json. Ceci est ma solution.

 //javascript file var data = { UserID: "10", UserName: "Long", AppInstanceID: "100", ProcessGUID: "BF1CC2EB-D9BD-45FD-BF87-939DD8FF9071" }; var request = JSON.ssortingngify(data); request = encodeURIComponent(request); doAjaxGet("/ProductWebApi/api/Workflow/StartProcess?data=", request, function (result) { window.console.log(result); }); //webapi file: [HttpGet] public ResponseResult StartProcess() { dynamic queryJson = ParseHttpGetJson(Request.RequestUri.Query); int appInstanceID = int.Parse(queryJson.AppInstanceID.Value); Guid processGUID = Guid.Parse(queryJson.ProcessGUID.Value); int userID = int.Parse(queryJson.UserID.Value); ssortingng userName = queryJson.UserName.Value; } //utility function: public static dynamic ParseHttpGetJson(ssortingng query) { if (!ssortingng.IsNullOrEmpty(query)) { try { var json = query.Subssortingng(7, query.Length - 7); //seperate ?data= characters json = System.Web.HttpUtility.UrlDecode(json); dynamic queryJson = JsonConvert.DeserializeObject(json); return queryJson; } catch (System.Exception e) { throw new ApplicationException("can't deserialize object as wrong ssortingng content!", e); } } else { return null; } }