/ / Html.DisplayFor з загальним класом - asp.net-mvc

Html.DisplayFor з загальним класом - asp.net-mvc

У мене є такий клас із загальним типом:

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);
}