Сложный тип становится нулевым в параметре 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);
    }
});

Ответы на вопрос(4)

Решение Вопроса

Вы пытаетесь отправить сложный объект с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).

 sming10 февр. 2016 г., 22:12
Похоже, вы должны украсить каждый комплексный параметр с помощью [FromUri]. Я попытался украсить контроллер безрезультатно (без исключений, просто безрезультатно), и это позор. Если кто-то найдет другое, пожалуйста, кричите.
 Mark Pieszak - Trilon.io17 дек. 2014 г., 18:28
Спасибо, работал как шарм.[FromUri] это все что мне нужно! Странно, что это даже нужно явно там ... Я думаю, что веб-API предположил бы, что это в Uri, так как этоGET
 tpeczek16 окт. 2012 г., 16:28
@ user1344968 Добро пожаловать.
 sming10 февр. 2016 г., 21:24
еще раз спасибо Интересно, что имя параметра сложного объекта (в данном случае «Filtro») не должно передаваться в запросе - очень нелогично. Интересно, что произойдет, если у вас есть подобъекты с полями с одинаковыми именами (или списком объектов) - возможно, это будет сгенерировано?
 will16 окт. 2012 г., 16:27
Сейчас это сработало, много ткс. Я потратил впустую все это утро, пытаясь решить это.

Newtonsoft.Json.Linq JObject.

Например, это 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"];
}
 Shimmy22 февр. 2018 г., 14:38
Могу ли я добиться этого как метод GET? В моем сценарии мне не нужноUpdate, Мне необходимоGet на основе гипотетического сложного объекта со всеми его свойствами.

е на стороне веб-API. Вы также можете разобрать сложный объект. Это полезно, а не публиковать объект json, особенно в некоторых особых случаях требования 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;
        }
    }

Предоставить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);
    }
});

Ваш ответ на вопрос