receive net frombody from form example data body asp c# ajax json asp.net-web-api http-get

c# - net - web api post json



Cómo pasar objetos complejos a ASP.NET WebApi GET desde jQuery ajax call? (2)

Tengo el siguiente objeto complejo en JavaScript que contiene opciones de filtro

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

que quiero pasar a un controlador ASP.NET MVC4 WebApi OBTENER

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

usando una llamada 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'' });

El objeto "filtro" en el método de controlador ASP.NET es "nulo". Si lo cambio a un POST, el objeto de filtro se pasa correctamente. ¿Hay alguna forma de pasar un objeto complejo a un GET?

No quiero separar los parámetros en la URL ya que habrá una cantidad de ellos que lo haría ineficiente, sería difícil tener parámetros opcionales, y de esta manera la firma del método se mantiene constante incluso si se agregan nuevos parámetros.


Después de encontrar esta pregunta / respuesta de

Tipo complejo obtiene nulo en un parámetro ApiController

el atributo [FromBody] en el método del controlador debe ser [FromUri] ya que un GET no tiene un cuerpo. Después de este cambio, el objeto complejo "filtro" se pasa correctamente.


Si anexa datos json a la cadena de consulta, y los analiza más adelante en el lado de la API web. puedes analizar objetos complejos. Es útil en lugar de estilo de objeto post json. Esta es mi solución.

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