【问题标题】:ASP.NET MVC 3 Generic DisplayTemplatesASP.NET MVC 3 通用显示模板
【发布时间】:2011-07-14 06:56:48
【问题描述】:
我刚刚使用 ASP.NET MVC 3 开始了一个项目。我在现有对象系统之上构建,所以我要做的第一件事就是为各种类型定义显示和编辑器模板存在。
是否可以在 MVC 中使用通用参数定义 DisplayTemplate?例如,我们有一个BitString<T> 类,该类将枚举作为通用参数,并表示包装提供的枚举的选项列表。我希望我可以定义一个处理所有 BitString 实例的显示/编辑器模板。
我目前正在使用 Razor 作为我的视图,但我不介意与 ascx(或直接 C#,如果有办法做到这一点)混合和匹配来实现这一点
谢谢
编辑:
我认为这可能是这个问题的一个重复......但它已经一年半了,所以也许有人在这一点上有更好的答案?
Generic partial view: how to set a generic class as model?
【问题讨论】:
标签:
c#
generics
asp.net-mvc-3
editortemplates
display-templates
【解决方案1】:
您所描述的问题是泛型的基本原理。
ICollection<Object> 不是ICollection<String> 的基类,即使String 是Object 的子类。这是在编译时完成的,所以你基本上得到了两个不同的 ICollection 类定义。因此它们不能被铸造。 (SO的聪明人请随时纠正我的任何不准确之处)
在 MVC3 中,我通过以下方式解决了这个问题:
class Container{
/* Stuff here */
}
class Container<T> : Container{
T Data {get;set;}
}
那么在你看来
@model Container
当您只需要通用的东西而不知道泛型类型时。
@model Container<SomeDataType>
当您需要泛型类型数据时。
用例:
我创建了一个“ModelContainer”类,其中存储了我的模型,以及可以在页面中部分显示的错误消息数组。由于 partial 可以在每个页面上使用,它不知道 Generic 类型将是什么,因此需要这种解决方法。
如果您试图在不知道其类型的情况下访问通用数据,则不能使用此选项。希望这能解决您的问题。
【解决方案2】:
我同意 Daryl 的回答,但我只想做一点小改进。
interface IContainer{
dynamic Data {get;}
}
class Container<T> : IContainer{
T Data {get;set;}
dynamic IContainer.Data
{
get { return this.Data; }
}
}
然后在您的视图中执行以下操作:
@model IContainer
【解决方案3】:
不,如果此泛型类型未知,则不可能拥有具有泛型类型的视图。你不能这样定义模型:
@model AppName.Models.BitString<T>
T 必须知道:
@model AppName.Models.BitString<SomeEnum>
话虽如此,我建议您不要尝试重用旧系统中的某些模型,而是考虑您可能放置哪些视图模型以及哪些将传递给视图。
【解决方案4】:
这可能不太理想,但你应该能够使用
@model BitString<dynamic>