复杂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"]; }
- 在ASP.NET MVC中:从Razor视图调用Controller Action Method的所有可能的方法
- 如何检查请求是否通过CodeIgniter中的AJAX进行?
- X-Requested-With头是什么意思?
- WebSockets协议vs HTTP
- JSF / PrimeFaces ajax请求上的会话超时和ViewExpiredException处理
- 如何从AJAX调用返回数组?
- 为什么人们把代码如“扔1; 在json响应面前,“<dont be evil>”和“for(;;);”
- 在ASP.NET WebForms中使用jQuery调用“WebMethod”
- 为特定请求禁用ajaxStart()和ajaxStop()