ASP.Net MVC - что заменяет события для поддержки слабой связи?

Какие функции ASP.Net MVC могут заменить способ использования событий в веб-формах для поддержки слабосвязанных компонентов?

Например, возьмем простой элемент управления пейджером в Webforms:

  1. Нажимается номер страницы
  2. Пейджер запускает событие «PageChange» с новым номером страницы.
  3. Эта подписывающаяся страница / элемент управления получила событие и обрабатывает инициирование вызова для выборки и привязки новых данных.

Какие инструменты доступны в ASP.Net MVC для аналогичной поддержки

  • Слабая связь
  • Возможность повторного использования компонентов
  • Разделение логики для одной страницы / представления (такая очень сложная страница типа «портал»).

person James    schedule 01.04.2010    source источник
comment
RenderAction (...) здесь ваш друг.   -  person mxmissile    schedule 01.04.2010
comment
Возможно, это первый раз, когда веб-формы были описаны как слабо связанные ...   -  person womp    schedule 01.04.2010
comment
mxmisile, спасибо за подсказку. Я изучу это подробнее. Womp - бесполезно. События - это метод, который можно использовать для создания слабой связи компонентов. Веб-формы построены вокруг событий.   -  person James    schedule 01.04.2010


Ответы (2)


MVC избавляется от событий, потому что события по большей части являются просто ненужным слоем между тем, что клиент пытается сказать серверу, и тем, что сервер фактически это делает.

В примере разбивки на страницы для веб-форм клиент нажимает кнопку, браузер отправляет событие / состояние просмотра, а движок запускает событие ButtonClicked. Вы исследуете событие, определяете, что клиент намеревается открыть страницу, и выполняете логику разбиения на страницы.

В парадигме MVC пользователь нажимает кнопку, которая делает запрос непосредственно к коду, который выполняет логику разбиения на страницы. Поскольку вы знаете, какое действие должна вызывать кнопка, когда вы помещаете ее туда, зачем выполнять все махинации срабатывания события? В вашем контроллере вы, конечно, можете запустить событие, когда получите команду, но я, честно говоря, не могу представить себе вариант использования для этого.

Оба метода выполняют одно и то же, но MVC просто устраняет слой сложности.

person jwsample    schedule 09.08.2010

ASP.NET MVC и модель-представление-контроллер в целом поддерживают слабую связь и разделение задач, сохраняя данные и код, поддерживающие приложение, отдельно от визуальной разметки «уровня представления», которую видят пользователи.

Правильно спроектированные контроллеры и представления в MVC могут быть повторно использованы, так что представление редактирования для объекта можно «встроить» в связанный вид без каких-либо изменений.

Например: представление заказов может включать частичное представление OrdersDetail. Это частичное представление можно заменить представлением редактирования OrderDetail, которое также доступно в другом месте в приложении.

Отделение модели от представления делает модульное тестирование более эффективным и менее громоздким за счет отделения кода от контекста уровня представления. Вам не нужно ссылаться на System.Web на код модульного теста, который извлекает данные из базы данных.

person Dave Swersky    schedule 01.04.2010
comment
Спасибо за ответ, Дэйв. Итак, я получил представление о частичном просмотре. Я до сих пор не понимаю, как могут быть сделаны слабосвязанные компоненты. На примере пейджера, как его можно использовать для страниц заказов в одном экземпляре и пользователей в другом без большого количества повторяющегося кода C #? Я уверен, что должен быть способ (особенно с фреймворком, который гордится кодированием Don't Repeat Yourself) - я просто пока этого не вижу. - person James; 01.04.2010
comment
См. blog.wekeroad.com/2007/12/10/aspnet -mvc-pagedlistt, чтобы получить быстрый пример того, как это можно сделать. Вместо того, чтобы ваша модель была List ‹Order›, вы могли бы вернуть PagedList ‹Order› и логику того, сколько страниц может содержаться в реализации PagedList. Затем вы можете создать общий партиал, связанный с PagedList. - person Jab; 01.04.2010
comment
Спасибо, Jab - это интересный код, помогающий с разбиением по страницам в MVC. Однако я пытаюсь разобраться не в самой подкачке страниц, а в том, как можно разработать слабосвязанные компоненты для использования в рамках MVC. Даже с этим образцом кода я не стал мудрее. - person James; 01.04.2010
comment
Я думаю, вы, возможно, пытаетесь сопоставить концепцию компонента из мира веб-форм с MVC. MVC на самом деле не реализует компоненты так же, как веб-формы. Ближе всего были бы помощники HTML. - person Dave Swersky; 02.04.2010
comment
ОК - так скажем с нашим примером пейджера. У нас есть частичное представление, содержащее пейджер, используемый как в представлении списка пользователей, так и в представлении заказа. Как мы можем написать код (используя HTML Helpers или любой другой инструмент, доступный в MVC), чтобы получить привязку правильного списка при нажатии ссылки на страницу в частичном представлении? - person James; 02.04.2010
comment
@James, вот пример написанного мной помощника html, который использует PagedList: codejunkies.se/post/2009/03/19/Page-selector-html-helper.aspx. - person Mattias Jakobsson; 02.04.2010
comment
Что касается того, как вы знаете, как связать правильный список, здесь все совершенно по-другому. Каждая ссылка будет переходить к своему собственному контроллеру, поэтому нет шансов, что они перепутаются. - person jwsample; 09.08.2010