在ASP.NET MVC中有東西叫TempData,它的類型是TempDataDictionary,它與ViewData以及ViewBag的不同之處在於
它的內部是使用session來保存信息的,可以理解為暫存的意思。雖然是通過session在保存信息,但它的生命周期是“一次網頁的請求”。
利用這一點,我們可以用它在做MVC 中action之間的傳值。以下是我傳值的一點經驗,高手請忽略,呵呵。
假如我們有一張學生管理的頁面,其中有學生添加功能,以及學生展示列表。我們是通過一個Action來展示所有信息的,就像是web form一樣
那么在controller中會有這樣一個action
[HttpGet] public ActionResult Students() { ViewBag.title = "Add Student Page"; ViewBag.jsMessage = TempData["jsMessage"] == null ? "" : TempData["jsMessage"].ToString();//判斷並給ViewBag賦值 return View(StudentsPage_Load()); }
要添加學生我們就必須有一個Add action如下:
[HttpPost] public ActionResult Add(Students student) { if (ModelState.IsValid) { StudentsBLL bll = new StudentsBLL(); bll.Add(student); TempData["jsMessage"] = "alert('success');";//利用TempData暫存數據 } return RedirectToAction("Students"); }
請注意上述代碼中的注釋部分,它是說添加成功之后,返回原有的頁面。也就是說這個Add action並沒有對應的view。
那么在添加學生成功之后要在原有的頁面中用JS彈出一個添加成功的對話框。可以在Students的View中這樣寫
<script type="text/javascript"> @Html.Raw(@ViewBag.jsMessage) </script>
其中@Html.Raw是表示不對輸出進行轉義。這里有個地方要注意。如果直接在cshtml文件中寫
TempData["jsMessage"]則會輸出轉義后的字符。但如果這樣寫的話:
@Html.Raw(TempData["jsMessage"])
頁面的編譯將會報錯。所以必須在Students這個Action中加入
ViewBag.jsMessage作為數據的承接。