当前位置: 首页 > 编程语言 > C#

为什么我的视图模型不能绑定到实现接口的通用ViewModel?(ASP.NETMVC3)分享

时间:2023-04-10 16:12:06 C#

为什么我的ViewModel不能与实现接口的通用ViewModel绑定?(ASP.NETMVC3)我正在尝试通过我的视图传递以下ViewModel的实例:publicclassCompanyListViewModelwhereT:ICompany{publicIEnumerableCompanyList;公共IEnumerableStateList;公共CompanyListViewModel(IEnumerable列表){CompanyList=列表;视图采用的方法如下:@modelProject.ViewModels.CompanyViewModels.CompanyListViewModel我的控制器代码将类似这样的内容传递给视图:CompanyListViewModelmodel=newCompanyListViewModel(_companyService.FilterByCompanyState(state));其中ICompanyInListAsUser接口实现了ICompany接口。_companyService.FilterByCompanyState(state))返回一个IEnumerableCompany对象,该对象又实现了ICompanyInListAsUser接口。出于某种原因,访问我的视图时出现以下错误:传入字典的模型项的类型为“Project.ViewModels.CompanyViewModels.CompanyListViewModel`1[Project.ViewModels.CompanyViewModels.ICompanyInListAsUser]”,但该字典需要类型为“Project.ViewModels.CompanyViewModels.CompanyListViewModel`1[Project.ViewModels.CompanyViewModels.ICompany]”的模型项。如果ICompanyInListAsUser接口确实实现了ICompany为什么会出现此错误?任何帮助将不胜感激。谢谢。编辑我也想澄清一下我想在这里实现的目标。假设我的应用程序中有多个访问级别(例如用户和管理员)。如果我的Company对象中的属性仅供管理员使用怎么办?那么在这种情况下,我的ICompanyInListAsUser将包括我想要的所有属性作为列表中的列,但仅限管理员的属性除外。因此,我的计划是将ViewModel作为基础公司接口的IEnumerable传入,并从控制器(或服务层)选择性地使用“过滤器”接口之一(如ICompanyInListAsUser)的实例填充IEnumerable。希望这是有道理的,如果我需要详细说明,请告诉我。您可以通过使用ViewModel类的接口并将通用类型声明为Covariant来实现您想要实现的目标。像这样:interfaceICompanyListViewModelwhereT:ICompany{}这样你也可以使用抽象类而不是公司的接口。考虑到当您考虑这种情况时,接口无法提供实现,并且您应该了解您需要使用您希望泛型类对其进行操作的特定接口来关闭泛型类型。如果不是很明显,那么,从纯OOP的角度进一步考虑,接口不能定义实现,只有类可以,并且C#不允许您指定重叠的接口。听起来您正在尝试将接口视为抽象基类。以上是C#学习教程:为什么我的视图模型不能绑定到实现接口的通用ViewModel?(ASP.NETMVC3)所有内容分享,如果对你有用,需要了解更多C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理会员删除。如需转载请注明出处: