复杂类型在ApiController参数中变为null

wil*_*ill 51 c# ajax json asp.net-web-api

我不知道为什么我的参数"ParametroFiltro Filtro"变为空,其他参数"page"和"pageSize"正常.

public class ParametroFiltro
{
    public string Codigo { get; set; }
    public string Descricao { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

我的ApiController获取方法:

public PagedDataModel<ParametroDTO> Get(ParametroFiltro Filtro, int page, int pageSize)
Run Code Online (Sandbox Code Playgroud)

我的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);
    }
});
Run Code Online (Sandbox Code Playgroud)

tpe*_*zek 81

您正在尝试使用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);
    }
});
Run Code Online (Sandbox Code Playgroud)

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

public PagedDataModel<ParametroDTO> Get([FromUri]ParametroFiltro Filtro, int page, int pageSize)
Run Code Online (Sandbox Code Playgroud)

你以前的方法宁愿使用POST可以有一个主体的方法(但是你仍然需要使用JSON.stringify()将主体格式化为JSON).

  • 谢谢,工作就像一个魅力.`[FromUri]`就是我所需要的!奇怪的是它甚至明确地需要它......我认为Web API会假设它在Uri中,因为它是一个'GET` (3认同)

Shy*_*yju 6

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

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);
    }
});
Run Code Online (Sandbox Code Playgroud)

  • `POST` 请求将建议在后端修改某些实体/集合。 (2认同)