Je voudrais créer un HtmlHelper qui peut être utilisé sur les propriétés IEnumerable.Puis-je créer un HtmlHelper spécifiquement pour les propriétés IEnumerable?
L'objectif est de l'utiliser comme ceci:
@Html.DisplayForEnumerable(m => m.EnumerableItemsProperty, "ViewTemplateName");
Si possible, je voudrais utiliser la syntaxe m => m.Items
lambda (par opposition à passer par Model.Items
).
C'est mon meilleur effort jusqu'à présent. Mais je ne suis pas sûr comment obtenir la variable items
à partir du paramètre d'expression.
Je suppose que je devrais utiliser quelque chose comme IEnumerable<TValue>
comme le type de retour de l'expression, mais je suis assez nouveau pour les génériques et je ne sais pas comment implémenter cela.
public static MvcHtmlString DisplayForEnumerable<TModel>(this HtmlHelper<TModel> html, Expression<Func<TModel, IEnumerable>> expression, string templateName, object additonalViewData = null)
{
var sb = new StringBuilder();
// how to get items variable?
foreach (var item in items)
{
var item1 = item;
sb.Append(html.DisplayFor(m => item1, templateName, additonalViewData));
}
return MvcHtmlString.Create(sb.ToString());
}
Mise à jour
Pour clarifier - je prends cette approche parce que je voudrais être en mesure de spécifier si des modèles differnt pour le même modèle. Et l'énumération DisplayFor()
normale ne se produit pas si vous spécifiez un modèle particulier.
Je sais que je pourrais simplement énumérer manuellement, mais je préférerais utiliser cette méthode à moins que quelqu'un de plus averti ne le conseille autrement.
MVC a déjà cela. C'est juste '@ Html.DisplayFor (m => m.EnumerableItemsProperty)' et vous créez un 'EditorTemplate' pour le type qui est utilisé dans votre collection. –
Merci Stephen. Je voudrais pouvoir utiliser différents modèles si possible, et l'énumération automatique ne se produit pas si vous spécifiez un modèle particulier. Je sais que je pourrais juste énumérer manuellement, mais j'ai pris un plaisir à le faire de cette façon. Conseilleriez-vous contre cela? –
Je ne sais pas ce que vous voulez dire. Si vous avez un modèle dit 'Person.cs' alors vous créez un' EditorTemplate' - '/ View/Shared/EditorTemplates/Person.cshtml' alors la méthode' DisplayFor() 'va générer le html correct pour chaque' Person' dans la collection. Si vous souhaitez des modèles différents associés à différents contrôleurs, vous pouvez les placer dans les dossiers '/ Views/yourControllerName/EditorTemplates' –