我有一个这样的模型类:
public class GenericModel<T> where T : BaseTest
{
//Ctor
public List<T> TestList{get;set;}
}
我可以正常工作,因为我将它设置在我的控制器和我的视图中。 但是我有一个可以被所有控制器使用的部分视图。
我想知道我是否可以在部分视图中做这样的事情:
@model GenericModel<T>
不指定泛型类型。我能在这做什么?使用界面还是什么?
答案 0 :(得分:2)
无法使用T
定义它,因为它需要一个实际类型来跟随@model
语句。
根据我的经验,在visual studio中使用重构,提取GenericModel
说IGenericModel
和BaseTest
的界面,比如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
(以及您需要的任何其他内容)在你的视图中使用)。