如何在视图中设置通用模型?

时间:2014-04-30 03:31:33

标签: c# asp.net-mvc generics

我有一个这样的模型类:

  public class GenericModel<T> where T : BaseTest
  {
      //Ctor

      public List<T> TestList{get;set;}
  }

我可以正常工作,因为我将它设置在我的控制器和我的视图中。 但是我有一个可以被所有控制器使用的部分视图。

我想知道我是否可以在部分视图中做这样的事情:

@model GenericModel<T>

不指定泛型类型。我能在这做什么?使用界面还是什么?

2 个答案:

答案 0 :(得分:2)

无法使用T定义它,因为它需要一个实际类型来跟随@model语句。

根据我的经验,在visual studio中使用重构,提取GenericModelIGenericModelBaseTest的界面,比如IBaseTest,然后您的模型语句变为:< / p>

@model IGenericModel<IBaseTest>

更新

为了澄清,提取的界面可能类似(注意out的差异,如果你使用它会让你的生活更轻松):

public interface IGenericModel<out T> where T : IBaseTest
{
    IEnumerable<T> GetAll(); // just as an example
}

public interface IBaseTest
{
    T Property { get; }
}

答案 1 :(得分:1)

我多次使用的一种可能的解决方案是为您的Generic创建一个非泛型基类,使其成为:

public class GenericModel<T> : NormalModel where T:BaseTest
{
}

你的基类可能是这样的:

public abstract class NormalModel
{
    public abstract IList ItemsList { get; }
}

(如果它很简单,你可能只是把它变成一个界面,但是我假设它还有更多,而且一些GenericModel不依赖于T和可能会进入基类)。

然后您的观点可以使用NormalModel,您只需在GenericModel中覆盖它,并提供TestList(以及您需要的任何其他内容)在你的视图中使用)。