你可以这样做:
@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 是您的通用参数类型。
或者,您可以为 Document 类创建一个 TemplateName 属性,就像在上面的代码中一样设置它,然后在您的视图中使用它,如下所示:
@foreach(var vm in Model.Documents)
{
@Html.DisplayFor(model => vm, vm.TemplateName)
}
更新:
如果你想使用 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);
}