Подтвердить что ты не робот

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

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

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

4b9b3361

Ответ 1

Ближайшим функционалом, эквивалентным пользовательским элементам многопользовательского стиля WebForms в MVC, являются html-помощники. Html helper - метод, который возвращает некоторую разметку. Рекомендуемый подход - реализовать их в виде методов расширения 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, могут подключать проверку на стороне клиента и т.д.

Ответ 2

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

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

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

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

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