复杂types在ApiController参数中变为空

我不知道为什么我的参数“ParametroFiltro Filtro”变为空,其他参数“page”和“pageSize”变好。

public class ParametroFiltro { public string Codigo { get; set; } public string Descricao { get; set; } } 

我的ApiController获取方法:

 public PagedDataModel<ParametroDTO> Get(ParametroFiltro Filtro, int page, int pageSize) 

我的ajax电话:

 var fullUrl = "/api/" + self.Api; $.ajax({ url: fullUrl, type: 'GET', dataType: 'json', data: { Filtro: { Codigo: '_1', Descricao: 'TESTE' }, page: 1, pageSize: 10 }, success: function (result) { alert(result.Data.length); self.Parametros(result.Data); } }); 

您正在尝试使用GET方法发送一个复杂的对象。 这是失败的原因是GET方法不能有一个正文,所有的值都被编码到URL中。 您可以使用[FromUri]来完成这项工作,但首先您需要更改您的客户端代码:

 $.ajax({ url: fullUrl, type: 'GET', dataType: 'json', data: { Codigo: '_1', Descricao: 'TESTE', page: 1, pageSize: 10 }, success: function (result) { alert(result.Data.length); self.Parametros(result.Data); } }); 

这种方式[FromUri]将能够直接从URL中获取复杂的对象属性,如果您更改您的操作方法,如下所示:

 public PagedDataModel<ParametroDTO> Get([FromUri]ParametroFiltro Filtro, int page, int pageSize) 

你以前的方法宁愿使用POST方法,它可以有一个正文(但是你仍然需要使用JSON.stringify()来将正文格式化为JSON)。

在进行ajax调用时提供contentType属性。 使用JSON.stringify方法构build要发布的JSON数据。 将types更改为POST ,MVC Model绑定会将发布的数据绑定到您的类对象。

 var filter = { "Filtro": { "Codigo": "_1", "Descricao": "TESTE" }, "page": "1", "pageSize": "10" }; $.ajax({ url: fullUrl, type: 'POST', dataType: 'json', contentType: 'application/json', data: JSON.stringify(filter), success: function (result) { alert(result.Data.length); self.Parametros(result.Data); } }); 

如果将json数据追加到查询string,并稍后在web api端进行parsing。 你也可以parsing复杂的对象。 这是有用的,而不是发布JSON对象,espeicaly在一些特殊的httpget需求的情况下。

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

也可以通过Newtonsoft.Json.Linq JObject来访问POSTvariables。

例如,这个POST:

 $.ajax({ type: 'POST', url: 'URL', data: { 'Note': note, 'Story': story }, dataType: 'text', success: function (data) { } }); 

可以像这样在APIController中访问:

 public void Update([FromBody]JObject data) { var Note = (String)data["Note"]; var Story = (String)data["Story"]; }