2013-08-06 101 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