Список параметров ModelBinding в MVC

Я пытаюсь использовать jQuery Datatables 1.10 с обработкой на стороне сервера и ASP.NET MVC 5. К сожалению, Datatables 1.10 выполняет запись на сервер путем сериализации сложной иерархии объектов в строку параметров (Content-Type: application/x-www-form-urlencoded), что нарушает MVC ModelBinder.

Есть ли способ в MVC связать сложные иерархии объектов в виде сериализованного списка параметров? Возможно, пользовательский ModelBinder, который кто-то написал?

Замечания:

настройка traditional = true в ajax вызов не работает, потому что это не поддерживает иерархии объектов. Я получаю что-то вроде:

draw=1&
columns=[object Object]&
columns=[object Object]&
order=[object Object]&
start=0&
length=10&
search=[object Object]

Если данные были отправлены DataTables как JSON, то я предполагаю, что все будет хорошо. Проблема связана с тем, что данные отправляются в виде списка параметров.

Также обратите внимание

Код для подключения к столу:

$("#serverTable").DataTable({
    serverSide: true,
    ajax: {
        url: '/Home/GetTableData',
        type: 'POST'
    }
});

3 ответа

Решение

Отказ от ответственности: я являюсь автором упомянутого проекта DataTables.MVC на GitHub

Проблема с DataTables 1.10 (новый API) заключается в том, что его структура запросов не полностью совместима с механизмом привязки ASP.NET MVC.

Вы можете либо написать свой собственный механизм связывания, либо вручную обработать каждый отдельный параметр, отправленный из DataTables внутри вашей QueryString (GET) или Form (POST). Вы можете переопределить его для поддержки других методов.

Вся идея моего проекта - помочь вам снова и снова обрабатывать параметры запроса. Просто установите переплет и используйте модель: https://github.com/ALMMa/datatables-mvc

На самой первой странице проекта на GitHub приведен пример кода как для настройки подшивки, так и для обработки упорядочения / сортировки столбцов.


Как описано в проекте, информация сортировки, отправляемая DataTables, полезна в некоторых случаях (прямая команда SQL), но может быть не очень хороша, если вы используете статические списки / перечисления или обычный linq (хотя вы можете использовать Dynamic Linq для помощи в этот).


Сегодня я только что добавил новый код, чтобы помочь вам настроить / расширить обычное связующее или создать более удобное связующее JSON и помочь получить отфильтрованные / отсортированные столбцы прямо из модели.

Я столкнулся с той же проблемой несколько дней назад, и решение довольно простое. Вы можете прочитать здесь больше об этом.

Вам просто нужно передать функцию в качестве обратного вызова для свойства данных ajax. Функция обратного вызова возвращает данные в виде строки JSON:

var opts =
    {
        'ajax'    :
        {
            'url': 'serverSideTableProviderPage',
            'type': 'POST',
            'contentType': 'application/json; charset=utf-8',
            'data':function(data)
             {
                   return data = JSON.stringify(data);
             }
        },
        'pagingType': 'simple',
        [more options ...]
    }
$('table').dataTable(opts);

Данные теперь отправляются как Json, и ModelBinder будет заполнять свойства вашего глубоко вложенного объекта. Не забудьте установить для contentType "application/json; charset=utf-8"

Попробуйте это: https://github.com/ALMMa/datatables-mvc

Это пользовательская реализация ModelBinder для нового ввода DataTable 1.10. Я только что обнаружил это вчера, и я все еще работаю над своей реализацией. Так что я не могу сказать, насколько хорошо это работает; Я не достиг точки тестирования. Но это выглядит хорошо, и я планирую использовать его.

Другие вопросы по тегам