Конфликт шаблона MVC PRG с SessionState

У меня есть веб-приложение MVC3. В этом я использовал шаблон PRG (Post-Redirect-Get). То есть во время обратной передачи, если какая-либо проверка модели не удалась, я сохраняю ViewData в TempData и затем перенаправить на исходное действие GET.

В пост действия -

if (!ModelState.IsValid)
    TempData["ViewData"] = ViewData;

Позже в действии GET -

if (TempData["ViewData"] != null)
    ViewData = (ViewDataDictionary)TempData["ViewData"];

Это почти обычная практика. Все работает нормально до настоящего времени. Теперь нам нужно улучшить постоянство сеанса, то есть нам нужны "более длинные" сеансы. Я решил использовать ASP.Net State Сервер.

После того, как я перенес свою сессию на State Server -

web.config - 
<system.web> ... 
<sessionState timeout="180" mode="StateServer" cookieless="UseCookies" />  
...

Я начал получать ошибки «невозможно сериализовать» для некоторых моих сеансов, в которых хранились пользовательские объекты. Я создал такие объекты [Serializable], которые решили проблему. Но теперь я застрял в приведенном выше шаблоне PRG!

Ошибка. Тип «System.Web.Mvc.ViewDataDictionary» в сборке «System.Web.Mvc, версия = 3.0.0.0, культура = нейтральная, PublicKeyToken = 31bf3856ad364e35» не помечен как сериализуемый.

Странно, я не могу найти ни одной темы, которая разделяет мой сценарий. Кто-нибудь?


person Hemant Tank    schedule 09.01.2013    source источник


Ответы (1)


Тот факт, что TempData хранится в сеансе, а мой сеанс, в свою очередь, хранится во внешнем процессе, требующем, чтобы все сохраняемое было "Сериализуемым".

Такие объекты, как ViewDataDictionary или даже ModelStateDictionary, НЕ являются [сериализуемыми]. Для MVC PRG мне просто нужно передать ошибки состояния модели и недопустимый объект.

Я уже пометил объект как [Serializable] (я использую сериализатор xml, чтобы «строчить» мой объект, а затем сохранить его, потому что это сущность L2S, поэтому также нужно избегать циклических ссылок). Ссылка SO Post

TempDate["modelToPass"] = Serialization.Serialize<MyModel>(modelToPass);

Точно так же я могу перевести свой объект ModelState (только для ошибок) в «более простой» объект и преобразовать его во что-то вроде

KeyValuePair<string,List<string>>[]

Короче говоря, я пытаюсь сделать свое состояние модели и объект модели «сериализуемым», чтобы я мог поместить их в TempData и сохранить шаблон PRG.

Есть и другие подходы к развертыванию наших собственных TempData и сохранению TempData в файлах cookie и т. д., но я не хочу усложнять ситуацию. Дайте мне знать, если у кого-то есть лучшее решение для этого.

Некоторые реф-адреса

person Hemant Tank    schedule 11.01.2013