Tôi đã thấy ViewBag
trong MVC 3. Nó khác với ViewData
MVC 2 như thế nào?
Tôi đã thấy ViewBag
trong MVC 3. Nó khác với ViewData
MVC 2 như thế nào?
Câu trả lời:
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.
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.)
ViewData
và ViewBag
, không phải về ViewModel
.
dynamic
và hỗ trợ ViewBag.Message
. Một sử dụng ViewData["Message"]
cú pháp cũ .
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"]
typecasting
nhưng bạn đã không hiển thị cách thực hiện typecasting
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 View
như 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>
<h4>@ViewBag.emp.Name</h4>
sẽ thay đổi thành<h4>@ViewBag.Employee.Name</h4>
Tất cả các câu trả lời cho thấy rằng ViewBag
và / hoặc ViewData
là 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 ViewBag
vàViewData
?"
Sự khác biệt đáng chú ý nhất là ViewData
Từ đ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?
ViewBag
khô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
ViewData
có tất cả các thuộc tính của một từ điển như ContainsKey
, Add
vv, do đó bạn có thể sử dụngViewData.Add("somekey", "somevalue")
giữ trong tâm trí nó có thể ném ngoại lệ.ViewData
trên các khung nhìn cần TypeCasting trong khi ViewBag
khô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"]
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.
Có một số khác biệt tinh tế có nghĩa là bạn có thể sử dụng ViewData và ViewBag theo những cách hơi khác so với chế độ xem. Một lợi thế được nêu trong bài đăng này http://weblogs.asp.net/hajan/archive/2010/12/11/viewbag-dynamic-in-asp-net-mvc-3-rc-2.aspx và cho thấy việc truyền có thể tránh trong ví dụ bằng cách sử dụng ViewBag thay vì ViewData.
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 ...
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.
ViewData trong MVC
ViewBag trong MVC
TempData trong MVC
Phiên trong MVC
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"
public ActionResult Index()
{
ViewBag.Name = "Monjurul Habib";
return View();
}
public ActionResult Index()
{
ViewData["Name"] = "Monjurul Habib";
return View();
}
In View:
@ViewBag.Name
@ViewData["Name"]
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
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 @item.productName</li>
}
</ul>
Màn hình OutPut.
Xem dữ liệu
http://www.gurujipoint.com/2017/09/view-data-viewbag-and-tempdata.html
Ở đây cả ViewData và ViewBag đề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óa và Giá 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.
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: