Какие вещи я могу поместить в BaseController, чтобы сделать мою жизнь MVC проще - PullRequest
3 голосов
/ 08 ноября 2011

Мой базовый контроллер имеет:

[Authorize(Roles = "sys_admin")]

Я хочу иметь одно действие в контроллере, которое отличается и доступно для "user" и "sys_admin".Могу ли я переопределить и как мне это сделать?

Также любые предложения о том, что еще я мог бы вставить в базовый контроллер, которые могли бы сделать мое кодирование проще.Например, что находится в ваших базовых контроллерах?

Ответы [ 5 ]

3 голосов
/ 08 ноября 2011

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

  • getContext (): собирает объект, содержащий информацию пользователя, такую ​​как IP, имя хоста, идентификатор,и т. д. для целей ведения журнала.
  • Общие представления / Частичные, такие как Ошибка, По умолчанию и Перенаправление (используется для перенаправления запросов AJAX).
  • RedirectToError (): я создал это, чтобы использовать аналогично RedirectToAction,Я загружаю ErrorObject с информацией, выкидываю его в сеанс и возвращаю Redirect на мою страницу Error.
  • Общие методы ведения журнала и трассировки, чтобы я мог быстро выплевывать информацию в файл.
  • Я переопределяю OnActionExecuting и проверяю, является ли моя сессия все еще действительной, и перенаправляю на вход в систему, если это не так.Наверное, лучше с атрибутами ... пошло быстро и грязно.Также проследите Url.PathAndQuery для отладки здесь.
  • Любые действия по доступу к данным, которые я буду использовать для представлений с помощью ajax, например, загрузка списка отделов.
  • Также исключено OnException.

Это то, что я до сих пор получил у себя.

3 голосов
/ 08 ноября 2011

Все, что вы используете в каждом контроллере - атрибуты, методы, свойства и т. Д. То же самое, что вы поместили бы в любой базовый класс.

2 голосов
/ 08 ноября 2011

В мои базовые контроллеры я фактически поместил некоторый служебный метод ([NonAction]), собранный со временем.Я предпочитаю добавлять функциональные возможности в контроллеры, если возможно, используя атрибуты.

В последнее время мой базовый контроллер имеет:

  • некоторые свойства для извлечения информации о текущем пользователе (информация, относящаяся к моему приложению, а не к материалам User.Identity)
  • Aпростое protected override void OnException(ExceptionContext filterContext); переопределение, по крайней мере, для регистрации необработанного исключения и наличия каких-то автоматических уведомлений
  • Куча методов, связанных с куки-файлами (например, управление куки-файлами WebForms)
  • Куча полезных стандартных атрибутов(обычно [Authorize], [HandleError], [OutputCache]) в своем объявлении.
  • некоторый стандартный метод для подготовки широко используемых типов данных json на лету (когда это возможно, я предпочитаю иметь стандартный объект json с ErrorCode, ErrorMessage и UserData).

Со временем вы найдете все больше и больше утилит для своих контроллеров, попробуйте собрать сборку с более простыми (избегая тяжелых зависимостей), которые пригодятсяс вашими следующими проектами MVC.(то же самое касается помощников и в некоторой степени также и EditorTemplates).

Что касается части Authorize Attribute, я думаю, что самый простой способ - написать собственный класс AuthorizeAttribute, в частности NonAuthorizeAttribute.Я думаю, что я также видел это где-то на SO.

Вы также можете поиграть со свойством Order по умолчанию AuthorizeAttribute - выставить другой Order в BaseController и в Action, чтобы иметь один Action.выполняется первым, но я не могу вспомнить, действительно ли вы можете разорвать цепочку обработки атрибутов.

С уважением,

M.

1 голос
/ 08 ноября 2011

Мы не можем сказать вам, что вам нужно в вашем базовом контроллере, вы должны раскрывать подобные вещи, когда внедряете свои контроллеры и видите повторяющийся код. может быть, у вас должно быть 2 или более BaseControllers или 2-уровневая иерархия BaseControllers.

Я даю вам два совета, которые у меня всегда есть в моем BaseController:

  1. супер-полезный вспомогательный метод для привязки интерфейсной модели:
protected T Bind<T, U>()
   where T : U, new()
   where U : class
{
   T model = new T();
   TryUpdateModel<U>(model);
   return model;
}

Затем вы можете иметь несколько «наборов» свойств, которые вы хотите связать в различных сценариях, реализованных в виде интерфейсов, и простая модель привязывает ваш объект (даже существующий объект из БД) к входящим значениям.

2.Если вы используете пользовательские AcionResults (может быть, ваши конкретные сборщики Json и т. Д.), Создайте свои «ярлыки» методов в BaseController. То же, что и метод View (), является ярлыком для возврата нового ViewResult (...)

0 голосов
/ 08 ноября 2011

Чтобы добавить больше хороших отзывов уже здесь - кеширование кеширование кеширование кеширование

См Отключить кэш браузера для всего сайта ASP.NET

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