2012-07-23 50 views
0

在我的要求中,所有視圖都應該能夠根據控制器中Actions中發生的情況顯示通知。現在的實現是在所有需要顯示通知的模型中繼承的BaseModel。然後,具有此要求的任何視圖只需調用:ASP.NET MVC渲染通知數據(如通知)

@{ Html.RenderPartial("MessageCtrl", Model); } 

並且會呈現通知。這工作在一個動作直接返回一個視圖的情況下罰款,並在操作這樣的通常處理:

model.SetMessage(response); 
return View(model); 

...其中SetMessage更新從返回的對象模型的通知相關的屬性我服務。所有響應都實現了我創建的名爲IResponse的接口,因此消息傳遞可以在整個過程中處理。

當我需要從其他操作返回視圖並仍顯示通知時,問題就會出現。

例如,在我的EditUser操作中,如果編輯成功,我想顯示索引視圖。爲了從EditUser操作中實現此目的,我需要返回RedirectToAction(因爲只是返回視圖將返回正確的視圖,並顯示不正確的URL,表明它是EditUser)。但是,RedirectToAction失去了我的模型和BaseModel的所有概念,所以在它重定向的時候,它已經失去了我的通知。我知道我可以使用RouteValues,但是這打破了使用通用基礎模型驅動通知方法的目的。我甚至看過ViewBag(通常我將它視爲MVC的醜陋部分),但發現ViewBag只在一次請求的生命週期內持續存在,並且使用RedirectToAction時,ViewBag在到達目標時再次爲空行動。另一個想法是將它存儲在會話對象中,但對我來說這聽起來很醜陋。

這看起來像是一個非常標準的要求。有沒有一種標準化的方法可以將通用數據(如通知)傳遞給不同的視圖,通過RedirectToAction來支持查詢字符串?

回答

1

我認爲您正在尋找TempData,它只在一次重定向中保持會話中的數據。

+0

偉大的斯科特!聽起來不錯! – Arkiliknam 2012-07-23 16:22:56

+0

爲了讓您的代碼看起來乾淨乾爽,您可以重寫OnActionExecuting並檢查TempData是否包含您的消息並將其指定給您的模型屬性。 – scottm 2012-07-23 16:24:08

+0

這聽起來像個好主意。我會玩一玩。 – Arkiliknam 2012-07-23 16:25:13