Asp.net

在重定向時傳遞消息以在 ASP.NET MVC 中查看

  • March 16, 2015

我有一個類似於 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 的一些關鍵點:

  1. TempData 是 ControllerBase 類的屬性。
  2. TempData 用於將數據從目前請求傳遞到後續請求(意味著從一個頁面重定向到另一個頁面)。
  3. 它的生命很短,直到目標視圖完全載入。
  4. 獲取數據和檢查空值以避免錯誤需要進行類型轉換。
  5. 它僅用於儲存一次消息,如錯誤消息、驗證消息。要使用 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();

引用自:https://stackoverflow.com/questions/29075104