【问题标题】:How to pass complex object to ASP.NET WebApi GET from jQuery ajax call?如何从 jQuery ajax 调用将复杂对象传递给 ASP.NET WebApi GET?
【发布时间】:2013-03-26 16:50:24
【问题描述】:

我在 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 的参数分开,因为会有很多参数会使其效率低下,很难有可选参数,这样即使有新参数,方法签名也会保持不变已添加。

【问题讨论】:

  • 这里给出的答案解决了我遇到的同类问题。 stackoverflow.com/questions/15622852/…>

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


【解决方案1】:

找到这个 StackOverflow 问题/答案后

Complex type is getting null in a ApiController parameter

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

【讨论】:

    【解决方案2】:

    如果您将 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;
        }
    }
    

    【讨论】:

    • 没有冒犯,但这看起来很老套,很难测试
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-09
    • 2016-06-12
    相关资源
    最近更新 更多