У меня есть довольно простое веб-приложение для проверки данных, написанное с помощью ASP MVC, которое имеет два представления одной и той же модели для разных целей.Уменьшение дублирования кода с помощью HTML-помощников
Agent view - Форма, заполненная лицом, проверяющим информацию. Каждое поле на форме в этом виде имеет 3 подполя:
a. Исходное значение. Значение из базы данных до вызова было выполнено.
b. Новая стоимость - значение, предоставляемое лицом по телефону, если оно отличается от оригинала.
c. Действие - общее указание на то, что произошло
QC View - форма, заполненная кем-то, кто рассматривает работу, выполняемую в представлении агента. Каждое поле на форме в этом виде имеет 5 подполей:
a. Исходное значение - То же, что указано выше
b. Значение агента - значение, указанное агентом в 1b выше.
c. Значение QC - исправленное «новое значение», если значение, указанное агентом, неверно.
d. Агент Действие - То же, что указано выше, кроме только чтения только в этом представлении
e. Действие КК - исправленное «новое действие», если агент неправильно выбрал его.
Единственные различия между двумя видами являются доступными подполями. Я хотел бы иметь возможность использовать один вид для представления обоих представлений, поскольку общая структура страниц идентична, и просто используйте HTML-помощники для обработки различий в подполях. То, что я до сих пор являюсь 2 отчетливо отдельными серии хелперов (в настоящее время в том же классе, хотя может быть отделен):
// Agent controls
public static MvcHtmlString AuditControl(this HtmlHelper htmlHelper, string id, string fieldLabel, MvcHtmlString editControl, string cssClass)
public static MvcHtmlString AuditControl(this HtmlHelper htmlHelper, string id, string fieldLabel, string editControl, string cssClass)
public static MvcHtmlString AuditControl<COMPLEX>(this HtmlHelper htmlHelper, string id, string fieldLabel, string cssClass) where COMPLEX : AbstractComplex, new()
// QC controls
public static MvcHtmlString ReviewControl(this HtmlHelper htmlHelper, string id, string fieldLabel, MvcHtmlString editControl, string cssClass)
public static MvcHtmlString ReviewControl(this HtmlHelper htmlHelper, string id, string fieldLabel, string editControl, string cssClass)
public static MvcHtmlString ReviewControl<COMPLEX>(this HtmlHelper htmlHelper, string id, string fieldLabel, string cssClass) where COMPLEX : AbstractComplex, new()
Где третья реализация обрабатывать более сложные поля, состоящие из нескольких элементов данных (например, ФИО , Адрес и т. Д.).
Одним из возможных решений, которое я рассмотрел, является разделение различных типов элементов управления на разные классы, которые реализуют общий интерфейс, а затем передают их как параметры типа для более общих HTML-помощников. Я думаю, что это сработает, но тогда мне как-то нужно будет дать представление о том, какую реализацию он должен использовать, чтобы рисовать представление, что кажется проблематичным, потому что оно, кажется, размывает линию между View и Controller.
Один менее привлекательный подход, который кажется очевидным, заключается в том, чтобы передать своего рода флаг администратора из контроллера, который будет использоваться обобщенным (в логическом смысле не типовым) заводом-изготовителем и построить в нем логику, чтобы узнать, какие серии методы использования. Это будет держать модель и рассматривать отдельно, но чувствует себя грязным, потому что хелпер HTML станет ответственным за не только создание HTML.
Является ли это разумной ситуацией, чтобы разрушить разделение проблем, разработанных MVC, или существует ли более подходящее решение?
Ваше решение звучит слишком сложно. Какую версию ASP.NET MVC вы используете? – SoWeLie
@SoWeLie - я использую MVC 3. –