2013-04-22 5 views
7

У меня есть настраиваемый фильтр действий, который внутри OnActionExecuting, в зависимости от определенных критериев, выводит пользователя из системы и перенаправляет его на главную страницу сайта. (Раздели назад) код для перенаправления части нижеНастройка TempData в ActionFilterAttribute

filterContext.Controller.TempData.Add("key", "Message"); 

    filterContext.Result = new RedirectResult("/"); 

Как и выше, я также установка сообщение TempData. Поскольку пользователь вышел из системы, когда они попали на главную страницу, атрибут [Authorize] перенаправит их на страницу входа GET. В представлении входа я показываю любые сообщения из tempData. Однако в этой ситуации tempData пуст.

Это очень похоже на то, как работает мой логин POST (если он недействителен, он перенаправляет на дом, который перенаправляет логин и отображает сообщение tempData, которое было установлено в сообщении «Вход»). Этот код можно увидеть ниже

TempData.Add("key", errorMessage); 

    return Redirect("/")); 

Причина я делаю это так, а не перенаправлять конкретно на страницу входа в систему происходит потому, что этот код распространяется на многих сайтах, поэтому мы не знаем, что Логин GET URL является ,

У кого-нибудь есть информация, почему это работает для входа в систему POST, но не для Перенаправления ActionFilter?

Edit:

Если я удалить вызов выхода из системы в фильтре действия Выборочная, TempData все еще установлен в главном действии - однако это оленья кожа объяснить, почему это работает для входа POST, но не действие фильтра?

ответ

4

Таким образом, выясняется, что когда я выходил из системы из системы, я также отказывался от сеанса (вызывая HttpContextBase.Session.Abandon()), а также сбросил идентификатор сессии cookie. Это повлияло на поведение TempData. Удалив эти вызовы, tempData теперь правильно настроен и отображается.

-1

установка результата на new RedirectResult("/") приведет к остановке текущей серверной обработки и отправке клиенту ответа, который сообщает клиенту запрашивать новый URL-адрес - тот, который вы сказали в RedirectResult. Второй запрос затем отличается и не содержит значений из предыдущей обработки. Попробуйте использовать Redirect("/"); или Server.Transfer("/"); для обслуживания нового маршрута в том же запросе клиента.

+0

То, что я делаю после - я хочу, чтобы клиент запросил новый URL-адрес. Причина, по которой TempData была пуста, была связана с отказом от сеанса. – Rob