[英]Why can't my view's model bind with my generic ViewModel which implements an interface? (ASP.NET MVC 3)
我试图通过我的View传递以下ViewModel的实例:
public class CompanyListViewModel<T> where T : ICompany
{
public IEnumerable<T> CompanyList;
public IEnumerable<string> StateList;
public CompanyListViewModel(IEnumerable<T> list)
{
CompanyList = list;
}
}
View采用的方式如下:
@model Project.ViewModels.CompanyViewModels.CompanyListViewModel<ICompany>
我的控制器代码将这样的内容传递给View:
CompanyListViewModel<ICompanyInListAsUser> model = new CompanyListViewModel<ICompanyInListAsUser>(_companyService.FilterByCompanyState(state));
ICompanyInListAsUser
接口实现ICompany
接口的位置。 _companyService.FilterByCompanyState(state))
类返回IEnumerable
的Company
对象,而这些对象又实现了ICompanyInListAsUser
接口。
出于某种原因,访问我的视图时收到以下错误:
The model item passed into the dictionary is of type 'Project.ViewModels.CompanyViewModels.CompanyListViewModel`1[Project.ViewModels.CompanyViewModels.ICompanyInListAsUser]', but this dictionary requires a model item of type 'Project.ViewModels.CompanyViewModels.CompanyListViewModel`1[Project.ViewModels.CompanyViewModels.ICompany]'.
如果ICompanyInListAsUser
接口确实实现了ICompany
为什么我会收到此错误?
任何帮助将不胜感激。
谢谢。
编辑
我还想说明我想在这里实现的目标。 假设我的应用程序中有多个访问级别(例如用户和管理员)。 如果我的Company
对象中的属性是仅限管理员,该怎么办? 那么在这种情况下,我的ICompanyInListAsUser
将包括我想要的所有属性作为列表中的列, 除了 admin-only属性。
所以我的计划是在ViewModel
传入IEnumerable
的基本公司接口,并从控制器(或服务层)选择性地使用其中一个“过滤器”接口(如ICompanyInListAsUser
的实例填充IEnumerable
。
希望这是有道理的,如果我需要详细说明,请告诉我。
您可以通过使用ViewModel类的接口并将Generic类型声明为Covariant来实现您要完成的任务。 像这样:
interface ICompanyListViewModel<out T> where T : ICompany
{
}
这样你也可以使用抽象类而不是公司的接口。
考虑到当您考虑这种情况时接口无法提供实现,并且您应该明白需要使用您希望泛型类操作的特定接口来关闭泛型类型。
如果它不明显,那么,进一步考虑从纯OOP的角度来看,接口不能定义实现,只有类可以,并且C#不允许您指定重叠接口。
听起来像你正试图将接口视为抽象基类。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.