Должна ли главная страница ASP.NET получать свои данные из представления? - PullRequest
4 голосов
/ 22 января 2009

Я играл с ASP.NET MVC с сайтом, содержащим главную страницу.

Я создал пользовательский элемент управления MVC под названием ProductThumbnailControl. Пользовательский элемент управления отображает продукт и маленькое уменьшенное изображение. Представление - это представление ViewProduct, которое отображает полную информацию о продукте - пользовательский контроль просто является элементом пользовательского интерфейса на сайте.

 public partial class ProductThumbnailControl :
                      System.Web.Mvc.ViewProductControl<ViewProductsModel>
 {

 }

Я прочитал запись в блоге , в которой показано, как пользовательские элементы управления потребляют ViewData. Я узнал, что пользовательский элемент управления может автоматически получить свою модель из родительского представления. Поскольку он потребляет одни и те же данные, представлению не нужно явно передавать что-либо пользовательскому элементу управления, что обеспечивает более чистую разметку и код.

Итак, теперь я узнал, что мастер-страница использует тот же ViewData, что и страница. Это означает, что сама мастер-страница на самом деле не имеет модели для визуализации.

Вопрос

Какой правильный способ для мастер-страницы получить данные в первую очередь?

Я думал попробовать следующее?

Вы можете иметь SiteModel:

//Arbitrary properties for example
class SiteModel 
{
    public string PartnerId {get; set;}
    public ShoppingCart ShoppingCartContents {get; set;}    
    public string CurrentUserId {get; set;}
}

Вид наследуется от него:

class ViewProductModel : SiteModel 
{
    public Product Product {get; set;}
}

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

Это ужасная идея?

Должна ли главная страница просто получать свои данные, где бы она ни нуждалась?

Что делать, если я хочу включить пользовательский элемент управления в masthead?

Откуда он взял бы ViewData, поскольку для всей страницы есть только один ViewData объект?

Придется ли мне использовать этот ужасный синтаксис, который я ненавижу, и передать пользовательский элемент управления главной страницы явной модели?

Html.RenderUserControl("~/Views/Account/UserControls/Header.ascx",
  null, new { SelectedItem = "Profile" })

Какой лучший способ справиться с этим сценарием?

Ответы [ 3 ]

3 голосов
/ 22 января 2009

Наша главная страница берет данные из представления. Мы используем строго типизированные имена представлений для наших представлений, и в методы для этой реализации мы также добавляем данные стандартного представления, которые нужны каждой странице из наших постоянных объектов (например, информацию о структуре меню приложения, информацию о пользователе для отображения экран и пр.).

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

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

2 голосов
/ 22 января 2009

Похоже, мое решение очень похоже на рекомендацию Microsoft за одним ключевым исключением. Я создал базовый класс ViewData, и они создали базовый класс Controller - что имеет гораздо больше смысла.

Однако кажется, что обе идеи могут (и должны) работать в тандеме. В приведенном ниже руководстве по MS для хранения данных о представлении используется словарь, поэтому, если у вас была строго типизированная модель, вам также понадобится базовый класс.

Учебное пособие по Microsoft MVC

0 голосов
/ 23 января 2009

Я хотел бы создать контроллер ShoppingCart (или отдельные контроллеры для каждой задачи) и отобразить пользовательские элементы управления, которые используют их с RenderAction, найденным в библиотеке Futures DLL, которую можно загрузить с www.codeplex.com/asp.net. Он является частью исходного кода ASP.NET MVC.

Использование базового контроллера или «модели сайта» объединяет слишком много вещей, создавая кошмар для тестирования и обслуживания.

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