为什么我的视图模型不能与实现接口的通用ViewModel绑定? (ASP.NET MVC 3)
我正试图通过我的View传递以下ViewModel的实例:
public class CompanyListViewModel where T : ICompany { public IEnumerable CompanyList; public IEnumerable StateList; public CompanyListViewModel(IEnumerable list) { CompanyList = list; } }
View采用的方式如下:
@model Project.ViewModels.CompanyViewModels.CompanyListViewModel
我的控制器代码将这样的内容传递给View:
CompanyListViewModel model = new CompanyListViewModel(_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
传入,并从控制器(或服务层)选择性地使用其中一个“filter”接口(如ICompanyInListAsUser
的实例填充IEnumerable
。
希望这是有道理的,如果我需要详细说明,请告诉我。
您可以通过使用ViewModel类的接口并将Generic类型声明为Covariant来实现您要完成的任务。 像这样:
interface ICompanyListViewModel where T : ICompany { }
这样你也可以使用抽象类而不是公司的接口。
考虑到当您考虑这种情况时接口无法提供实现,并且您应该明白需要使用希望generics类操作的特定接口来关闭generics类型。
如果它不明显,那么,进一步考虑从纯OOP的角度来看,接口不能定义实现,只有类可以,并且C#不允许您指定重叠接口。
听起来像你正在尝试将接口视为抽象基类。