繁体   English   中英

如何将通用对象传递给Aspx页面

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM