Строковые параметры веб-API и значения POST

Я использую плагин jQuery, jTable. Плагин имеет следующую функцию для загрузки таблицы:

$('#PersonTable').jtable('load', { CityId: 2, Name: 'Halil' });

Значения в функции загрузки отправляются как данные POST. Плагин также отправляет два параметра строки запроса (jtStartIndex, jtPageSize) через URL-адрес для разбиения таблицы на страницы.

Пример в документации показывает функцию того, как справиться с этим в ASP.NET MVC, но не в веб-API. Пример < / а>:

[HttpPost]
public JsonResult StudentListByFiter(string name = "", int cityId = 0, int jtStartIndex = 0, int jtPageSize = 0, string jtSorting = null)
{
    try
    {
        //Get data from database
        var studentCount = _repository.StudentRepository.GetStudentCountByFilter(name, cityId);
        var students = _repository.StudentRepository.GetStudentsByFilter(name, cityId, jtStartIndex, jtPageSize, jtSorting);

        //Return result to jTable
        return Json(new { Result = "OK", Records = students, TotalRecordCount = studentCount });
    }
    catch (Exception ex)
    {
        return Json(new { Result = "ERROR", Message = ex.Message });
    }
}

Как сейчас выглядит моя функция: она работает нормально, за исключением того, что мне не удается прочитать данные POST (параметр имени):

public dynamic ProductsList(string name = "", int jtStartIndex = 0, int jtPageSize = 0 )
{
    try
    {
        int count = db.Products.Count();
        var products = from a in db.Products where a.ProductName.Contains(name) select a;
        List<Product> prods = products.OrderBy(x => x.ProductID).ToList();
        return (new { Result = "OK", Records = prods, TotalRecordCount = count });
    }
    catch (Exception ex)
    {
        return (new { Result = "ERROR", Message = ex.Message });
    }
}

Моя загрузка jTable: (это вызывается, когда пользователь вводит текст во вход)

$('#ProductTable').jtable('load', {
    name: $('#prodFilter').val()
});

Я был бы признателен за любую помощь в том, как читать как строковые параметры в URL-адресе, так и данные POST в функции веб-API.


РЕДАКТИРОВАТЬ: Я использовал альтернативный способ отправки данных в API. Вместо отправки его в функции загрузки, отформатированной как JSON, я использовал функцию для listAction и отправил данные через URL-адрес (подробности см. В справке по API jTable):

listAction: function (postData, jtParams) {
    return $.Deferred(function ($dfd) {
        $.ajax({
            url: 'http://localhost:53756/api/Product/ProductsList?jtStartIndex=' + jtParams.jtStartIndex + '&jtPageSize=' + jtParams.jtPageSize + '&name=' + $('#prodFilter').val(),
            type: 'POST',
            dataType: 'json',
            data: postData,
            success: function (data) {
                $dfd.resolve(data);
            },
            error: function () {
                $dfd.reject();
            }
        });
    });
}

Чтобы перезагрузить таблицу на основе отфильтрованных результатов:

$('#ProductTable').jtable('load');

Вместо этого:

$('#ProductTable').jtable('load', {
    name: $('#prodFilter').val()
});

person user2148965    schedule 27.07.2014    source источник
comment
Попадает ли запрос на сервер? Связаны ли параметры jtStartIndex / jtPageSize?   -  person James    schedule 27.07.2014
comment
Да, я могу без проблем прочитать оба параметра jtStartIndex / jtPageSize в своей функции. Я не могу прочесть только имя.   -  person user2148965    schedule 27.07.2014


Ответы (1)


Попробуйте применить атрибут [FromBody] к параметру имени

public dynamic GetProductList([FromBody]string name = "", int jtStartIndex = 0, jtPageSize = 0)
{
    ...
}

Связыватель по умолчанию в веб-API будет искать в URI простые типы, такие как строка, указание атрибута FromBody заставит его искать в теле.

person James    schedule 27.07.2014
comment
Я только что добавил [FromBody] к параметру имени, но теперь получаю: XMLHttpRequest не может загружаться ... Заголовок «Access-Control-Allow-Origin» отсутствует ... в консоли. У меня раньше возникала эта проблема для всех вызовов, но мне удалось решить ее с помощью этого ответа: ссылка. Спасибо за вашу помощь Джеймс - person user2148965; 27.07.2014
comment
@ user2148965 - это отдельная проблема, это означает, что вы отправляете сообщения в другой домен. Если [FromBody] решила вашу проблему, вы должны отметить это как ответ для других пользователей. - person James; 28.07.2014
comment
Приношу свои извинения, если я не понял. Когда я добавляю [FromBody] перед параметром имени, я получаю только заголовок No 'Access-Control-Allow-Origin'. Проблема присутствует. Если я удалю его, он будет работать на 100% с кодом, который я добавил в свой исходный вопрос. Я хотел бы знать, почему это создает проблему. - person user2148965; 28.07.2014
comment
@ user2148965 не может понять, почему этот атрибут может вызвать это, эта ошибка обычно связана с выполнением вызовов AJAX в разные домены. - person James; 01.08.2014