Html.Deserialize теряет TempData после обновления браузера
У меня есть мастер ASP.NET MVC4. Чтобы пройти одну большую модель от шага к шагу, я использую фьючерсную сборку. Я сериализую свою модель с
@Html.Serialize("model", Model, SerializationMode.Signed);
и десериализовать его в контроллерах
protected override void OnActionExecuting(ActionExecutingContext filterContext)
{
var serialized = Request.Form["model"];
if (serialized != null)
{
model = (BausparViewModel)new MvcSerializer().Deserialize(serialized, SerializationMode.Signed);
TryUpdateModel(model);
}
...
}
Я установил TempData в
protected override void OnResultExecuted(ResultExecutedContext filterContext)
{
if (filterContext.Result is RedirectToRouteResult)
TempData["model"] = model;
}
Каждый шаг мастера имеет свое собственное представление, и я управляю предыдущими / следующими действиями в контроллере с помощью RedirectToAction("ActionName")
Все работает нормально, пока браузер не обновляется с помощью F5 или меню. В этот момент контроллер снова вызывается. Контроллер уже имеет модель, хотя TempData не сохраняется снова.
Но отсутствуют два свойства enum. Они используются в предыдущих шагах. Они связаны с видом через RadiobuttonFor.
Так почему же существует модель, которая является неполной?
Заранее спасибо csteinmueller
1 ответ
Для всего, что должно жить дольше, чем 1 запрос, вы не должны использовать TempData
, использование Session
или какой-то другой механизм долгосрочного хранения.
TempData
предназначен для удаления значения после его чтения из словаря. Вот почему TempDataDictionary
имеет такие методы, как Peek
а также Keep
, Эти методы позволяют явно указать словарю "эй, не удаляйте это значение после того, как я прочитал его", потому что по умолчанию оно действительно удаляет значение после того, как вы его прочитали.