ASP.NET MVC постоянная организация данных и кода - PullRequest
1 голос
/ 05 марта 2010

Я даю MVC еще один шанс, и мне кажется, что я снова и снова изучаю HTML.

Итак, глупый вопрос: в верхней части моей главной страницы у меня есть частичное представление (или подобное - я использую механизм просмотра шаблонов строк и до сих пор я люблю it), которая либо отображает небольшую форму входа (похожую на ту, что есть в NewEgg), либо сообщение типа

Вы вошли как (Имя). [Профиль] | [Выйти]

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

public ActionResult Index()
{
    ViewData["IsAuthenticated"] = Session["IsAuthenticated"];
    ViewData["user.firstname"] = User.FirstName;
    return View("login");
}

Это довольно раздражает, когда приходится копировать повсюду. Мой следующий вариант - создать метод с именем PopulateCommonViewData () и просто вызывать его из каждого метода действия, но это также кажется паршивым.

Я что-то здесь упускаю?

Ответы [ 6 ]

5 голосов
/ 05 марта 2010

Получите ваши контроллеры из базового контроллера. Затем переместите метод создания данных общего вида в переопределение OnActionExecuting / OnActionExecuted в этом базовом контроллере.

 public class BaseController : Controller
 {
      public override void OnActionExecuting( ActionExecutingContext filterContext )
      {
           ViewData["IsAuthenticated"] = Request.IsAuthenticated;
           ViewData["user.firstname"] = User.FirstName;
      }
 }

 public class MyController : BaseController // and you're done
 {
    ...
 }
1 голос
/ 05 марта 2010

Как насчет базового класса ViewModel, который вводится с помощью IUserContext и всех других ViewModel в приложении, производных от этой ViewModel?

Почему-то меня не устраивает концепция выполнения: ViewData ["magic_string"] = "magic"; шаблон рекомендуется здесь ...

Возможно, я упускаю точку и хотел бы знать, что?

НТН

1 голос
/ 05 марта 2010

Пара опций в моей голове, используйте общий базовый контроллер, который наследуют все ваши контроллеры, и который добавляет информацию в метод / переопределение OnActionExecuting , или вы можете использовать фильтр действий, если не требуется глобально ...

1 голос
/ 05 марта 2010

Я бы использовал членство в ASP.NET и просто проверял состояние и получал информацию из методов контекста страницы на главной странице.Все просто!

0 голосов
/ 05 марта 2010

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

Другой способ - использовать базовый класс контроллера и переопределить там метод OnActionExecuted.

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

0 голосов
/ 05 марта 2010

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

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