Sự khác biệt giữa ViewData và TempData?


94

Tôi biết ViewData là gì và sử dụng nó mọi lúc, nhưng trong ASP.NET Preview 5, họ đã giới thiệu một thứ mới gọi là TempData.

Tôi thường gõ mạnh ViewData của mình, thay vì sử dụng cách tiếp cận từ điển của các đối tượng.

Vì vậy, khi nào tôi nên sử dụng TempData thay vì ViewData?

Có phương pháp nào tốt nhất cho việc này không?


Tôi sẽ muốn thêm một cái gì đó về TempDatađây stackoverflow.com/a/17199709/2015869
Imad Alazani

Câu trả lời:


94

Trong một câu: TempDatagiống như ViewData với một điểm khác biệt: Chúng chỉ chứa dữ liệu giữa hai yêu cầu liên tiếp, sau đó chúng bị hủy. Bạn có thể sử dụng TempDatađể chuyển thông báo lỗi hoặc một cái gì đó tương tự.

Mặc dù lỗi thời, bài viết này có mô tả tốt về TempDatavòng đời.

Như Ben Scheirman đã nói ở đây :

TempData là một từ điển lưu trữ tạm thời được hỗ trợ theo phiên có sẵn cho một yêu cầu duy nhất. Thật tuyệt khi chuyển tin nhắn giữa các bộ điều khiển.


Tôi nghĩ đó là một sự khác biệt khá lớn, trong đó TempDatasẽ bao gồm một cái gì đó nhiều phức tạp (phiên) có khả năng hơn một từ điển đơn giản được truyền từ phương pháp phương pháp
Matti Virkkunen

29

Khi một hành động trả về kết quả RedirectToAction, nó gây ra chuyển hướng HTTP (tương đương với Response.Redirect). Dữ liệu có thể được lưu giữ trong thuộc tính TempData (từ điển) của bộ điều khiển trong thời gian của một yêu cầu chuyển hướng HTTP duy nhất.


Giá trị của ViewData có được giữ nguyên trong trường hợp tương tự không?
IsmailS

9
@Ismail: Không, ViewData sẽ không bảo toàn dữ liệu thông qua Redirect. Đó là điểm khác biệt chính của TempData.
Mariano Desanze

5

Xem dữ liệu:

  • ViewData là một loại từ điển public ViewDataDictionary ViewData { get; set; }
  • Nó có thể được sử dụng để chuyển dữ liệu từ bộ điều khiển sang chế độ xem, một cách duy nhất
  • Đó là cuộc sống chỉ nằm trong yêu cầu hiện tại
  • Nếu truyền chuỗi thì không cần gõ
  • Nếu truyền đối tượng thì bạn cần đánh máy nhưng trước đó bạn cần kiểm tra xem nó có phải là null không
  • Thuộc tính của nó trên ControllerBase, là cha của Controllerlớp

TempData:

  1. TempDatasử dụng nội bộ TempDataDictionary:public TempDataDictionary TempData { get; set; }
  2. Sau khi dữ liệu được lưu vào TempDataDictionaryđối tượng:
    • Nó tồn tại trong đó và có thể được đọc từ bất kỳ chế độ xem nào hoặc bất kỳ hành động nào trong bất kỳ bộ điều khiển nào
    • Nó chỉ có thể được đọc một lần; một khi đọc, nó trở thành rỗng
    • Nó được lưu vào phiên để khi hết hạn dữ liệu phiên sẽ bị mất.

Hành vi này là mới từ ASP.NET MVC 2 và các phiên bản mới hơn. Trong các phiên bản trước của ASP.NET MVC, các giá trị trong TempDatachỉ có sẵn cho đến khi có yêu cầu tiếp theo.

  1. Nó vẫn tồn tại, cho đến khi nó được đọc hoặc phiên hết hạn và có thể được đọc từ mọi nơi.

Xem chi tiết so sánh ViewData, ViewBag, TempData và Session trong MVC



0

dữ liệu dạng xem được sử dụng khi chúng ta muốn truyền dữ liệu từ bộ điều khiển đến dạng xem tương ứng. dữ liệu xem có tuổi thọ rất ngắn, điều đó có nghĩa là nó sẽ bị phá hủy khi xảy ra chuyển hướng. Ví dụ (Bộ điều khiển):

public ViewResult try1()
    {
        ViewData["DateTime"] = DateTime.Now;
        ViewData["Name"] = "Mehta Hitanshi";
        ViewData["Twitter"] = "@hitanshi";
        ViewData["City"] = "surat";
        return View();
    }

try1.cshtm

<table>
<tr>
    <th>Name</th>
    <th>Twitter</th>
    <th>Email</th>
    <th>City</th>
    <th>Mobile</th>
</tr>
<tr>
    <td>@ViewData["Name"]</td>
    <td>@ViewData["Twitter"]</td>
    <td>@ViewData["City"]</td>
</tr>
</table> 

TempData chuyển dữ liệu giữa các bộ điều khiển hoặc giữa các hành động. Nó được sử dụng để lưu trữ các tin nhắn một lần và tuổi thọ của nó rất ngắn. Chúng ta có thể sử dụng TempData.Keep () để làm cho nó có sẵn thông qua tất cả các hành động hoặc để làm cho nó tồn tại lâu dài.

Ví dụ (Bộ điều khiển):

public ActionResult try3()
    {
        TempData["DateTime"] = DateTime.Now;
        TempData["Name"] = "Ravina";
        TempData["Twitter"] = "@silentRavina";
        TempData["Email"] = "Ravina12@gmail.com";
        TempData["City"] = "India";
        TempData["MobNo"] = 9998975436;
        return RedirectToAction("TempView1");
    }
    public ActionResult TempView1()
    {
        return View();
    }

TempView1.cshtm

<table>
<tr>
    <th>Name</th>
    <th>Twitter</th>
    <th>Email</th>
    <th>City</th>
    <th>Mobile</th>
</tr>
<tr>
    <td>@TempData["Name"]</td>
    <td>@TempData["Twitter"]</td>
    <td>@TempData["Email"]</td>
    <td>@TempData["City"]</td>
    <td>@TempData["MobNo"]</td>
</tr>
</table>

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.