6

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

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

我目前正在将 Razor 用于我的视图,但我不介意与 ascx(或直接 C#,如果有办法的话)混合和匹配来实现这一点

谢谢

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

4

4 回答 4

7

您描述的问题是泛型的基本原理。

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 类型是什么,因此需要这种解决方法。

如果您尝试在不知道其类型的情况下访问通用数据,则不能使用此选项。希望这可以解决您的问题。

于 2011-07-18T13:44:55.073 回答
5

我同意达里尔的回答,但我只想添加一个小改进。

interface IContainer{
  dynamic Data {get;}
}

class Container<T> : IContainer{
  T Data {get;set;}
  dynamic IContainer.Data
  {
     get { return this.Data; }
  }
}

然后在您看来,请执行以下操作:

@model IContainer
于 2012-11-30T20:22:02.857 回答
4

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

@model AppName.Models.BitString<T>

T必须知道:

@model AppName.Models.BitString<SomeEnum>

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

于 2011-03-13T09:57:42.570 回答
0

这可能不太理想,但您应该能够使用

@model BitString<dynamic>
于 2011-04-19T21:53:16.590 回答