web-dev-qa-db-fra.com

Comment passer un objet complexe à ASP.NET WebApi GET à partir d'un appel ajax jQuery?

J'ai l'objet 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<JHS.Repository.ViewModels.CaseList> 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.stringify(filter),
  contentType: 'application/json; charset=utf-8',
  cache: false,
  dataType: 'json'
});

L'objet "filtre" de la méthode du contrôleur ASP.NET est "null". Si je le change en POST l'objet filtre est correctement passé. Y a-t-il un moyen de passer un objet complexe à un GET?

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

35
ChrisP

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

Le type complexe devient nul dans un paramètre ApiController

l'attribut [FromBody] de la méthode du contrôleur doit être [FromUri] puisqu'un GET n'a pas de corps. Après cette modification, l'objet complexe "filter" est correctement transmis.

36
ChrisP

Si vous ajoutez des données json à la chaîne de requête et que vous les analysez plus tard du côté de l’API Web. vous pouvez analyser un objet complexe. C'est utile plutôt que de post style json. Ceci est ma solution.

//javascript file 
var data = { UserID: "10", UserName: "Long", AppInstanceID: "100", ProcessGUID: "BF1CC2EB-D9BD-45FD-BF87-939DD8FF9071" };
var request = JSON.stringify(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);
    string userName = queryJson.UserName.Value;
}

//utility function:
public static dynamic ParseHttpGetJson(string query)
{
    if (!string.IsNullOrEmpty(query))
    {
        try
        {
            var json = query.Substring(7, query.Length - 7); //seperate ?data= characters
            json = System.Web.HttpUtility.UrlDecode(json);
            dynamic queryJson = JsonConvert.DeserializeObject<dynamic>(json);

            return queryJson;
        }
        catch (System.Exception e)
        {
            throw new ApplicationException("can't deserialize object as wrong string content!", e);
        }
    }
    else
    {
        return null;
    }
}
4
Bes Ley