ASP.NET MVC 3 Generic DisplayTemplates
我刚刚使用ASP.NET MVC 3开始了一个项目。我正在现有的对象系统之上构建,所以我要做的第一件事就是为现有的各种类型定义显示和编辑器模板。
在MVC中是否可以使用generics参数定义DisplayTemplate? 例如,我们有一个BitString
类,它将枚举作为generics参数,并表示包含所提供枚举的选项列表。 我希望我可以定义一个处理所有BitString实例的显示/编辑器模板。
我目前正在使用Razor作为我的观点,但我不介意混合和匹配ascx(或直接C#,如果有办法做到这一点)来实现这一点
谢谢
编辑:我认为这可能是这个问题的重复…但它已经有一年半了,所以也许有人在这一点上有更好的答案? 通用局部视图:如何将generics类设置为模型?
你所描述的问题是generics的基本原理。
即使String
是Object
的子类, ICollection
也不是ICollection
的基类。 这是在编译时完成的,因此您基本上可以获得两个不同的ICollection类定义。 因此它们不能被铸造。 (SO的聪明人请随时纠正我的任何不准确之处)
在MVC3中,我通过以下方式解决了这个问题:
class Container{ /* Stuff here */ } class Container : Container{ T Data {get;set;} }
然后在你看来
@model Container
当你不需要通用类型时只需要常见的东西。
@model Container
当您需要通用类型数据时。
使用案例:
我创建了一个“ModelContainer”类,它将我的Model存储在里面,同时还有一个可以在局部显示页面的错误消息数组。 由于partial可以在每个页面上使用,因此它不知道Generic类型是什么,因此需要这种解决方法。
如果您在不知道其类型的情况下尝试访问通用数据,则无法使用此function。 希望这能解决您的问题。
我同意Daryl的回答,但我只想添加一点改进。
interface IContainer{ dynamic Data {get;} } class Container : IContainer{ T Data {get;set;} dynamic IContainer.Data { get { return this.Data; } } }
然后在您的视图中执行以下操作:
@model IContainer
不,如果不知道此generics类型,则无法使用generics类型的视图。 你不能定义这样的模型:
@model AppName.Models.BitString
T
必须知道:
@model AppName.Models.BitString
这就是说我会建议你,而不是试图重用旧系统中的某些模型,以考虑可能放置的视图模型以及将传递给视图的模型。
这可能不太理想,但您应该可以使用
@model BitString