結論: ViewData 適用於 在一次請求中 傳遞數據 . 比如我們從 主Action 到 主視圖, 然后在 主視圖中 用 RenderAction 請求子Action的時候,就是算作 一次請求.
場景,我們在 主頁面中,有一個 login登陸模塊, 我們判斷,如果 用戶是登陸的,那么就顯示 賬號密碼, 如果用戶沒有登陸, 則顯示 登陸框
先來看看 我們的代碼先運行 /home/index 這個Action 然后到了前台之后, 前台的CShtml中 直接使用 Html.RendyAction 來調用子視圖.
我們先來試試 ViewBag 能否傳遞值給 子Action中呢?
前台生成
那我們現在來試試 TempData 來傳遞數據試試
最后生成的html代碼
注意,這里返回 視圖(Return View) 和 返回 分部視圖 ( Return PartialView)的區別是什么呢?
直白一點就是, 完整視圖 Return View 會先去執行 ViewStart.cshtml , 如果ViewStart.cshtml中有指定Layout屬性,那么還會執行這個Layout的頁面
如果是返回 分部視圖 Return PartialView ,則不執行 ViewStart.cshtml ,直接運行分部視圖.
舉一個例子 : 假如我們請求的頁面是 /Product/Index的時候 , 如果在根目下的ViewStart.cshtml中有一段代碼,並且在Product文件夾下的ViewStart也有代碼,那么到最后的目標視圖 index中也有代碼,這3種代碼是如何排序的?
答案是,依次進行 比如 根Viewstart中有的代碼,會排在 Product下的viewstart的前面,然后把這2者的代碼,又會帶到 目標Index視圖的前面,最后,把這3者的代碼,回填到ViewStart中指定的 layout.cshtml (默認視圖) 里面的 RendyBody處 (如果在目標index中,有section節點,那么Section節點會回填到 layout.cshtml中的 RenderSection 處)
具體的也可以看看這篇文章 EF5+MVC4系列(10) mvc的布局頁面 _ViewStart.Cshtml
二 : Tempdata的高級用法,注冊或者填寫表單的時候,將注冊的資料不清空,重新返回給前台頁面顯示注冊資料
場景:我們有時候在注冊的時候,或者是其他填寫表單的時候,如果通過了前台驗證,但是后台驗證不過,這個時候,為了更用戶一個良好的用戶體驗,可以將用戶填寫數據,再次返回給前台頁面上顯示出來,這樣,用戶只需要修改部分信息就可以了,不用全部重新輸入一次
我發現這個沒有什么用…直接return view的時候,把 post提交的 model 當做 view的返回值 model 就可以直接傳給前台了
前台只要設置了 @model Joey.Model.Play 設置了當前頁面的Model屬性,就可以直接拿上次你提交的不成功的數據了
三: Tempdata 應用例子,通過Tempdata 實現添加數據時防止頁面刷新出現重復提交數據的情況:
參考 http://www.cnblogs.com/zgqys1980/archive/2012/08/16/2641922.html