AJAX и jQuery с MVC

Как вы упорядочиваете свои контроллеры, методы, представления при использовании модели MVC с jQuery с большим количеством бит AJAX?

Вопрос 1

У вас есть отдельный контроллер только для вызовов AJAX или вы смешиваете методы AJAX вместе со своими обычными методами, отличными от AJAX, в одном контроллере?

Вопрос 2

Если вы должны смешивать методы AJAX и не-AJAX в одном контроллере, у вас есть отдельные методы AJAX и не AJAX, или вы объединяете их (если возможно) и передаете значение (NULL или AJAX) который определяет, возвращается ли обычный просмотр или представление AJAX обратно в браузер.

Вопрос 3

Если у вас есть 50 различных вызовов AJAX, и для каждого вызова требуется метод, который, в свою очередь, требует представления, мы получаем контроллер с 50 методами и 50 видами. Это хорошая практика MVC? Я могу думать обо всех методах AJAX в контроллере, разделяющих один вид, где файл представления содержит условия условных операторов, а файлу представления передается параметр, который определяет, какой из 50 случаев будет использоваться. Вид вроде сжатия 50 просмотров на 1.

Вопрос 4

Вместо того, чтобы иметь так много просмотров (50 просмотров), что вы думаете о том, чтобы повторять вывод в методе контроллера, а не в представлении? Таким образом, у нас не будет так много просмотров.

Кстати, я использую фреймворк CodeIgniter для моей модели MVC

Ответ 1

Вопрос 1

Я смешиваю код ajax и non-ajax в одном контроллере. Таким образом, ваш код в общем месте легко найти.

Вопрос 2

Я комбинирую метод ajax и non-ajax вместе. Легче использовать javascript Progressive Enhancement, чтобы люди, не имеющие javascript, все равно отправляли на один и тот же контроллер

Вопрос 3

У вас не должно быть 1 контроллера с 50 методами. У вас должен быть контроллер на кусок функциональности. Таким образом, пользовательский контроллер, контроллер Foo, контроллер бара, поэтому вы можете в итоге создать 10 контультеров по 5 методов. Таким образом, методы относятся к классам, специфичным для их функции. У меня разные взгляды, а не один большой взгляд. Вы не должны использовать LOGIC внутри представления, чтобы определить, что отображается, это задание контроллера. Но некоторые контроллеры/методы могут возвращать то же представление, что и другие методы.

Вопрос 4

Или контроллер должен НИКОГДА не выводить HTML. Используйте для этого представления, которые являются целым кукольным MVC, чтобы отделять проблемы Code (controllers from) Views (render). Несколько раз мои взгляды просто возвращают JSON или XML, а затем я использую Javascript-шаблоны для обновления DOM. В других случаях мои представления возвращают HTML. Например, функция сохранения в форме. Возможно, просто верните логическое значение, если оно будет успешным. Тогда мой Javascript скроет или покажет DIV в зависимости от ответа.

Ответ 2

Вопрос 1 - Отдельный контроллер для AJAX. Если вы используете сервлеты, вам следует использовать новую поддержку сервлета 3.0 для поддержки async.

http://www.javaworld.com/javaworld/jw-02-2009/jw-02-servlet3.html?page=2

Вопрос 2 - Поскольку мы используем отдельный контроллер, это неприменимо.

Вопрос 3 - Вы видите сценарий, в котором у вас есть 50 уникальных вызовов без дублирования функций? Хотя у вас есть 50 вызовов AJAX, на стороне сервера может быть много повторного использования для обслуживания этих запросов. Таким образом, 50 вызовов не равны 50 методам. Вы можете обернуть каждый запрос командой и выполнить ее соответствующим образом, а не в противном случае, которое может выйти из-под контроля.

Вопрос 4 - 50 вызовов может не равняться 50 просмотрам. Вам также нужно снова использовать его. Вам нужно выделить компоненты просмотра и собрать их. Откидывается до дизайна.

Ответ 3

Когда вы делаете вызов JQuery AJAX, jQuery добавляет HTTP-заголовок X-Requested-With, который вы можете использовать, чтобы определить, является ли данный запрос AJAX-запросом или нет. Имея это в виду, очень часто имеет смысл делиться одним и тем же действием контроллера между AJAX и традиционными запросами, создавать модель, а затем визуализировать представление с этой моделью для традиционных запросов или отвечать сериализованным представлением JSON той же модели для AJAX запросы.