Asp.net
在重定向時傳遞消息以在 ASP.NET MVC 中查看
我有一個類似於 ASP.NET MVC 線上商店的應用程序,它有兩個視圖:
- 項目的頁面(照片、描述等)
- 使用者可以留下評論的表單
使用者成功送出表單後,應將其重定向回項目頁面,並在頂部顯示一條一次性消息:“您的評論已成功送出”。
控制器程式碼(簡化)如下所示:
[HttpGet] public ActionResult ViewItem([Bind] long id) { var item = _context.Items.First(x => x.Id == id); return View(item); } [HttpGet] public ActionResult AddReview() { return View(); } [HttpPost] public ActionResult AddReview([Bind] long id, [Bind] string text) { _context.Reviews.Add(new Review { Id = id, Text = text }); _context.SaveChanges(); return RedirectToAction("ViewItem"); }有幾個要求要滿足:
- 如果使用者刷新項目的頁面,則該消息不得再次顯示。
- 消息不得污染 URL。
- 控制器方法不能合併為一個。
我正在考慮將消息儲存在使用者會話中並在顯示後將其丟棄,但可能有更好的解決方案嗎?
通過使用tempdata,您可以將消息或數據(字元串/對象)從一個頁面傳遞到另一個頁面,並且它僅在一個操作到另一個操作時有效。
關於 tempdata 的一些關鍵點:
- TempData 是 ControllerBase 類的屬性。
- TempData 用於將數據從目前請求傳遞到後續請求(意味著從一個頁面重定向到另一個頁面)。
- 它的生命很短,直到目標視圖完全載入。
- 獲取數據和檢查空值以避免錯誤需要進行類型轉換。
- 它僅用於儲存一次消息,如錯誤消息、驗證消息。要使用 TempData 持久化數據,請參閱這篇文章:使用 TempData 持久化數據
在您的控制器中:
[HttpPost] public ActionResult AddReview([Bind] long id, [Bind] string text) { _context.Reviews.Add(new Review { Id = id, Text = text }); _context.SaveChanges(); TempData["message"] = "someMessage"; return RedirectToAction("ViewItem"); }在您的視圖頁面中:
@TempData["message"]; //TempData["message"].ToString();