2010-02-03 3 views
1

В качестве ответа на вопрос this question, мне интересно, что происходит с моей TempData.asp.net mvc: TempData и AuthorizeAttribute

Сценарий 1:

  • пользователь входит в систему
  • пользователя обеспечивает E-mail адрес
  • пользователь получает письмо с кодом подтверждения
  • пользователь щелкает по одобрению URL
  • проверки пользователя
  • успеха msg отображается через TempData, установленное в действии Validate

Сценарий 2:

  • пользователь входит в систему
  • пользователь предоставляет адрес электронной почты
  • пользователь выходит из/таймаут
  • пользователь получает письмо с кодом подтверждения
  • пользователь нажимает на проверки URL
  • пользователь подтвержден
  • успех msg не отображается через Temp Набор данных в действии Validate

Теперь я не вижу причины для входа пользователя в систему для проверки. В Сценарии 1 я помещаю сообщение «Успех» в TempData и возвращаю RedirectToAction («Индекс»). Действие индекса имеет атрибут AuthorizeAttribute - если они не вошли в систему, они перенаправляются на экран входа в систему (отдельный контроллер).

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

ответ

6

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

Возможно, вы можете просто положить его на сеанс непосредственно вместо внешнего интерфейса TempData на сеанс. Он все равно должен быть там, пока сессия живет.

+0

Похож сессия это... – chris

3

[Authorize] вводит дополнительную перенаправление, которая очищает TempData (Tvanfosson объяснил детали). Поэтому для этой работы, вы можете использовать флаг на методе вы переадресованы, например

return RedirectToAction("Confirm", new { status = "Success!" }); 

(при условии, что у вас есть следующий маршрут и действие метод объявлен :)

routes.MapRoute("Confirmation", 
    "Account/Confirm/{status}", 
    new { controller = "Account", action = "Confirm", status = "" }); 

public ActionResult Confirm(string status) 
{ 
    return View(status); 
} 
Смежные вопросы