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

本文关键字:模型 设置 视图 | 更新日期: 2023-09-27 18:00:56

我有一个这样的模型类:

  public class GenericModel<T> where T : BaseTest
  {
      //Ctor
      public List<T> TestList{get;set;}
  }

我可以很好地处理这个问题,因为我在控制器和视图中设置了它。但我有一个局部视图,所有控制器都可以使用它。

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

@model GenericModel<T>

没有指定泛型类型。我在这里能做什么?使用接口什么的?

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

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

根据我的经验,在visualstudio中使用重构,为GenericModel(比如IGenericModel(和BaseTest(比如IBaseTest(提取一个接口,然后您的模型语句变成:

@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; }
}

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

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

你的基类可能是这样的:

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

(如果它这么简单,你可能只会把它做成一个接口,但我假设它还有更多,而且GenericModel的一些部分不依赖于T,可能会进入基类(。

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