4

我有一个像这样的泛型类型的类:

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 一起使用?

4

1 回答 1

6

你可以这样做:

@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);      
}
于 2013-08-06T19:02:43.293 回答