У меня есть jQuery DataTable , настроенный для обработки на стороне сервера на сервере ASP.NET MVC.
Чтобы добиться прогрессивного улучшения, HTML-таблица визуализируется, а затем обновляется до DataTable. Когда DataTable выполняет AJAX-вызов для получения большего количества данных, он ожидает, что элементы возвращенного JSON будут коррелировать с существующим макетом столбца таблицы.
Это , кажется, вызывает некоторое архитектурное трение, потому что:
Во время начального отображения страницы:
- Контроллер преобразует данные базы данных в DTO и устанавливает модель ViewData.
- ViewPage преобразует модель ViewData в HTML с помощью HtmlHelper и т. Д.
Обновления Duriung AJAX:
- Контроллер преобразует данные базы данных в данные ячейки таблицы с гиперссылками и т. Д.
- DataTable отображает возвращенные данные непосредственно в ячейки таблицы.
Суть в том, что Контроллер теперь вынужден знать о макете рендеринга таблицы, когда его ответственность должна быть ограничена передачей DTO.
Что такое правильный шаблон здесь? Как мне поддерживать вызовы AJAX и придерживаться принципала единой ответственности в контроллере?
Некоторая ясность:
У моего DTO есть три свойства:
public class AccountListing
{
public int Id { get; set; }
public string AccountCode { get; set; }
public string AccountName { get; set; }
}
Отображаемая таблица данных имеет четыре столбца:
+--------------+--------------+------+------+
| Account Code | Account Name | View | Edit |
+--------------+--------------+------+------+
| 12345 | FooBar Inc. | Link | Link |
+--------------+--------------+------+------+
ViewPage отображает DTO с 3 свойствами в таблицу с 4 столбцами.
Если контроллер передает обратно то же свойство DTO, что и AJAX JSON, то таблица данных жалуется на отсутствующие столбцы ... таблица данных ожидает, что возвращенный JSON будет представлять элементы ячейки, а не исходные данные.
В настоящее время я решаю эту проблему, используя преобразования массива jQuery и пользовательский рендеринг таблиц, что эффективно дублирует логику ViewPage.
Есть ли альтернатива?