gpt4 book ai didi

asp.net-mvc - Html.DisplayFor 与通用类

转载 作者:行者123 更新时间:2023-12-01 17:36:45 24 4
gpt4 key购买 nike

我有一个像这样的通用类型的类:

Document<T>

此类是 View 模型的一部分

public class MyViewModel
{
public IEnumerable<Document<T>> Documents {get;set;}

}

我想使用 DisplayFor 分派(dispatch)到 view.cshtml 中的适当模板

@model MyViewModel
foreach(var vm in Model.Documents)
{
@Html.DisplayFor(vm)
}

但我不知道如何在 Shared/DisplayTemplates 中创建具有类名称的模板,但 C# 名称省略了通用参数:

 Document`1

但这还不够,因为它无法识别完整的类型结构。

有没有办法将 DisplayFor 与 DisplayTemplates 和通用类型一起使用?

最佳答案

你可以这样做:

@foreach(var vm in Model.Documents)
{
Type type = vm.GetType().GetGenericArguments()[0];
var templateName = "Document_" + type.Name;
@Html.DisplayFor(model => vm, templateName)
}

然后,您的 DisplayTemplates 将被命名为“Document_Entity1.cshtml”、“Document_Entity2.cshtml”...,其中 Entity1 和 Entity2 是您的通用参数类型。

或者,您可以为 Document 类创建一个 TemplateName 属性,像上面的代码一样设置它,然后在 View 中使用它,如下所示:

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

关于asp.net-mvc - Html.DisplayFor 与通用类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18088277/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com