Каков правильный шаблон AJAX для использования jQuery DataTable с ASP.NET MVC?

У меня есть jQuery DataTable, настроенный для обработки на стороне сервера на сервере ASP.NET MVC.

Для достижения прогрессивного улучшения таблица HTML визуализируется, а затем обновляется до DataTable. Когда DataTable выполняет вызов AJAX для получения дополнительных данных, он ожидает, что элементы возвращенного JSON будут коррелировать с существующим макетом столбца таблицы.

Это кажется причиной некоторых архитектурных разногласий, потому что:

Во время начального рендеринга страницы:

  • Контроллер преобразует данные базы данных в DTO и устанавливает модель ViewData.
  • ViewPage преобразует модель ViewData в HTML с помощью HtmlHelper и т. д.

Во время обновлений AJAX:

  • Контроллер преобразует данные базы данных в данные ячеек таблицы с гиперссылками и т. д.
  • DataTable визуализирует возвращенные данные непосредственно в ячейки таблицы.

Дело в том, что контроллер теперь вынужден знать о макете рендеринга таблицы, тогда как его ответственность должна ограничиваться передачей обратно DTO.

Какой здесь правильный шаблон? Как поддерживать вызовы AJAX и придерживаться принципа единой ответственности в контроллере?


Некоторая ясность:

Мой DTO имеет три свойства:

public class AccountListing
{
    public int Id { get; set; }
    public string AccountCode { get; set; }
    public string AccountName { get; set; }
}

Визуализированная DataTable имеет четыре столбца:

+--------------+--------------+------+------+
| Account Code | Account Name | View | Edit |
+--------------+--------------+------+------+
| 12345        | FooBar Inc.  | Link | Link |
+--------------+--------------+------+------+

ViewPage отображает DTO с 3 свойствами в таблицу с 4 столбцами. Если контроллер возвращает те же 3 свойства DTO, что и AJAX JSON, таблица данных жалуется на отсутствующие столбцы... таблица данных ожидает, что возвращенный JSON будет представлять элементы ячейки, а не исходные данные.

В настоящее время я решаю это, используя преобразования массива jQuery и настраиваемый рендеринг таблицы, который эффективно дублирует логику ViewPage.

Есть ли альтернатива?


person Mark    schedule 17.11.2010    source источник
comment
ViewModel — это не DTO, поэтому добавьте логику для создания ссылок.   -  person DarrellNorton    schedule 06.12.2010
comment
Вы можете сделать это, используя github.com/mcintyre321/mvc.jquery.datatables, см. Настройка отображения столбцов в вики   -  person mcintyre321    schedule 26.07.2016


Ответы (1)


Ваше текущее решение (выполнение рендеринга на стороне клиента) звучит хорошо для меня.

Дело в том, что ваши DTO не обязательно должны соответствовать тому, что отображается на ваших страницах просмотра. Популярным шаблоном для таких ситуаций являются объекты ViewModel.

Например :

public class AccountListingViewModel {
    public string AccountCode { get; set; }
    public string AccountName { get; set; }
    public string ViewLink { get; set; }
    public string EditLink { get; set; }
    public static AccountListingViewModel FromAccountListing(AccountListing o) {
        AccountListingViewModel returnObj = new AccountListingViewModel();
        //populate the properties from the parameter
        return returnObj;
    }
}

См. [viewmodel], [модель-просмотр-просмотра].

person Çağdaş Tekin    schedule 19.11.2010
comment
Когда вы добавляете поведение, DTO (объект передачи данных) больше не является DTO. ViewModel не является DTO, поэтому добавление поведения — это нормально, просто не называйте его DTO. - person DarrellNorton; 06.12.2010