在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作為數據的承接。
