[英]How to pass a generic object to a Aspx page
我正在开发一个ASP.Net MVC网站,我一直在使用泛型来获取我的C#代码,以便与我的观点保持良好关系。
我有一个控制器将模型传递给视图(到目前为止一直很好)。 该模型类型的IDescribedEnumerable<T>
与一些约束T
,在那些是约束T
从一个接口(继承IDescribedModel
)。
我可以轻松编写一个接受IDescribedEnumerable<Country>
的View,只要T
实际上是Country
类型,它就会起作用。
但是,我还想编写一个默认视图,它接受一个IDescribedEnumerable
的<<whatever>>
并将它呈现它。 这应该是完全可能的。 我并不总是需要知道模型的具体类型。 通常只知道它是IDescribedModel
就足够了。
只要我留在C#就没问题了。 当我不关心特定类型时,我只是将方法和对象声明为接受<T>
。 当我照顾时,我宣布他们接受Country
。
但:
(1)如果我想渲染一个视图我必须选择一个类型。 我不能只说Inherits="System.Web.Mvc.ViewUserControl<IDescribedEnumerable<T>>"
我必须指定<>
之间的现有类型。 (即使我要从ViewUserControl
继承,我也必须将其转换为IDescribedEnumerable<<something>>
。(2)理想情况下,我认为Model在默认的View和IDescribedEnumerable<Country>
中是IDescribedEnumerable<IDescribedModel>
然后,我的Controller需要知道他是否要渲染到默认的View或特定的视图。不可能简单地将IDescribedEnumerable<Country>
的对象IDescribedEnumerable<Country>
为IDescribedEnumerable<IDescribedModel>
。(IIRC它)可能在C#4中,但我正在使用3.5)
所以我该怎么做? 我能想到的所有选项都是非常不理想的(我不期待删除泛型,只是将对象转换为周围,也不是复制粘贴默认视图65次并保持副本同步,也不会反射出色并创建一个基于已知Type
对象的对象)
在等待一些C#天才来回答我所有问题时,我已经实现了IEnumerable也使用的技巧:
我向IDescribedEnumerable接口添加了一个方法public IDescribedEnumerable<IDescribedModel> AsIDescribedModels()
,并创建了一个新类GenericDescribedEnumerable<T> : IDescribedEnumerable<IDescribedModel>
。 在我的DescribedEnumerable<T>
类中,我创建了一个GenericDescribedEnumerable并返回它。 在GenericDescribedEnumerable中我返回this
完整代码:
public interface IDescribedModel<T> : IDescribedModel{
T original {
get;
}
}
public interface IDescribedEnumerable {
IDescribedEnumerable<IViewModel> AsIViewModels();
}
public interface IDescribedEnumerable<T> : IDescribedEnumerable
where T : IDescribedModel{
IEnumerable<T> GetViewModels();
}
public class DescribedEnumerable<T> : IDescribedEnumerable<IDescribedModel<T>>{
public DescribedEnumerable(IEnumerable<T> enumerable) {}
public IDescribedEnumerable<IViewModel> AsIViewModels() {
return new GenericDescribedEnumerable<T>(/*allProperties*/);
}
public IEnumerable<T> GetViewModels() {
foreach ( T obj in _enumerable ) {
var vm = new DescribedModel<T>( obj);
yield return vm;
}
}
}
public class GenericDescribedEnumerable<T> : IDescribedEnumerable<IViewModel>{
//pass in the constructor everything you need, or create in the
//constructor of DescribedEnumerable<T>
public GenericDescribedEnumerable(/*allProperties*/) {
}
public IEnumerable<IViewModel> GetViewModels() {
foreach ( T obj in _enumerable ) {
var vm = new PlatoViewModel<T>( obj );
yield return vm;
}
}
public IDescribedEnumerable<IViewModel> AsIViewModels() {
return this;
}
}
是的,这将工作或使用模型作为对象,并适当地投射它。 这是ViewPage类使用的方法,ViewPage和ViewPage:ViewPage。
Inherits="System.Web.Mvc.ViewUserControl<IDescribedEnumerable<T>>"
...
Model.Cast<IModel>()
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.