asp.net mvc2 - контроллер для главной страницы и организации кода - PullRequest
5 голосов
/ 02 апреля 2010

Я только что закончил свою первую ASP.NET MVC (2) CMS. Следующим шагом является создание веб-сайта, который будет отображать данные из базы данных CMS. Это дизайн сайта:

http://img56.imageshack.us/img56/4676/portal.gif http://img56.imageshack.us/img56/4676/portal.gif


# 1 (красная рамка) - отображает категории статей. ViewModel:

public class CategoriesDisplay
    {
        public CategoriesDisplay() { }

        public int CategoryID { set; get; }
        public string CategoryTitle { set; get; }
    }

# 2 (коричневая рамка) - отображает последние x статей; пропускает те из зеленой коробки № 3. ViewModel:

public class ArticleDisplay
    {
        public ArticleDisplay() { }

        public int CategoryID { set; get; }
        public string CategoryTitle { set; get; }

        public int ArticleID { set; get; }

        public string ArticleTitle { set; get; }
        public string URLArticleTitle { set; get; }
        public DateTime ArticleDate;

        public string ArticleContent { set; get; }

    }

# 3 (зеленое поле) - отображает последние x статей. Использует ту же ViewModel, что и коричневая коробка # 2

# 4 (синяя рамка) - отображение списка предстоящих событий. Использует dataContext.Model.Event как ViewModel

Боксы № 1, № 2 и № 4 будут повторяться по всему сайту, и они являются частью главной страницы. Итак, мой вопрос: каков наилучший способ передачи этих данных из модели в контроллер и, наконец, для просмотра страниц?

  1. Должен ли я сделать контроллер для мастер-страница и класс ViewModel, которые обернут все эти классы вместе ИЛИ
  2. Должен ли я создавать частичные виды для каждый из этих ящиков и сделать каждый из них наследуют соответствующий класс (если даже возможно, что это работает так?) ИЛИ
  3. Должен ли я вставить этот повторный код в все контроллеры и все дополнительные передача данных через ViewData, которая было бы, наверное, хуже пути :) ИЛИ
  4. Может быть, лучше и больше простой способ, но я не знаю / вижу это?


Заранее спасибо, Ile



EDIT:
Если ваш ответ № 1, то, пожалуйста, объясните, как сделать контроллер для главной страницы!

РЕДАКТИРОВАТЬ 2:
В этом руководстве описано, как передать данные на главную страницу с помощью абстрактного класса: http://www.asp.net/LEARN/mvc/tutorial-13-cs.aspx
В «Листинге 5 - Controllers \ MoviesController.cs» данные извлекаются непосредственно из базы данных с использованием LINQ, а не из репозитория. Итак, мне интересно, если это только в этом уроке, или здесь есть какая-то хитрость, и репозиторий не может / не должен использоваться?

Ответы [ 2 ]

4 голосов
/ 03 апреля 2010

Чтобы получить данные на мою мастер-страницу:

  • Мне не нравится использовать абстрактный класс для передачи данных на главную страницу. Я предпочитаю композицию наследству.
  • Мне не нравится использовать словарь ViewData, потому что он не является строго типизированным.

Я бы создал Views, ViewModels и Actions для каждого раздела. Затем позвоните Html.RenderAction(...) Например:

Я бы создал CategoriesDisplay.aspx только с html для redbox. Я бы сказал, что ваша CategoriesDisplay модель. Тогда в моем контроллере:

public class CategoryController : Controller
{
    public ActionResult DisplayCategories()
    {
      var model = new CategoriesDisplay();
      ...
      return View(model);
    }
}

Тогда на моей главной странице:

<% Html.RenderAction<CategoryController>(c => c.DisplayCategoreis()); %>

Это сделает представление CategoriesDisplay встроенным в мастер-страницу. Что, в свою очередь, позволяет вам иметь SOC (разделение проблем), чистый и управляемый код.

2 голосов
/ 02 апреля 2010

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

Я бы выбрал ваш выбор # 1 и создал бы ViewModel, который обернул бы все классы, которые вам понадобятся.

...