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, Эти методы позволяют явно указать словарю "эй, не удаляйте это значение после того, как я прочитал его", потому что по умолчанию оно действительно удаляет значение после того, как вы его прочитали.

Другие вопросы по тегам