Est-ce une odeur de code à avoir à suivre modèle, compte tenu du code suivant (très simplifié pour aller droit au but)?HtmlHelper construire une liste déroulante, en utilisant ServiceLocator: odeur de code?
Les modèles:
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; }
}
La vue de modifier un produit:
<% =Html.EditorFor(x => x.Name) %>
<% =Html.EditorFor(x => x.Category) %>
Le EditorTemplate pour la catégorie
<% =Html.DropDownList<Category>() %>
La méthode 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);
}
Pour plus d'informations, la mise en œuvre réelle de la méthode d'assistance prend quelques lambdas pour obtenir les noms DataTextField et DataValueField, la valeur sélectionnée, etc.
Le point qui me tracasse avec une ServiceLocator à l'intérieur du HtmlHelper. Je pense que je devrais avoir une propriété AllCategories dans mon modèle de produit, mais je devrais être rempli dans le contrôleur chaque fois que j'en ai besoin. Donc je pense que la solution que j'utilise est plus simple, car la méthode auxiliaire est générique (et le modelbinder n'est pas inclus ici). Donc je dois juste créer un EditorTemplate pour chaque type qui a besoin d'une DropDownList.
Un conseil?
Idée semble bien, a juste besoin d'un peu de code de l'infrastructure. Pourquoi les downvotes? – mathieu
Wow. Tout le monde que j'ai montré cette technique aussi est étonné par cela. Je ne suis pas sûr de savoir quel est le problème ici. – jfar