Какой лучший способ реализовать пользовательские элементы управления в ASP.NET MVC?

Как и многие другие на этом сайте, я рассматриваю переход к ASP.NET MVC для будущих проектов. В настоящее время на моих сайтах работают традиционные веб-формы ASP.NET 2.0, и он работает нормально для нас, поэтому мой другой вариант - просто придерживаться того, что я знаю, и сделать переход на ASP.NET 3.5 со встроенным файлом AJAX.

Мне интересно, как работают пользовательские элементы управления в ASP.NET MVC. У нас есть тонны элементов управления .ASCX и несколько составных элементов управления. Когда я работаю с веб-дизайнерами, очень просто заставить их эффективно использовать элементы управления ASCX, даже без каких-либо знаний о программировании, чтобы иметь определенный плюс. Но тогда, конечно, недостатки - это жизненный цикл страницы, который может быть безумным, и тот факт, что элементы управления ASCX трудно разделить между разными проектами. Комбинированные элементы управления имеют общий доступ, но в основном черный ящик для дизайнера.

Какая модель в ASP.NET MVC? Есть ли способ создать элементы управления, которые решают проблемы, с которыми мы столкнулись, используя ASCX и составные элементы управления? Важным соображением является разрешение доступа к веб-дизайнерам без необходимости беспокоиться о нарушении кода.

Ответ 1

Чтобы реализовать пользовательский элемент управления, вы вызываете следующий вызов:

<% Html.RenderPartial("~/Views/Shared/MyControl.ascx", {data model object}) %>

Вы также можете увидеть старый синтаксис, который с PR5 уже недействителен

<%= Html.RenderUserControl("~/Views/Shared/MyControl.ascx", {data model object}) %>

Вам всегда придется беспокоиться о нарушении кода при переходе из веб-форм в MVC, однако команда ASP.NET MVC проделала большую работу, чтобы свести к минимуму проблемы.

Ответ 2

Как предложил Ник, вы действительно сможете отображать свои пользовательские элементы управления, но, очевидно, страницы-цикл, pagestate и postback из традиционных ASP Webforms больше не будут работать, что делает ваши элементы управления наиболее бесполезными.

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

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

Ответ 3

Да, вы можете сделать RenderPartial. Это хорошее начало. Но в конечном итоге этим ребятам понадобится логика и другие типы контроллеров. Будьте в поиске реализации субконтроллера из команды фреймворка. Также должно быть что-то в MvcContrib. Или сверните свой собственный.

Изменить: Я только что написал об этом здесь: http://mhinze.com/subcontrollers-in-aspnet-mvc/

Ответ 4

MVC имеет различный жизненный цикл страницы по сравнению с вашим пользовательским контролем.

Вы можете подумать об этом, чтобы перезаписать.

Aspx - это представление. Вы все еще нуждаетесь в повторной записи, синтаксис отличается. JavaScript будет работать. Но я вряд ли найду WebControls. Поскольку MVC больше не имеет просмотра и обратной передачи.

Для кода, стоящего за (aspx.cs), вам нужно преобразовать его в класс Controller. Page_Load метод больше не будет работать. Вероятно, вы оставите его в методе Index().

Модель - это просто классы сущностей, которые потребляют ваш код.

Заключение, это полная переписывание. Приветствия. Счастливое кодирование.