Хорошо, давайте предположим, что мы работаем с ASP.NET MVC 2 (последний и самый лучший предварительный просмотр) и хотим создать пользовательский интерфейс AJAX с помощью jQuery. Каковы наши реальные варианты здесь?
Опция 1 - передать Json из контроллера в представление, а затем представление отправит Json обратно в контроллер. Это означает (в указанном порядке):
- Пользователь открывает некоторое представление (скажем, - / Invoices / January ), которое должно визуализировать список данных (например,
<IEnumerable<X.Y.Z.Models.Invoice>>
)
- Контроллер извлекает модель из хранилища (при условии, что мы используем шаблон хранилища).
- Контроллер создает новый экземпляр класса, который мы будем сериализовать в Json. Причина, по которой мы это делаем, заключается в том, что модель не может быть сериализуемой (циклическая ссылка ftl )
- Контроллер заполняет класс, который скоро будет сериализован, данными
- Контроллер сериализует класс Json и передает его в представление.
- Пользователь вносит некоторые изменения и отправляет «форму»
- Представление отправляет обратно Json контроллеру
- Контроллер теперь должен «вручную» проверять ввод, поскольку переданный Json не привязывается к модели
Посмотрите, если наш View взаимодействует с контроллером через Json, мы теряем проверку модели, что, по моему мнению, является невероятным недостатком. В этом случае забудьте о аннотациях данных и прочем.
Вариант 2 - Хорошо, альтернатива первого подхода - передать Модели в Представления, что является поведением по умолчанию в шаблоне при запуске нового проекта.
- Передаем строго типизированную модель на просмотр
- Представление отображает соответствующий html и javascript, придерживаясь имен свойств модели. Это важно!
- Пользователь отправляет форму. Если мы придерживаемся названий моделей, когда мы
.serialize()
заполняем форму и отправляем ее в контроллер, она сопоставляется с моделью.
- Нет карт Json. Представленная форма напрямую привязана к строго типизированной модели, следовательно, мы можем использовать проверку модели. Например. мы сохраняем бизнес-логику там, где она должна быть.
Проблема с этим подходом заключается в том, что если мы проведем рефакторинг некоторых Моделей (изменим имена свойств, типы и т. Д.), Написанный нами javascript станет недействительным. Нам придется вручную рефакторинг скриптов и надеяться, что мы что-то не упустим. Вы также не сможете проверить это.
Хорошо, вопрос в том, как написать внешний интерфейс AJAX, который поддерживает проверку бизнес-логики в модели (например, контроллер передает и получает тип модели), но в то же время не портит JavaScript и HTML, когда мы проведем рефакторинг модели?