如何将复杂对象传递给ASP.NET WebApi从jQuery ajax调用GET?
问题描述:
我在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?
我不想将参数分离出来,因为会有一些参数会导致效率低下,很难有可选参数,这样即使新建了方法签名也会保持不变参数被添加。
答
找到这个问题的StackOverflow后/回答
Complex type is getting null in a ApiController parameter
在控制器方法[FromBody]属性必须[FromUri]由于GET不具有体。在此更改之后,“过滤器”复杂对象正确传递。
答
如果将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
这里给出的答案解决了我所遇到的同类问题。 –
2016-09-08 06:30:48