asp.net mvc строго типизированная главная страница - проблема с типами - PullRequest
2 голосов
/ 08 февраля 2011

У меня есть две модели просмотра:

public class MasterPageViewModel
{
    public string Meta { get; set; }
}

public class Entry : MasterPageViewModel
{
    public int EntryID { get; set; }
    public string Title { get; set; }
    public DateTime PubDate { get; set; }
}

Страница индекса возвращает список записей, поэтому в представлении содержится:

...Inherits="System.Web.Mvc.ViewPage<IEnumerable<bl.Models.Entry>>"

Тогда главная страница содержит

...Inherits="System.Web.Mvc.ViewMasterPage<bl.Models.MasterPageViewModel>"

И вот ошибка, которую я получаю:

Элемент модели, передаваемый в словарь, имеет тип 'System.Linq.EnumerableQuery`1 [bl.Models.Entry]', но для этого словаря требуется элемент модели типа 'bl.Models.MasterPageViewModel'.

Я легко могу обойти эту ошибку, используя словарь ViewData на главной странице, но в моем случае я бы предпочел строго типизированный подход. В будущем я хочу иметь возможность добавлять списки категорий и тегов, которые будут отображаться на главной странице.

1 Ответ

1 голос
/ 23 мая 2011

У меня есть что-то вроде структуры, которую вы описываете на сайте MVC, над которым я сейчас работаю. Я не нашел действительно удовлетворительного ответа - во многих случаях кажется, что вам нужны две разные модели: одна для главной страницы и одна для страниц с контентом. К сожалению, это не так, как работает MVC.

Я встречал только одно решение, кроме упомянутой вами опции ViewData.

Базовый класс

  • Создайте базовый класс, который наследуют все ваши модели.
  • Базовый класс содержит все свойства, которые вам нужны на главной странице.
  • Хорошо: это простое наследство
  • Плохо: в итоге вы получаете методы / модели-обёртки для таких базовых вещей, как передача перечисляемой коллекции.

Так что в вашем случае вы бы получили что-то вроде ...

public class MasterPageViewModel {
    public string Meta { get; set; }
}

public class Entry : MasterPageViewModel {
  public IEnumerable<bl.Models.EntryItem> Items {get; set }
}

public class EntryItem{
    public int EntryID { get; set; }
    public string Title { get; set; }
    public DateTime PubDate { get; set; }
}

И ваша индексная страница будет выглядеть так ...

...Inherits="System.Web.Mvc.ViewPage<bl.Models.Entry>"

Это что-то вроде боли в заднице, потому что у тебя много маленьких моделей. Однако, как только я к этому привык, я перестал думать об этом.

НТН,

-Эрик

...