gpt4 book ai didi

c# - 为什么我的 View 模型不能与实现接口(interface)的通用 ViewModel 绑定(bind)? (ASP.NET MVC 3)

转载 作者:太空狗 更新时间:2023-10-29 21:30:19 24 4
gpt4 key购买 nike

我正在尝试将以下 ViewModel 的实例传递给我的 View :

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>

我的 Controller 代码将类似这样的内容传递给 View :

CompanyListViewModel<ICompanyInListAsUser> model = new CompanyListViewModel<ICompanyInListAsUser>(_companyService.FilterByCompanyState(state));

其中 ICompanyInListAsUser 接口(interface)实现了 ICompany 接口(interface)。 _companyService.FilterByCompanyState(state)) 类返回 Company 对象的 IEnumerable,后者又实现了 ICompanyInListAsUser 界面。

由于某种原因,我在访问我的 View 时收到以下错误:

传入字典的模型项的类型为“Project.ViewModels.CompanyViewModels.CompanyListViewModel`1[Project.ViewModels.CompanyViewModels.ICompanyInListAsUser]”,但此字典需要一个类型为“Project.ViewModels”的模型项.CompanyViewModels.CompanyListViewModel`1[Project.ViewModels.CompanyViewModels.ICompany]'。

如果 ICompanyInListAsUser 接口(interface)实际上实现了 ICompany,为什么我会收到此错误?

如有任何帮助,我们将不胜感激。

谢谢。

编辑

我还想在这里说明我想要实现的目标。假设我的应用程序中有多个访问级别(例如用户和管理员)。如果我的 Company 对象中有一个仅供管理员使用的属性怎么办?那么在那种情况下,我的 ICompanyInListAsUser 将包括我想要的所有属性作为列表中的列除了仅限管理员的属性。

所以我的计划是将基础公司接口(interface)的 IEnumerable 作为 ViewModel 传入,并从 Controller (或服务层)选择性地填充 IEnumerable 使用这些“过滤器”接口(interface)之一的实例,例如 ICompanyInListAsUser

希望这是有道理的,如果我需要详细说明,请告诉我。

最佳答案

通过为 ViewModel 类使用接口(interface)并将通用类型声明为 Covariant,应该可以实现您尝试完成的任务。像这样:

interface ICompanyListViewModel<out T> where T : ICompany
{
}

那样的话,您也可以使用抽象类而不是 Company 的接口(interface)。

关于c# - 为什么我的 View 模型不能与实现接口(interface)的通用 ViewModel 绑定(bind)? (ASP.NET MVC 3),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5762302/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com