Эквивалент UserControl в MVC3? - PullRequest
       23

Эквивалент UserControl в MVC3?

18 голосов
/ 27 января 2011

На веб-формах у нас есть UserControls. Эти элементы управления имеют программный код и могут использоваться в различных проектах / решениях, не зависящих от других вещей.

Я хочу создать элемент управления, который отображает некоторые элементы управления и содержит ссылки, которые "инициируют событие". Я хочу, чтобы они не были прикреплены на моем сайте, я хочу иметь возможность использовать тот же «контроль» на другом сайте. Что такое эквивалент в MVC? Можно ли скомпилировать представление с контроллером и использовать DLL в другом месте?

Ответы [ 2 ]

17 голосов
/ 27 января 2011

Ближайшим функциональным эквивалентом многократно используемых пользовательских элементов управления в стиле WebForms в MVC являются html-помощники. HTML-помощник - это метод, который возвращает некоторую разметку. Рекомендуемый подход состоит в том, чтобы реализовать их в форме методов расширения off HtmlHelper или какого-либо другого свойства страницы MVC:

public static IHtmlString MyControl(this HtmlHelper helper, string value) {
    return new HtmlString("<p>" + value + "</p>");
}

Вы можете напрямую добавить этот метод в проект MVC или добавить его в отдельную библиотеку классов. Единственная вещь, на которую должна ссылаться библиотека классов - это System.Web.Mvc.dll для ссылки HtmlHelper (может понадобиться и System.Web.dll, если вы используете больше типов).

Вы обычно вызываете их из своего представления следующим образом (в этом примере используется синтаксис Razor, новый в MVC 3)

@Html.MyControl("my value")

Несмотря на то, что поверхностные HTML-помощники генерируют разметку так же, как пользовательские элементы управления, существуют значительные различия. Наиболее важным из них является то, что представления MVC не имеют концепции жизненного цикла страницы WebForms. Это означает, что в отличие от пользовательских элементов управления, HTML-помощники отображаются за один проход. В WebForms нет нескольких этапов, таких как Init, Load, Render и т. Д., Где вы можете подключать события на стороне сервера для взаимодействия с другими элементами управления на странице.

В зависимости от того, о каких конкретно видах событий вы говорите, могут быть подходящие MVC-ориентированные методы для решения вашей задачи. Не могли бы вы предоставить более подробную информацию о том, что вы хотите сделать? Html помощники могут быть довольно мощными. Например, встроенные элементы управления вводом MVC, такие как TextBoxFor, могут подключать проверку на стороне клиента и т. Д.

3 голосов
/ 27 января 2011

Поскольку в MVC "события" не существуют в том же смысле, что и в WebForms, удовлетворить все ваши требования будет довольно сложно.

Для уровня пользовательского интерфейса эквивалента UserControl следует использовать PartialView, возможно расположенный в папке Views / Shared / Templates, в зависимости от того, хотите ли вы, чтобы он был связан с определенным типом модели.

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

Чтобы использовать эти функции в различных проектах, вам необходимо скопировать и контроллер, и шаблон / частичное представление. Следует признать, что повторно использовать пользовательский элемент управления из WebForms может быть не так просто, но это ограничение, которое сопровождается четким разделением интересов, и это было бы очевидно в хорошо спроектированном, основанном на уровнях уровне Приложение WebForms также.

Обновление в ответ на комментарий об "ограничении" разделения интересов, которое я упомянул:
Контроллер, конечно, может быть распределен в отдельной сборке со своей собственной тестовой сборкой и т. Д. Однако, включая сборку контроллера (или сборки) и , частичное представление / шаблон с внешним кодом, возможно, является еще одним что нужно сделать (то есть, возможно, не удастся сделать), чем просто скопировать пользовательский элемент управления с его выделенным кодом (которые хранятся рядом друг с другом).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...