2013-01-08 62 views
0

我有一個ASP.NET MVC4嚮導。爲了一步一步地傳遞一個大的視圖模型,我使用期貨套件。序列化我的模型與瀏覽器刷新後Html.Deserialize失去TempData

@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」)控制器中的下一個操作

Everything wo只要瀏覽器通過使用F5或菜單無法刷新,就很好。在這一點上,控制器再次被調用。控制器已經有一個模型,但TempData不會再保存。

但有兩個枚舉屬性丟失。它們在之前的步驟中使用。他們通過RadiobuttonFor綁定了視圖。

那麼爲什麼有一個模型是不完整的?

在此先感謝 csteinmueller

回答

0

對於任何應該活得比1個請求,你不應該使用TempData。使用Session或其他一些更長期的存儲機制。

TempData旨在從字典中讀出值後刪除值。這就是爲什麼TempDataDictionary有像PeekKeep方法。這些方法可以讓你明確地告訴字典「嘿,在我讀完它之後不要刪除這個值」,因爲默認情況下,它在讀取它後刪除了這個值。

+0

在這種情況下調用Keep方法。我讀過的mvc3嚮導中的howto使用了TempData。不是會話用戶的基礎?因爲一個用戶可能會實例化多個嚮導。這是一個外部合作伙伴的諮詢應用程序。 – csteinmueller

+0

是的,會話是每個用戶。但是,TempData使用Session作爲其基礎數據存儲(默認情況下),因此它也是每個用戶。如果您希望允許用戶生成多個嚮導,則應該在應用程序級別管理這些單獨的嚮導(例如,如果您選擇繼續使用該向導,則可以在會話或TempData中存儲Wizard []數組)。 – danludwig

+0

感謝您對TempData和Session的澄清。此刻,我懶得讀入tempdata。這是由mvc3嚮導教程建議的。我將在tempdata或session中接受與嚮導數組結合的答案。我認爲這會解決我的問題。 – csteinmueller