2013-04-04 57 views
32

我在JavaScript中有下列复杂的对象包含过滤选项如何将复杂对象传递给ASP.NET WebApi从jQuery ajax调用GET?

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

,我想传递给ASP.NET MVC4的WebAPI控制器使用jQuery的Ajax调用

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

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控制器方法中的“过滤器”对象为“null”。如果我将它更改为POST,则过滤器对象正确传递。有没有办法将一个复杂的对象传递给GET?

我不想将参数分离出来,因为会有一些参数会导致效率低下,很难有可选参数,这样即使新建了方法签名也会保持不变参数被添加。

+0

这里给出的答案解决了我所遇到的同类问题。 2016-09-08 06:30:48

回答

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; 
    } 
} 
+4

没有冒犯,但这看起来非常冒险,很难测试 – dotnetguy 2016-04-04 11:35:01