2013-08-06 66 views
3

我有这样一类具有一个泛型类型:Html.DisplayFor与泛型类

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

但是我d on't知道如何创建具有类的名称共享/ DisplayTemplates模板,但C#的名称不需要使用泛型参数:

Document`1 

但这是insufficent,因为它不识别完整的类型结构体。

有没有办法将DisplayFor与DisplayTemplates和Generic Types一起使用?

+0

这可能有助于http://stackoverflow.com/questions/10616042/mvc3-razor-editor- display-templates-and-generics –

+0

[ASP.NET MVC 3 Generic DisplayTemplates](http://stackoverflow.com/questions/5286706/asp-net-mvc-3-generic-displaytemplates) –

+0

@Kyle - That问题是提出相关的问题,但稍有不同 - 我可以为所有类型的泛型使用一个模板。我正在尝试为每种类型获取一个模板。 – Doug

回答

5

你可以做这样的事情:

@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属性,设置它就像在上面的代码,并用它在你的浏览这样的:

@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);  
} 
+0

这很有趣。这是一个很好的解决方案,但也许它可能只是被包装在一个不同的HtmlHelper扩展中?即,Html.DisplayGenericFor(model => vm) – Doug

+0

当然,请参阅更新的答案。 – ataravati

+0

嗨,你怎么称呼它,传递一个自定义显示模板名称? – aggie