C# 如何通过jQuery ajax调用将复杂对象传递给ASP.NET WebApi GET?
我有以下JavaScript中的复杂对象,其中包含过滤器选项C# 如何通过jQuery ajax调用将复杂对象传递给ASP.NET WebApi GET?,c#,ajax,json,asp.net-web-api,http-get,C#,Ajax,Json,Asp.net Web Api,Http Get,我有以下JavaScript中的复杂对象,其中包含过滤器选项 var filter={caseIdentifiter:'GFT1',userID:'2'}; 我想将其传递给ASP.NET MVC4 WebApi控制器获取 [HttpGet] public IEnumerable<JHS.Repository.ViewModels.CaseList> Get([FromBody]Repository.InputModels.CaseListFilter filter) { try
var filter={caseIdentifiter:'GFT1',userID:'2'};
我想将其传递给ASP.NET MVC4 WebApi控制器获取
[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;
}
}
ASP.NET控制器方法中的“筛选器”对象为“null”。如果我将其更改为POST,则过滤器对象将正确传递。有没有办法将复杂对象传递给GET
我不想将参数分离到URL中,因为会有很多参数,这会导致效率低下,很难有可选参数,这样即使添加了新参数,方法签名也会保持不变。找到此StackOverflow问题/答案后
控制器方法上的[FromBody]属性必须是[FromUri],因为GET没有主体。更改后,将正确传递“filter”复杂对象。如果将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;
}
}
//javascript文件
var数据={UserID:“10”,UserName:“Long”,AppInstanceID:“100”,ProcessGUID:“BF1CC2EB-D9BD-45FD-BF87-939DD8FF9071”};
var request=JSON.stringify(数据);
请求=编码组件(请求);
doAjaxGet(“/ProductWebApi/api/Workflow/StartProcess?data=”,请求,函数(结果){
window.console.log(结果);
});
//webapi文件:
[HttpGet]
公共响应结果启动过程()
{
动态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);
字符串userName=queryJson.userName.Value;
}
//效用函数:
公共静态动态ParseHttpGetJson(字符串查询)
{
如果(!string.IsNullOrEmpty(查询))
{
尝试
{
var json=query.Substring(7,query.Length-7);//separate?data=characters
json=System.Web.HttpUtility.UrlDecode(json);
动态queryJson=JsonConvert.DeserializeObject(json);
返回queryJson;
}
捕获(System.e例外)
{
抛出新的ApplicationException(“无法将对象反序列化为错误的字符串内容!”,e);
}
}
其他的
{
返回null;
}
}
恕我冒犯,但这看起来非常粗糙且难以测试这里给出的答案解决了我遇到的同一类问题。
//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;
}
}