ASP.NET MVC 3 Generic DisplayTemplates

Lor*_*nVS 6 c# generics editortemplates display-templates asp.net-mvc-3

我刚刚使用ASP.NET MVC 3开始了一个项目.我正在现有的对象系统之上构建,所以我要做的第一件事就是为现有的各种类型定义显示和编辑器模板.

在MVC中是否可以使用泛型参数定义DisplayTemplate?例如,我们有一个BitString<T>类,它将枚举作为泛型参数,并表示包装所提供的枚举的选项列表.我希望我可以定义一个处理所有BitString实例的显示/编辑器模板.

我目前正在使用Razor作为我的观点,但我不介意混合和匹配ascx(或直接C#,如果有办法做到这一点)来实现这一点

谢谢

编辑:我认为这可能是这个问题的重复...但它已经有一年半了,所以也许有人在这一点上有更好的答案? 通用局部视图:如何将泛型类设置为模型?

Dar*_*Teo 7

你所描述的问题是泛型的基本原理.

ICollection<Object>ICollection<String>即使String是子类,也不是基类Object.这是在编译时完成的,因此您基本上可以获得两个不同的ICollection类定义.因此他们不能被铸造.(SO的聪明人请随时纠正我的任何不准确之处)

在MVC3中,我通过以下方式解决了这个问题:

class Container{
  /* Stuff here */
}

class Container<T> : Container{
 T Data {get;set;}
}
Run Code Online (Sandbox Code Playgroud)

然后在你看来

@model Container 
Run Code Online (Sandbox Code Playgroud)

当你不需要通用类型时只需要常见的东西.

@model Container<SomeDataType>
Run Code Online (Sandbox Code Playgroud)

当您需要通用类型数据时.

使用案例:

我创建了一个"ModelContainer"类,它将我的Model存储在里面,同时还有一个可以在局部显示页面的错误消息数组.由于partial可以在每个页面上使用,因此它不知道Generic类型是什么,因此需要这种解决方法.

如果您在不知道其类型的情况下尝试访问通用数据,则无法使用此功能.希望这能解决您的问题.


zls*_*h86 5

我同意Daryl的回答,但我只想补充一点改进.

interface IContainer{
  dynamic Data {get;}
}

class Container<T> : IContainer{
  T Data {get;set;}
  dynamic IContainer.Data
  {
     get { return this.Data; }
  }
}
Run Code Online (Sandbox Code Playgroud)

然后在您的视图中执行以下操作:

@model IContainer
Run Code Online (Sandbox Code Playgroud)


Dar*_*rov 4

不,如果通用类型未知,则不可能拥有具有通用类型的视图。您不能像这样定义模型:

@model AppName.Models.BitString<T>
Run Code Online (Sandbox Code Playgroud)

T必须知道:

@model AppName.Models.BitString<SomeEnum>
Run Code Online (Sandbox Code Playgroud)

话虽这么说,我建议您不要尝试重用旧系统中的某些模型,而是考虑可以放置哪些视图模型以及哪些视图模型将传递给视图。