Почему модель моего представления не может быть связана с моей общей моделью представления, которая реализует интерфейс?(ASP.NET MVC 3) - PullRequest
6 голосов
/ 23 апреля 2011

Я пытаюсь передать моему 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 будет включать все свойства, которые я хотел, в качестве столбцов в списке , за исключением свойства только для администратора.

Таким образом, мой план состоял в том, чтобы передать как ViewModel и IEnumerable интерфейс базовой компании и из контроллера (или уровня обслуживания) выборочно заполнить IEnumerable экземпляром одного из них "Фильтровать "интерфейсы, такие как ICompanyInListAsUser.

Надеюсь, это имеет смысл, пожалуйста, дайте мне знать, если мне нужно уточнить.

Ответы [ 2 ]

6 голосов
/ 26 апреля 2011

То, что вы пытаетесь выполнить, должно быть возможно с помощью интерфейса для класса ViewModel и объявления общего типа как ковариантного. Как это:

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

Таким образом, вы также можете использовать абстрактный класс вместо интерфейса для Company.

1 голос
/ 23 апреля 2011

Учтите, что интерфейсы не могут обеспечить реализации, когда вы думаете об этой ситуации, и должно стать очевидным, что вам нужно закрыть свой универсальный тип тем конкретным интерфейсом, с которым вы хотите работать универсальным классом.

Если это неочевидно, подумайте далее, что с точки зрения чистого ООП интерфейсы не могут определять реализации, могут только классы, и что C # не позволяет указывать перекрывающиеся интерфейсы.

Мне кажется, что вы пытаетесь рассматривать интерфейс как абстрактный базовый класс.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...