Является ли запах кода следствием следующего паттерна, учитывая следующий код (очень упрощенный, чтобы сразу перейти к сути)?
Модели:
class Product
{
public int Id { get; set; }
public string Name { get; set; }
public Category Cat { get; set; }
}
class Category
{
public int Id { get; set; }
public string Label { get; set; }
}
Вид для редактирования продукта:
<% =Html.EditorFor( x => x.Name ) %>
<% =Html.EditorFor( x => x.Category ) %>
Шаблон редактора для категории
<% =Html.DropDownList<Category>() %>
Метод HtmlHelper
public static MvcHtmlString DropDownList<TEntity>(this HtmlHelper helper)
where TEntity : Entity
{
var selectList = new SelectList(
ServiceLocator.GetInstance<SomethingGivingMe<TEntity>>().GetAll(),
"Id", "Label");
return SelectExtensions.DropDownList(helper, "List", selectList, null, null);
}
Для справки, для реальной реализации вспомогательного метода требуются лямбда-выражения, чтобы получить имена DataTextField и DataValueField, выбранное значение и т. Д.
Меня беспокоит использование сервис-локатора внутри HtmlHelper. Я думаю, что у меня должно быть свойство AllCategories в моей модели Product, но мне нужно будет заполнять его в контроллере каждый раз, когда мне это нужно.
Так что я думаю, что решение, которое я использую, является более простым, так как вспомогательный метод является универсальным (как и механизм связывания моделей, здесь не включенный). Поэтому мне просто нужно создать EditorTemplate для каждого типа, для которого требуется DropDownList.
Любой совет?