如何从jQuery ajax调用将复杂对象传递给ASP.NET WebApi GET?

时间:2013-04-04 14:31:42

标签: c# ajax json asp.net-web-api http-get

我在JavaScript中有以下复杂对象,其中包含过滤器选项

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

我想传递给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;
  }
}

使用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'
});

ASP.NET控制器方法中的“filter”对象为“null”。如果我将其更改为POST,则正确传递过滤器对象。有没有办法将复杂对象传递给GET?

我不想将参数分离到URL,因为会有一些参数会使它效率低下,很难有可选参数,这样即使新参数,方法签名也保持不变添加。

2 个答案:

答案 0 :(得分:35)

找到此StackOverflow问题/答案后

Complex type is getting null in a ApiController parameter

控制器方法的[FromBody]属性需要是[FromUri],因为GET没有正文。在此更改之后,正确传递“过滤器”复杂对象。

答案 1 :(得分:4)

如果将json数据附加到查询字符串,稍后在web api端解析它。你可以解析复杂的对象。它有用而不是发布json对象样式。这是我的解决方案。

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