Я хотел бы создать HtmlHelper, который можно использовать в свойствах IEnumerable.Могу ли я создать HtmlHelper специально для свойств IEnumerable?
Цель состоит в том, чтобы использовать его как это:
@Html.DisplayForEnumerable(m => m.EnumerableItemsProperty, "ViewTemplateName");
Если это возможно, я хотел бы использовать синтаксис m => m.Items
лямбда (в отличие от прохождения через Model.Items
).
Это мое лучшее усилие. Но я не уверен, как получить переменную items
из параметра выражения.
Я подозреваю, что, возможно, мне нужно использовать что-то вроде IEnumerable<TValue>
в качестве возвращаемого типа выражения, но я совершенно новичок в дженериках, и я не знаю, как это реализовать.
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());
}
Update
Для уточнения - я беру этот подход, потому что я хотел бы иметь возможность так указать различные шаблоны для одной и той же модели. И нормальная нумерация DisplayFor()
не возникает, если вы укажете конкретный шаблон.
Я знаю, что могу просто перечислить вручную, но я бы предпочел использовать этот метод, если только кто-то более осведомленный не советует иначе.
MVC уже имеет это. Его просто '@ Html.DisplayFor (m => m.EnumerableItemsProperty)' и вы создаете 'EditorTemplate' для типа, который используется в вашей коллекции. –
Спасибо, Стивен. Я хотел бы иметь возможность использовать различные шаблоны, если это возможно, и автоматическое перечисление не происходит, если вы укажете конкретный шаблон. Я знаю, что могу просто перечислить вручную, но я подумал об этом так. Не могли бы вы посоветовать это? –
Не уверен, что вы имеете в виду. Если у вас есть модель say 'Person.cs', тогда вы создаете' EditorTemplate' - '/ View/Shared/EditorTemplates/Person.cshtml', тогда метод' DisplayFor() 'генерирует правильный html для каждого' Person' в Коллекция. Если вам нужны разные шаблоны, связанные с разными контроллерами, вы можете поместить их в папки '/ Views/yourControllerName/EditorTemplates' –