Pertanyaan Bagaimana cara melewati objek yang kompleks ke ASP.NET WebApi GET dari jQuery ajax call?


Saya memiliki objek kompleks berikut di JavaScript yang berisi opsi filter

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

yang ingin saya sampaikan ke ASP.NET MVC4 WebApi controller 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;
  }
}

menggunakan panggilan 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'
});

Objek "filter" dalam metode pengontrol ASP.NET adalah "null". Jika saya mengubahnya menjadi POST objek filter dilewatkan dengan benar. Apakah ada cara untuk meloloskan objek yang kompleks ke GET?

Saya tidak ingin memisahkan parameter ke URL karena akan ada sejumlah dari mereka yang membuatnya tidak efisien, akan sulit untuk memiliki parameter opsional, dan dengan cara ini tanda tangan metode tetap konstan bahkan jika parameter baru ditambahkan.


32
2018-04-04 14:31


asal


Jawaban:


Setelah menemukan pertanyaan / jawaban StackOverflow ini

Jenis kompleks semakin nol dalam parameter ApiController

atribut [FromBody] pada metode pengontrol harus [FromUri] karena GET tidak memiliki badan. Setelah ini mengubah objek kompleks "filter" dilewatkan dengan benar.


32
2018-04-04 16:40



Jika Anda menambahkan data json ke string kueri, dan parse nanti di sisi web api. Anda dapat menguraikan objek yang kompleks. Ini lebih bermanfaat daripada memposting gaya objek json. Ini adalah solusi saya.

//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
2018-05-14 10:00