2013-04-04 4 views
32

Ich habe folgendes komplexes Objekt in JavaScript, die Filteroptionen enthältWie übergebe ich ein komplexes Objekt an ASP.NET WebApi GET von jQuery ajax call?

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

, die ich auf eine ASP.NET MVC4 WebAPI Controller übergeben wollen

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

GET mit einem jQuery Ajax-Aufruf

var request = $.ajax({ 
    url: http://mydomain.com/case, 
    type: 'GET', 
    data: JSON.stringify(filter), 
    contentType: 'application/json; charset=utf-8', 
    cache: false, 
    dataType: 'json' 
}); 

Das "Filter" -Objekt in der ASP.NET-Controller-Methode ist "null". Wenn ich es in einen POST ändere, wird das Filterobjekt korrekt übergeben. Gibt es eine Möglichkeit, ein komplexes Objekt an ein GET zu übergeben?

Ich möchte nicht die Parameter auf die URL trennen, da es eine Anzahl von ihnen geben wird, die es ineffizient machen würde, wäre es schwer, optionale Parameter zu haben, und auf diese Weise bleibt die Methodensignatur konstant, auch wenn neu Parameter werden hinzugefügt.

+0

Die Antwort hier gelöst die gleiche Art von Problem, das ich hatte.

Antwort

4

Wenn Sie JSON-Daten an die Abfragezeichenfolge anhängen und später in der WebApi-Seite analysieren. Sie können komplexe Objekte analysieren. Es ist nützlich, anstatt JSON Objekt Stil nach. Das ist meine Lösung.

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

Nichts für ungut, aber das sieht sehr hacky und schwer zu testen – dotnetguy

Verwandte Themen