Tương tự ViewData và ViewBag, TempData cũng dùng để truyền dữ liệu ra view. Tuy nhiên sẽ hơi khác một chút, đó là TempData sẽ tồn tại cho đến khi nó được đọc. Tức là ViewBag ViewData chỉ hiển thị được dữ liệu ngay tại trang người dùng truy cập, còn TempData có thể lưu lại và hiển thị ở một trang sau đó và nó chỉ biến mất khi người dùng đã "đọc" nó.

TempData

TempData thường được ứng dụng để hiển thị các thông báo thành công, thất bại ở trang kế tiếp.

 

Ví dụ với ứng dụng Quản lý Book có 2 trang Danh sách Book và Tạo mới Book.

Khi người dùng Tạo mới Book xong sẽ được chuyển qua trang Danh sách Book kèm một thông báo tạo book thành công. Lúc này chúng ta sẽ không thể dùng ViewBag hay ViewData để lưu thông báo được vì thông báo nằm ở trang khác (Action khác). Chúng ta sẽ dùng TempData để lưu thông báo ở trang Tạo mới Book và hiển thị ra ở trang Quản lý Book

public class BookController : Controller
{
    // Trang Tạo mới Book
    public IActionResult Create()
    {
        // Logic tạo mới Book ...

        // Lưu message vào TempData
        TempData["StatusMessage"] = "Create book successfully";

        // Điều hướng sang trang Danh sách Book
        return RedirectToAction(nameof(Index));
    }

    // Trang Danh sách Book
    public IActionResult Index() 
    {
        // Logic hiển thị Book ...

        // Render View
        return View();
    }
}

 

Ngoài View của trang Danh sách Book chỉ việc hiển thị message: 

@TempData["StatusMessage"]

 

Một cách khác đó là tạo một thuộc tính cho Controller và gán cho nó Attribute TempData sau đó sử dụng thuộc tính đó để lưu message: 

public class BookController : Controller
{
    [TempData]
    public string StatusMessage { get; set; }

    ...
}

 

TempData Provider

Có 2 loại TempData Provider là cookie-based (lưu dữ liệu trong Cookie) và session-base (lưu dữ liệu trong Session). Việc chọn loại Provider nào là tùy mục đích sử dụng:

  • Trong ứng dụng có cần dùng đến Session state hay không, nếu không thì nên dùng cookie-based provider.
  • Nếu dữ liệu lưu trong TempData lớn thì nên dùng session-based provider vì Cookie có thể bị hạn chế dung lượng bởi trình duyệt và sẽ làm tăng thêm chi phí request (cost).

Mặc định ASP.NET Core 2 sử dụng cookie-base provider, để chuyển qua dùng session-base provider thì ta sẽ phải cấu hình trong file Startup.cs

public void ConfigureServices(IServiceCollection services)
{
    services.AddMvc().AddSessionStateTempDataProvider();
    services.AddSession();
}

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
    app.UseSession();
    app.UseMvcWithDefaultRoute();
}