ASP MVC Ajax Controller шаблон?

В моем приложении MVC есть много вызовов ajax (через JQuery.get()). Мне кажется, что мой контроллер усеян множеством крошечных методов, которые вызываются через ajax. Мне кажется, что это как-то вроде разбиение шаблона MVC - теперь контроллер становится скорее компонентом доступа к данным, чем маршрутизатором URI.

Я реорганизую так, что у меня есть свой "истинный" контроллер для страницы, просто выполняющей стандартные ответы маршрутизации (сохранение объектов ActionResponse). Таким образом, вызов /home/, очевидно, приведет к запуску класса HomeController, который будет реагировать каноническим способом контроллера, возвращая представление простой jane.

Затем я переместил свой материал ajax в новый класс контроллера, имя которого я предваряю "Ajax". Так, например, моя страница может иметь три разных раздела функциональности (например, корзина покупок или учетная запись пользователя). У меня есть контроллер ajax для каждого из них (AjaxCartController, AjaxAccountController). На самом деле нет ничего особенного в том, чтобы переместить материал ajax-вызова в его собственный класс контроллера - это просто сохранить вещи более чистыми. очевидно, что на стороне клиента JQuery будет использовать этот новый контроллер:

//jquery pseudocode call to specific controller that just handles ajax calls
$.get('AjaxAccount/Details'....

(1) есть лучший шаблон в MVC для ответа на вызовы ajax?

(2) Мне кажется, что модель MVC немного просачивается, когда дело доходит до ajax - это не "контролирующий" материал. Это просто лучший и наименее болезненный способ обработки аякс-вызовов (или я не знаю)?

Другими словами, абстракция "Контроллер" не кажется приятной с Ajax (по крайней мере, с точки зрения шаблонов). Что-то мне не хватает?

Ответ 1

Пока вы можете положить Controller в конец этого, чтобы сделать работу с магией маршрутизации ASP.NET MVC, я, как правило, делаю то, что вы уже сделали - за исключением случаев, когда я читаю AjaxCartController, я думаю себе AjaxCartPresenter (как в шаблоне Model-View-Presenter, обычно встречающемся в WinForms). То есть, этот "контроллер" не контролирует, а вместо этого бессовестно привязан к интерфейсу представления. Но, в отличие от представления, презентатор controller можно проверить.

Когда мы AJAXify веб-страницы, мы превращаем ее во что-то, что может реагировать мелкозернистым образом, поэтому мелкозернистые методы в порядке. Облицованная зернистость - это точка и вся причина, по которой она была изобретена. Мы намеренно уходим из REST для конкретного сценария, потому что эта конкретная модель не решает требования пользовательского интерфейса, вместо этого выбирает RPC-подобную модель. Это всего лишь шаблоны, в любой ситуации они не будут лучше других, даже если наш стек технологий может подталкивать нас к одному другому. (Действительно, сам HTTP делает лучше в кусках/страницах/сущностях/документах переноса состояния представления.)

Мысленно, вы можете рассматривать эти страницы так, как если бы они были формами в приложении WinForms; тот факт, что эти методы располагаются в "контролере", является всего лишь артефактом и уступкой к используемой технологии. (Если это супер-пупер вас беспокоит, вы можете свернуть методы AJAX в IHttpHandler и полностью обходить MVC, но зачем выбрасывать автоматический поиск маршрутов/инстанцирования/методов и затруднять для себя? Это было бы архитектурно "чистым" "и чисто, но с сомнительной выгодой.)

... по крайней мере, как я его рационализирую =)

Ответ 2

Если у вас слишком много мелких запросов, вы можете захотеть, чтобы один из методов Action Control выполнял все вызовы. Вы можете использовать "переключатель" в методе, чтобы определить тип вызова и обслуживать его соответственно, вместо того, чтобы иметь миллион крошечных методов. Вы даже можете использовать явные строковые константы вместо чисел для переменной switch.