Cómo pasar un objeto complejo a ASP.NET WebAPI OBTENER de jQuery ajax llamada?


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

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

Que quiero pasar a un ASP.NET MVC4 Controlador 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;
  }
}

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 "filter" en el ASP.NET el método del controlador es "null". Si lo cambio a un POST el objeto de filtro se pasa correctamente. ¿Hay alguna manera de pasar un objeto complejo a un GET?

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

Author: abatishchev, 2013-04-04

2 answers

Después de encontrar esta pregunta/respuesta de StackOverflow

El tipo complejo obtiene null en un parámetro ApiController

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

 33
Author: ChrisP,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 11:46:24

Si agrega datos json a la cadena de consulta y los analiza más tarde en el lado de la api web. puede analizar objetos complejos. Es útil en lugar de publicar el estilo de objeto 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;
    }
}
 4
Author: Bes Ley,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-05-14 10:00:54