为视图模型使用泛型

本文关键字:泛型 模型 视图 | 更新日期: 2023-09-27 17:49:18

我有一个视图,我想给一个模型,但模型可以是2种类型的可能。例子:

public class Super {
  public string Name = "super";
}
public class Sub1 : Super {
  public string Name = "sub1";
}
public class sub2 : Super {
  public string Name = "sub2";
}

我正在尝试使用泛型,并查看其他一些问题,我看到我可以做以下事情,但是,我在类中正确声明变量吗?

public class Generic<T> where T : Super {
  public T SubClass { get; set; } //is this ok?
}

如果这是ok的,我将如何添加这样的类模型到视图?

@model Generic<??>
<div>@Model.SubClass.Name</div>

这是可行的吗,我是在正确的轨道上,还是我只是在做一堆什么都不做?

为视图模型使用泛型

让您的视图使用Super作为模型:

@model Super

您将能够传递Sub1Sub2,因为它们都继承自Super

Razor视图不支持泛型模型——你可以有特定的泛型,比如IEnumerable<int>,但是你不能有IEnumerable<T>

看起来你真的想要虚方法的常规继承,而不是泛型。

public class Super {
  public virtual string Name {get {return "super";}}
}
public class Sub1 : Super {
  override public string Name {get {return "sub1";}}
}

并简单地使用Super作为模型类型

@model Super
<div>@Model.Name</div>

附加说明:泛型类彼此之间没有继承关系(Generic<Super>Generic<Sub1>没有任何形式的关系)-所以你不能指定"基"泛型类,并使其合理地用于派生类。下面的模型甚至不允许传递Generic<Sub1>(你可以通过interface - read"泛型和协方差"来处理)

@model Generic<Super> @* can't pass instance of Generic<Sub1> *@