ASP.NET MVC TempData используется для неправильного запроса

Я использую TempData для сохранения ModelState во время перенаправления (с использованием техники MvcContrib). Это прекрасно работает. Однако в редких случаях пользователь прерывает запрос, а затем немедленно запускает другой (например, быстро нажимает на другой пункт меню). Это приводит к появлению ошибок ModelState на той странице, которой он не принадлежит.

Проблема в том, что TempData хранится в Session. Это означает, что ЛЮБОЙ запрос может захватить его, например тот, который приходит на сервер первым.

Есть ли какие-нибудь обходные пути? Например. сохранить «целевую страницу» в TempData вместе с сохраненным ModelState.


person queen3    schedule 25.03.2010    source источник


Ответы (1)


На мой взгляд, TempData следует только использовать в действиях с немедленной переадресацией. Например:

public ActionResult Index()
{
    TempData["foo"] = "bar";
    return RedirectToAction("About");
}

public ActionResult About() 
{
    var foo = TempData["foo"];
    return View();
}

Вам следует избегать сохранения чего-либо в TempData и визуализации представления:

public ActionResult Index()
{
    TempData["foo"] = "bar";
    // bad :-(
    return View("About");
}

Используйте сеанс, чтобы достичь того, что вы ищете, или добавьте уникальный идентификатор, который позволит вам определить правильный запрос.

Другой распространенный метод, который вы можете использовать вместо TempData, - это сериализовать модель на клиенте (что-то вроде ViewState, если хотите).

person Darin Dimitrov    schedule 25.03.2010
comment
У меня вопрос именно о действиях, которые перенаправляют немедленно. Проблема не возникнет, если я просто визуализирую представление после назначения временных данных. И TempDate DO использует Session, поэтому этот совет не имеет смысла. Сама проблема в том, что нет такой вещи, как немедленное перенаправление - другой запрос, вызванный щелчком пользователя, может прервать его и поступить следующим. Что касается сериализации ModelState в представлении, я подумал, но спасибо за ссылку. - person queen3; 25.03.2010
comment
Нет, я не могу сериализовать в поле зрения. Поток - получить POST - проверить ошибки - установить ModelState - перенаправить на страницу, которая показывает сообщения. Нет просмотра между ошибками проверки и страницей, на которой отображаются сообщения. - person queen3; 25.03.2010