Я работаю над веб-приложением ASP.NET MVC 3, где я использую TempData для хранения объекта модели в сценарии, когда пользователь не вошел в систему.
Вот поток:
- Используйте форму отправки.
- Код (специальный фильтр действий) добавляет модель к TempData, перенаправляет на страницу входа в систему.
- Пользователь перенаправлен обратно к действию GET, которое считывает TempData и напрямую вызывает действие POST.
После шага 3 я мог подумать, что TempData будет очищена?
Вот код:
[HttpGet]
public ActionResult Foo()
{
var prefilled = TempData["xxxx"] as MyModel;
if (prefilled != null)
{
return Foo(prefilled);
}
}
[HttpPost]
[StatefulAuthorize] // handles the tempdata storage and redirect to logon page
public ActionResult Foo(MyModel model)
{
// saves to db.. etc
}
Я нашел эту статью, в которой говорится:
- Элементы удаляются из TempData только в конце запроса, если они были помечены для удаления.
- Элементы помечаются для удаления только при чтении.
- Элементы можно удалить, вызвав TempData.Keep (ключ).
- RedirectResult и RedirectToRouteResult всегда вызывают TempData.Keep ().
Что ж, если читать его с TempData["xxx"]
, разве это не «прочитанное», и поэтому они должны быть помечены для удаления?
И последнее меня немного беспокоит - так как я делаю перенаправление после POST (P-R-G). Но этого не избежать.
Есть ли способ сказать «брось этот предмет». TempData.Remove? Или я не так делаю?
StatefulAuthorize
не будет вызываться. - person Buildstarted   schedule 03.10.2011StatefulAuthorize
вызывается в начальном POST, например, когда пользователь не прошел проверку подлинности и пытается отправить форму. Я не хочу (и не ожидаю, что это будет вызвано), когда я вызываю метод вручную. Во всяком случае, Дарин резюмировал мою проблему. Итог - я не думаю, что мне следует использовать TempData, я должен использовать Session. - person RPM1984   schedule 03.10.2011