У мене є такий клас із загальним типом:
Document<T>
Цей клас є частиною моделі перегляду
public class MyViewModel
{
public IEnumerable<Document<T>> Documents {get;set;}
}
Я хотів би використовувати DisplayFor для відправлення до відповідного шаблону у view.cshtml
@model MyViewModel
foreach(var vm in Model.Documents)
{
@Html.DisplayFor(vm)
}
Але я не знаю, як створювати шаблони в Shared / DisplayTemplates, які мають назву класу, але ім'я C # позбавляє загальних параметрів:
Document`1
Але це неефективно, оскільки воно не визначає структуру повного типу.
Чи є спосіб використання DisplayFor з DisplayTemplates та Generic Types?
Відповіді:
5 за відповідь № 1Ви можете зробити щось на зразок цього:
@foreach(var vm in Model.Documents)
{
Type type = vm.GetType().GetGenericArguments()[0];
var templateName = "Document_" + type.Name;
@Html.DisplayFor(model => vm, templateName)
}
І тоді ваші DisplayTemplates будуть називатися як "Docuement_Entity1.cshtml", "Document_Entity2.cshtml", ... де Entity1 та Entity2 є типовними типом аргументів.
Крім того, ви можете створити властивість TemplateName для класу Document, встановити його так само, як у наведеному вище коді, і використовувати його у своєму вікні виглядає так:
@foreach(var vm in Model.Documents)
{
@Html.DisplayFor(model => vm, vm.TemplateName)
}
UPDATE:
Якщо ви хочете використовувати Html Helper, ви можете зробити щось подібне:
public static MvcHtmlString DisplayGenericFor<TModel, TValue>(this HtmlHelper<TModel> helper, Expression<Func<TModel, TValue>> expression)
{
var modelType = helper.ViewData.Model.GetType();
if (!modelType.IsGenericType)
throw new ArgumentException();
Type genericType = modelType.GetGenericArguments()[0];
var templateName = modelType.Name.Split("`").First() + "_" + genericType.Name;
return helper.DisplayFor<TModel, TValue>(expression, templateName);
}