Sự khác biệt giữa ViewData và ViewBag là gì?


Câu trả lời:


388

Nó sử dụng tính năng động C # 4.0. Nó đạt được mục tiêu tương tự như viewdata và nên tránh sử dụng các mô hình khung nhìn được gõ mạnh (giống như cách nhìn của viewdata).

Vì vậy, về cơ bản, nó thay thế các chuỗi ma thuật :

ViewData["Foo"]

với các thuộc tính ma thuật :

ViewBag.Foo

mà bạn không có thời gian biên dịch an toàn.

Tôi tiếp tục đổ lỗi cho Microsoft vì đã từng giới thiệu khái niệm này trong MVC.

Tên của các thuộc tính là trường hợp nhạy cảm.


11
Vì mục đích gì bạn đang đổ lỗi cho microsoft? Nếu không có viewdata, làm thế nào chúng ta có thể liên kết danh sách thả xuống từ mô hình. (Tôi không nghĩ sử dụng danh sách chọn trong mô hình sẽ là một ý tưởng hay)
Subin Jacob

15
@SubinJacob Bạn thực sự nên đặt một câu hỏi mới nếu bạn muốn có câu trả lời cho vấn đề này. Tạo một danh sách chọn chắc chắn là cách để tạo một danh sách thả xuống.
MiniRagnarok

25
Tôi nghĩ đó là một chút chủ quan. Các mô hình được gõ mạnh là tốt và yada yada, nhưng đối với các trường hợp bạn nhanh chóng nhận được và xem, ViewBag và tương tự thực hiện công việc nhanh hơn Trình điều khiển, Chế độ xem, Mô hình, AutoMapper cho ViewModel, v.v.
Craig Brett

11
@Darin, tại sao bạn lại "đổ lỗi" cho Microsoft vì đã giới thiệu điều này? Nó chỉ là một công cụ được trao cho các nhà phát triển. Nếu bạn biết những gì bạn đang làm, bạn có thể tận dụng tối đa nó. Nếu bạn không thích nó hoặc cảm thấy dễ bị lỗi hơn, chỉ cần không sử dụng nó. :)
Bilal Fazlani 15/03/2015

5
Làm thế nào bạn đề nghị chuyển dữ liệu giữa các phần và bố cục? Mọi người đổ lỗi khi họ không nhìn thấy bức tranh đầy đủ. Tôi tưởng tượng bạn có các trình điều khiển cơ sở và các mô hình xem cơ sở hoặc các đối tượng tĩnh / singletons ở mọi nơi. Đoán xem, học tốt hơn để sử dụng xem dữ liệu và tự trách mình vì đã sử dụng công cụ sai cho công việc.
Bart Calix đến

42

Các thuộc tính ViewBag bên trong được lưu trữ dưới dạng cặp tên / giá trị trong từ điển ViewData .

Lưu ý: trong hầu hết các phiên bản tiền phát hành của MVC 3, thuộc tính ViewBag được đặt tên là ViewModel như được lưu ý trong đoạn trích này từ ghi chú phát hành MVC 3:

(chỉnh sửa 10-8-12) Tôi đã đề xuất tôi đăng nguồn thông tin này tôi đã đăng, đây là nguồn: http://www.asp.net/whitepapers/mvc3-release-notes#_Toc2_4

Bộ điều khiển MVC 2 hỗ trợ thuộc tính ViewData cho phép bạn truyền dữ liệu đến mẫu xem bằng API từ điển bị ràng buộc muộn. Trong MVC 3, bạn cũng có thể sử dụng cú pháp có phần đơn giản hơn với thuộc tính ViewBag để thực hiện cùng một mục đích. Ví dụ: thay vì viết ViewData ["Tin nhắn"] = "văn bản", bạn có thể viết ViewBag.Message = "văn bản". Bạn không cần định nghĩa bất kỳ lớp nào được gõ mạnh để sử dụng thuộc tính ViewBag. Vì nó là một thuộc tính động, thay vào đó bạn chỉ có thể lấy hoặc đặt các thuộc tính và nó sẽ giải quyết chúng một cách linh hoạt trong thời gian chạy. Trong nội bộ, các thuộc tính ViewBag được lưu trữ dưới dạng cặp tên / giá trị trong từ điển ViewData. (Lưu ý: trong hầu hết các phiên bản tiền phát hành của MVC 3, thuộc tính ViewBag được đặt tên là thuộc tính ViewModel.)


Câu hỏi hỏi sự khác biệt giữa ViewDataViewBag, không phải về ViewModel.
Matthew Flaschen

Cảm ơn Matthew Flaschen, người đã đánh máy, tôi đã sửa lỗi chính tả, bây giờ đọc "ViewData" thay vì ViewModel là một lỗi. :)
Rich Bianco

Bây giờ không chính xác. Không được đổi tên thành khác. Cả hai vẫn tồn tại. Một là dynamicvà hỗ trợ ViewBag.Message. Một sử dụng ViewData["Message"]cú pháp cũ .
Matthew Flaschen

1
+1 Nhưng, bạn đang trích dẫn nguồn nào từ ...? Nên thực sự cung cấp một liên kết.
Sam

1
Cảm ơn Sam đã gợi ý. Tôi đã thêm một liên kết đến nguồn ban đầu.
Rich Bianco

34

ViewBag vs ViewData trong MVC

http://royalarun.blogspot.in/2013/08/viewbag-viewdata-tempdata-and-view.html

Điểm tương đồng giữa ViewBag & ViewData:

Giúp duy trì dữ liệu khi bạn chuyển từ bộ điều khiển sang chế độ xem. Được sử dụng để truyền dữ liệu từ bộ điều khiển để xem tương ứng. Cuộc sống ngắn có nghĩa là giá trị trở thành vô giá trị khi chuyển hướng xảy ra. Điều này là do mục tiêu của họ là cung cấp một cách để giao tiếp giữa các bộ điều khiển và các khung nhìn. Đó là một cơ chế giao tiếp trong cuộc gọi máy chủ.

Sự khác biệt giữa ViewBag & ViewData:

ViewData là một từ điển của các đối tượng được lấy từ lớp ViewDataDipedia và có thể truy cập bằng cách sử dụng các chuỗi làm khóa. ViewBag là một thuộc tính động tận dụng các tính năng động mới trong C # 4.0. ViewData yêu cầu typecasting cho loại dữ liệu phức tạp và kiểm tra các giá trị null để tránh lỗi. ViewBag không yêu cầu typecasting cho loại dữ liệu phức tạp.

Ví dụ về ViewBag & ViewData:

public ActionResult Index()
{   
    ViewBag.Name = "Arun Prakash";   
    return View();
}

public ActionResult Index()
{  
    ViewData["Name"] = "Arun Prakash";  
    return View();
}   

Gọi trong Xem

@ViewBag.Name    
@ViewData["Name"]

7
câu trả lời của bạn cho biết typecastingnhưng bạn đã không hiển thị cách thực hiện typecasting
Alex

31

ViewData: Nó yêu cầu truyền kiểu cho các kiểu dữ liệu phức tạp và kiểm tra các giá trị null để tránh lỗi.

ViewBag: Nó không yêu cầu truyền kiểu cho các kiểu dữ liệu phức tạp.

Hãy xem xét ví dụ sau:

public class HomeController : Controller
{
    public ActionResult Index()
    {
        var emp = new Employee
        {
            EmpID=101,
            Name = "Deepak",
            Salary = 35000,
            Address = "Delhi"
        };

        ViewData["emp"] = emp;
        ViewBag.Employee = emp;

        return View(); 
    }
}

Và mã cho Viewnhư sau:

@model MyProject.Models.EmpModel;
@{ 
 Layout = "~/Views/Shared/_Layout.cshtml"; 
 ViewBag.Title = "Welcome to Home Page";
 var viewDataEmployee = ViewData["emp"] as Employee; //need type casting
}

<h2>Welcome to Home Page</h2>
This Year Best Employee is!
<h4>@ViewBag.Employee.Name</h4>
<h3>@viewDataEmployee.Name</h3>

6
giúp tôi hủy bỏ nhưng tôi nghĩ có một sai lầm. điều này <h4>@ViewBag.emp.Name</h4> sẽ thay đổi thành<h4>@ViewBag.Employee.Name</h4>
Benny Margalit

24

Tất cả các câu trả lời cho thấy rằng ViewBagvà / hoặc ViewDatalà truyền dữ liệu từ ControllerđếnViews đó là thông tin sai lệch. cả hai đều rất hữu ích để truyền dữ liệu từ Chế độ xem sang Bố cục hoặc Một phần cho Chế độ xem (hoặc ViewComponents, v.v.) Nó không phải là bộ điều khiển độc quyền.

như mẫu asp.net mặc định có cái này trong trang bố cục:

<title>@ViewData["Title"] - MyApp</title>

và trong bất kỳ quan điểm nào

ViewData["Title"] = "Details";

Vì vậy, sau đó, để đặt câu hỏi: "sự khác biệt giữa ViewBagViewData ?"

Sự khác biệt đáng chú ý nhất là ViewDataTừ điển đánh máy mạnh trong khi ViewBag là loại động.

Lưu ý rằng dữ liệu bên trong LÀ CÙNG

ViewData["Title"] = "MyTitle";
ViewBag.Title; // returns "MyTitle";

Khi nào nên sử dụng cái này hay cái khác?

  • ViewBagkhông hỗ trợ tên C # không hợp lệ. bạn không thể truy cập ViewData["Key With Space"]vớiViewBag
  • ViewBag.Something là động và bạn có thể gặp vấn đề khi gọi các phương thức (như phương thức mở rộng) cần biết tham số chính xác tại thời điểm biên dịch.
  • ViewBag có thể kiểm tra nulls cú pháp sạch hơn: ViewBag.Person?.Name
  • ViewDatacó tất cả các thuộc tính của một từ điển như ContainsKey, Addvv, do đó bạn có thể sử dụngViewData.Add("somekey", "somevalue") giữ trong tâm trí nó có thể ném ngoại lệ.
  • Sử dụng ViewDatatrên các khung nhìn cần TypeCasting trong khi ViewBagkhông.

Biết được sự khác biệt tinh tế, sử dụng cái này hay cái khác là một sở thích nhiều hơn.

Thông thường bạn có thể nghĩ ViewBag.AnyKeyđến một bí danhViewData["AnyKey"]


1
Đây phải là một câu trả lời được chấp nhận!
Pashale Prashant

14

Tôi có thể khuyên bạn không nên sử dụng không?

Nếu bạn muốn "gửi" dữ liệu đến màn hình của mình, hãy gửi một đối tượng được gõ mạnh (AKA ViewModel) vì việc kiểm tra sẽ dễ dàng hơn.

Nếu bạn liên kết với một số loại "Model" và có các mục "viewbag" hoặc "viewdata" ngẫu nhiên thì việc kiểm tra tự động rất khó khăn.

Nếu bạn đang sử dụng những điều này, hãy xem xét làm thế nào bạn có thể tái cấu trúc và chỉ sử dụng ViewModels.


4
Bỏ qua "trình biên dịch là bài kiểm tra đơn vị đầu tiên", làm thế nào một mô hình khung nhìn được gõ tĩnh làm cho mã của bạn dễ kiểm tra hơn một kiểu động? Trong khi yêu cầu đối với các bài kiểm tra là quan trọng hơn trong một giải pháp được gõ động, nếu cả hai giải pháp đều thực hiện cùng một số lượng và loại thử nghiệm thì bạn chẳng mất gì.
Darren Lewis

Tôi đồng ý, nó hơi mơ hồ. Có lẽ intellisense có liên quan.
Joshua Ramirez

1
Một ví dụ sẽ là chế giễu. Nếu bạn muốn đơn vị kiểm tra một hành động của bộ điều khiển, việc tạo một đối tượng "giả" để vượt qua và khẳng định sẽ dễ dàng hơn thay vì cố gắng khẳng định rằng một số chuỗi đã được thêm vào từ điển hoặc một số trường động được đặt thành một giá trị nào đó - đó là một khái niệm tương tự như hợp đồng dịch vụ có một đối tượng "Yêu cầu" và một đối tượng "Phản hồi", thay vì lấy nhiều tham số.
nootn

Làm thế nào bạn có thể chuyển dữ liệu từ Chế độ xem sang Bố cục nếu không sử dụng? -1
Bart Calix đến

Làm thế nào đây là một câu trả lời?
JSON


6

xem dữ liệu: là một từ điển được sử dụng để lưu trữ dữ liệu giữa View và bộ điều khiển, bạn cần truyền đối tượng dữ liệu xem vào mô hình tương ứng của nó trong chế độ xem để có thể truy xuất dữ liệu từ nó ...

ViewBag: là một thuộc tính động tương tự như khi làm việc với dữ liệu xem, tuy nhiên, tốt hơn hết là nó không cần phải được chuyển sang mô hình corressponding của nó trước khi sử dụng nó trong chế độ xem ...


4

Dưới đây là điểm khác biệt điểm về ViewData, ViewBag, TempData & Phiên. Tín dụng / sao chép Askforprogram.in , Theo liên kết để biết ví dụ mã mà tôi chưa đề cập ở đây.

  1. ViewData trong MVC

    • ViewData là thuộc tính của lớp ControllerBase.
    • ViewData là một loại đối tượng từ điển.
    • ViewData là bộ sưu tập từ điển khóa-giá trị.
    • ViewData được giới thiệu trong phiên bản MVC 1.0.
    • ViewData hoạt động với .Net framework 3.5 trở lên.
    • Cần thực hiện chuyển đổi loại mã trong khi liệt kê.
    • Đối tượng ViewData chỉ giữ dữ liệu cho yêu cầu hiện tại.
  2. ViewBag trong MVC

    • ViewBag là thuộc tính của lớp ControllerBase.
    • ViewBag là một loại đối tượng động.
    • ViewBag là một loại đối tượng.
    • ViewBag được giới thiệu trong phiên bản MVC 3.0.
    • ViewBag hoạt động với .Net framework 4.0 trở lên.
    • ViewBag sử dụng thuộc tính và xử lý nó, do đó không cần thực hiện chuyển đổi loại trong khi liệt kê.
    • Đối tượng ViewBag chỉ giữ dữ liệu cho yêu cầu hiện tại.
  3. TempData trong MVC

    • TempData là tài sản của lớp ControllerBase.
    • TempData là một loại đối tượng từ điển.
    • TempData là bộ sưu tập từ điển khóa-giá trị.
    • TempData được giới thiệu trong phiên bản MVC 1.0.
    • TempData hoạt động với .Net framework 3.5 trở lên.
    • Cần thực hiện chuyển đổi loại mã trong khi liệt kê.
    • Đối tượng TempData được sử dụng để dữ liệu giữa yêu cầu hiện tại và yêu cầu tiếp theo.
  4. Phiên trong MVC

    • Phiên là tài sản của Trình điều khiển (Lớp trừu tượng).
    • Phiên là một loại của httpSessionStateBase.
    • Phiên là bộ sưu tập từ điển khóa-giá trị.
    • Phiên được giới thiệu trong phiên bản MVC 1.0.
    • TempData hoạt động với .Net framework 1.0 trở lên.
    • Cần thực hiện chuyển đổi loại mã trong khi liệt kê.
    • Đối tượng phiên giữ dữ liệu cho tất cả các yêu cầu. Có giá trị cho tất cả các yêu cầu, không bao giờ hết hạn.

1

Mặc dù bạn có thể không có lợi thế kỹ thuật để chọn một định dạng so với định dạng khác, bạn nên lưu ý về một số khác biệt quan trọng giữa hai cú pháp. Một sự khác biệt rõ ràng là ViewBag chỉ hoạt động khi khóa bạn đang truy cập là một nhận dạng C # hợp lệ. Ví dụ: nếu bạn đặt một giá trị trong ViewData ["Key With Spaces"], bạn không thể truy cập giá trị đó bằng ViewBag vì mã sẽ không được biên dịch. Một vấn đề quan trọng khác cần xem xét là bạn không thể chuyển các giá trị động dưới dạng tham số cho các phương thức mở rộng. Trình biên dịch C # phải biết loại thực của mọi tham số tại thời điểm biên dịch để chọn phương thức mở rộng chính xác. Nếu bất kỳ tham số nào là động, quá trình biên dịch sẽ thất bại. Ví dụ: mã này sẽ luôn bị lỗi: @ Html.TextBox ("name", ViewBag.Name). Để khắc phục điều này, hãy sử dụng ViewData ["Tên"


0
public ActionResult Index()
{
    ViewBag.Name = "Monjurul Habib";
    return View();
}

public ActionResult Index()
{
    ViewData["Name"] = "Monjurul Habib";
    return View();
} 

In View:

@ViewBag.Name 
@ViewData["Name"] 

0

Bằng cách này, chúng ta có thể làm cho nó sử dụng các giá trị để truyền thông tin giữa bộ điều khiển sang trang khác với TEMP DATA


0

Một điểm khác biệt chính tôi nhận thấy giữa ViewData và ViewBag là:

ViewData: nó sẽ trả về đối tượng không quan trọng bạn đã gán cái gì vào đây và cần phải gõ lại một lần nữa về kiểu ban đầu.

ViewBag: đủ thông minh để trả về loại chính xác những gì bạn đã gán cho nó, không quan trọng thời tiết bạn đã gán loại đơn giản (ví dụ: int, chuỗi, v.v.) hoặc loại phức tạp.

Vd: Mã điều khiển.

 namespace WebApplication1.Controllers
{
    public class HomeController : Controller
    {
        public ActionResult Index()
        {
            Products p1 = new Products();
            p1.productId = 101;
            p1.productName = "Phone";
            Products p2 = new Products();
            p2.productId = 102;
            p2.productName = "laptop";

            List<Products> products = new List<Products>();
            products.Add(p1);
            products.Add(p2);
            ViewBag.Countries = products;
            return View();
        }
    }
    public class Products
    {
        public int productId { get; set; }
        public string productName { get; set; }
    }
}

Xem mã.

<ul>
            @foreach (WebApplication1.Controllers.Products item in ViewBag.Countries)
            {
            <li>@item.productId &nbsp;&nbsp;&nbsp;@item.productName</li>
            }
        </ul>

Màn hình OutPut.

nhập mô tả hình ảnh ở đây


0

Xem dữ liệu

  1. ViewData được sử dụng để truyền dữ liệu từ bộ điều khiển để xem
  2. ViewData có nguồn gốc từ lớp ViewDataDipedia và về cơ bản là một đối tượng Từ điển tức là Khóa và Giá trị trong đó Khóa là Chuỗi trong khi Giá trị sẽ là đối tượng.
  3. Việc đánh máy dữ liệu là bắt buộc trong khi truy xuất dữ liệu từ ViewData vì loại dữ liệu Đối tượng của nó và cũng kiểm tra null vvalue cho phép truyền kiểu nếu không nó sẽ phá vỡ ứng dụng. Nếu chuyển hướng xảy ra, thì giá trị của nó trở thành null Đọc khác biệt hoàn toàn giữa TempData ViewData và View Bag

http://www.gurujipoint.com/2017/09/view-data-viewbag-and-tempdata.html


0
Xem dữ liệu
  1. ViewData được sử dụng để truyền dữ liệu từ bộ điều khiển để xem
  2. Nó có nguồn gốc từ lớp ViewDataDipedia
  3. Nó chỉ có sẵn cho yêu cầu hiện tại
  4. Yêu cầu typecasting cho loại dữ liệu phức tạp và kiểm tra các giá trị null để tránh lỗi
  5. Nếu chuyển hướng xảy ra, thì giá trị của nó trở thành null
Xem túi
  1. ViewBag cũng được sử dụng để truyền dữ liệu từ bộ điều khiển sang chế độ xem tương ứng
  2. ViewBag là một thuộc tính động tận dụng các tính năng động mới trong C # 4.0
  3. Nó cũng chỉ có sẵn cho yêu cầu hiện tại
  4. Nếu chuyển hướng xảy ra, thì giá trị của nó trở thành null
  5. Không yêu cầu typecasting cho loại dữ liệu phức tạp

0

Ở đây cả ViewDataViewBag đều được sử dụng truyền dữ liệu từ Bộ điều khiển sang Chế độ xem .

1. ViewData

- ViewData là đối tượng từ điển có nguồn gốc từ lớp ViewDataDictonary .

- Dữ liệu chỉ cho phép một yêu cầu, giá trị ViewData bị xóa khi chuyển hướng trang xảy ra.

- Giá trị ViewData phải được gõ cate trước khi sử dụng.

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

public ActionResult PassingDatatoViewWithViewData()
{
      ViewData["Message"] = "This message shown in view with the ViewData";
      return View();
}

Trong chế độ xem

@ViewData["Message"];

- Với ViewData là một cặp như KhóaGiá trị , Thông báo là Khóa và giá trị dấu phẩy đảo ngược là Giá trị.

- Dữ liệu đơn giản vì vậy chúng tôi không thể sử dụng typecasting ở đây nếu dữ liệu phức tạp sau đó sử dụng kiểu truyền.

public ActionResult PassingDatatoViewWithViewData()
{
      var type= new List<string>
    {
        "MVC",
        "MVP",
        "MVVC"
    };
    ViewData["types"] = type;
    return View();
}

- Trong dữ liệu Xem có thể được trích xuất như

<ul>
        @foreach (var items in (List<string>)ViewData["types"])
        {
         <li>@items</li>
        }
  </ul>

2. ViewBag

--ViewBag sử dụng trình bao bọc tính năng động.ViewBag xung quanh ViewData.

- Trong kiểu đúc ViewBag là bắt buộc.

- Giống như ViewData, nếu giá trị chuyển hướng xảy ra sẽ trở thành null.

Thí dụ:

public ActionResult PassingDatatoViewWithViewBag()
{
          ViewData.Message = "This message shown in view with the ViewBag";
          return View();
}

Trong chế độ xem

@ViewBag.vbMessage

--Đối với loại phức tạp sử dụng ViewBag

public ActionResult PassingDatatoViewWithViewBag()
{
          var type= new List<string>
        {
            "MVC",
            "MVP",
            "MVVC"
        };
        ViewBag.types = type;
        return View();
 }

- Trong dữ liệu Xem có thể được trích xuất như

<ul>
       @foreach (var items in ViewBag.types)
       {
         <li>@items</li>
       }
</ul>

- sự khác biệt chính là ViewBag không yêu cầu typecasting nhưng ViewData được yêu cầu typecasting.


-1

ViewBag và ViewData là hai phương tiện được sử dụng để truyền thông tin từ bộ điều khiển để xem trong ASP.Net MVC. Mục tiêu của việc sử dụng cả hai cơ chế là cung cấp giao tiếp giữa bộ điều khiển và Chế độ xem. Cả hai đều có tuổi thọ ngắn, giá trị của cả hai đều trở thành null khi chuyển hướng xảy ra, tức là khi trang đã được chuyển hướng từ trang nguồn (nơi chúng tôi đặt giá trị của ViewBag hoặc ViewData) cho trang đích, cả ViewBag cũng như ViewData trở thành vô giá trị.

Mặc dù có những điểm tương đồng này cả (ViewBag và ViewData) là hai điều khác nhau nếu chúng ta nói về việc thực hiện cả hai. Sự khác biệt như sau:

1. là một tài sản năng động.

2.) Trong khi truy cập biểu mẫu giá trị ViewData, chúng ta cần đánh máy các giá trị (kiểu dữ liệu) vì chúng được lưu trữ dưới dạng Đối tượng trong từ điển ViewData nhưng không có nhu cầu như vậy nếu chúng ta đang truy cập giá trị thứ trong trường hợp ViewBag.

3.) Trong ViewBag, chúng ta có thể đặt giá trị như thế này:

      ViewBag.Name = "Value"; 

và có thể truy cập như sau:

          @ViewBag.Name

Trong khi trong trường hợp của ViewData, các giá trị có thể được đặt và truy cập như sau: Đặt ViewData như sau:

ViewData["Name"] = "Value";

và truy cập giá trị như thế này

 @ViewData["Name"] 

Để biết thêm chi tiết bấm vào đây:


2
xin lỗi tôi đã đánh giá thấp nhưng câu trả lời này mất vài đoạn để nói không có gì hữu ích. Điều hữu ích còn thiếu trong câu trả lời được chấp nhận sẽ là câu "viewbag là một trình bao bọc động xung quanh viewdata" mà tôi đã học được từ rachelappel.com/
Chris F Carroll
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.