Динамический объект WebApi не привязывается

Я пытаюсь отправить dynamic object в ApiController. Установив точку останова на строке return null, я вижу, что parameters всегда null.

Звонок AJAX:

$(':checkbox').click(function (event) {
    var values = $('input[type="checkbox"]:checked').map(function () {
        return $(this).val();
    }).toArray();

    var product = {
        Name: $('#name2').val(),
        Price: $('#price2').val(),
        Category: $('#category2').val()
    };

    $.ajax({
        type: 'GET',
        url: '/api/filter',
        data: JSON.stringify( product ),
        contentType: 'application/json',

        success: function (data) {
            //alert("succeeded");
        },
        error: function (err, data) {
            alert("Error " + err.responseText);
        }
    });

});

Controller:

[HttpGet]
public IEnumerable<Products> GetAllProducts(dynamic parameters)
{
    return null;
}

Любая идея, что я делаю неправильно здесь?


person Quoter    schedule 01.11.2013    source источник
comment
Я думаю, что в JSON должно быть что-то, говорящее, что объект, который вы передаете, называется parameters, чтобы автоматические вещи работали так, как вы ожидаете.   -  person Tim S.    schedule 01.11.2013
comment
Может быть, JSON.stringify( { parameters: product } ) подарит тебе что-нибудь.   -  person Tim S.    schedule 01.11.2013
comment
@ТимС. Я тоже пробовал, все равно ноль.   -  person Quoter    schedule 02.11.2013
comment
В ответ на ваш другой вопрос в комментарии ниже предполагается, что запрос GET не имеет тела, только параметры URL, поэтому привязка к телу не предпринимается.   -  person Gone Coding    schedule 17.01.2014
comment
@TrueBlueAussie, что вы имеете в виду под «не предполагается наличие тела»?   -  person Quoter    schedule 18.01.2014
comment
Я имел в виду данные тела. Определение запроса на получение состоит в том, чтобы получить ресурс, указанный URL-адресом. данные тела не требуются как часть запроса.   -  person Gone Coding    schedule 20.01.2014


Ответы (1)


РЕДАКТИРОВАТЬ: - Исходный ответ изменен с GET на POST.

Предполагая, что опубликованный вами код находится в FilterController, метод GetAll обычно не принимает параметров и используется для получения всех продуктов. Если вы хотите заполнить свою динамику там, вы должны изменить ее на POST вот так.

$.ajax({
        type: 'POST',
        url: '/api/filter/GetAllProducts,
        data: JSON.stringify( product ),
        contentType: 'application/json',

        success: function (data) {
            //alert("succeeded");
        },
        error: function (err, data) {
            alert("Error " + err.responseText);
        }
    });

затем украсьте свой контроллер атрибутом HttpPost

[HttpPost]
public IEnumerable<Products> GetAllProducts(dynamic parameters)
{
    return null;
}
person Excommunicated    schedule 01.11.2013
comment
Я тоже пробовал ваш вариант, он все еще нулевой. Вы правы насчет GetAll, но это был просто тест, чтобы получить некоторые данные в dynamic object. - person Quoter; 02.11.2013
comment
Хм... странно, пост сработал. Но почему не работает вызов GET? - person Quoter; 02.11.2013
comment
Этот код очень похож на тот, который мы используем. Поставьте точку останова перед вызовом ajax и проверьте JSON.stringify(product), если вы получаете нулевую публикацию. - person jones6; 02.11.2013
comment
я предполагаю, что это связано с привязкой модели по умолчанию в WebAPI и различиями между GET, имеющим параметры в URL-адресе, и POST, имеющим его как часть тела. Если вы хотите сохранить его как GET, вы должны просто посмотреть возврат IQueryable и использование операторов oData $filter $where etc и создание конечной точки oData - person Excommunicated; 02.11.2013
comment
У вас случайно нет ссылки (на учебник или что-то в этом роде) об этих oData $filter $where и т. д.? - person Quoter; 02.11.2013
comment
Вот ссылка на сообщение Джули Лерман из недавнего журнала MSDN. Есть и другие ссылки из этой статьи. msdn.microsoft.com/en-us/magazine/dn201742.aspx - person Excommunicated; 04.11.2013