ฉันเห็นViewBag
ใน MVC 3 นั้นแตกต่างจากViewData
MVC 2 อย่างไร
ฉันเห็นViewBag
ใน MVC 3 นั้นแตกต่างจากViewData
MVC 2 อย่างไร
คำตอบ:
มันใช้คุณสมบัติแบบไดนามิก C # 4.0 มันบรรลุเป้าหมายเดียวกันกับวิวดาต้าและควรหลีกเลี่ยงการใช้โมเดลวิวที่พิมพ์อย่างรุนแรง (เช่นเดียวกับวิวดาต้าควรหลีกเลี่ยง)
ดังนั้นโดยพื้นฐานแล้วมันจะแทนที่สตริงมายากล :
ViewData["Foo"]
ด้วยคุณสมบัติเวทย์มนตร์ :
ViewBag.Foo
ที่คุณไม่มีเวลารวบรวมความปลอดภัย
ฉันยังคงโทษ Microsoft อย่างต่อเนื่องที่นำเสนอแนวคิดนี้ใน MVC
ชื่อของคุณสมบัติคำนึงถึงขนาดตัวพิมพ์
ภายในViewBagคุณสมบัติจะถูกเก็บเป็นชื่อ / คู่ค่าในพจนานุกรม ViewData
หมายเหตุ: ใน MVC 3 รุ่นก่อนวางจำหน่ายส่วนใหญ่คุณสมบัติ ViewBag ได้รับการตั้งชื่อว่า ViewModel ดังที่ระบุไว้ในตัวอย่างนี้จากบันทึกย่อประจำรุ่น MVC 3:
(แก้ไข 10-8-12)ขอแนะนำให้ฉันโพสต์แหล่งข้อมูลนี้ที่ฉันโพสต์นี่คือที่มา: http://www.asp.net/whitepapers/mvc3-release-notes#_Toc2_4
ตัวควบคุม MVC 2 สนับสนุนคุณสมบัติ ViewData ที่ให้คุณส่งผ่านข้อมูลไปยังเทมเพลตมุมมองโดยใช้ API พจนานุกรมแบบ จำกัด ใน MVC 3 คุณสามารถใช้ไวยากรณ์ที่ค่อนข้างเรียบง่ายกว่าด้วยคุณสมบัติ ViewBag เพื่อให้บรรลุวัตถุประสงค์เดียวกัน ตัวอย่างเช่นแทนที่จะเขียน ViewData ["Message"] = "text" คุณสามารถเขียน ViewBag.Message = "text" คุณไม่จำเป็นต้องกำหนดคลาสที่พิมพ์อย่างรุนแรงเพื่อใช้คุณสมบัติ ViewBag เนื่องจากเป็นคุณสมบัติแบบไดนามิกคุณสามารถรับหรือตั้งค่าคุณสมบัติและจะแก้ไขได้ในขณะใช้งาน ภายในคุณสมบัติ ViewBag ถูกเก็บไว้เป็นคู่ชื่อ / ค่าในพจนานุกรม ViewData (หมายเหตุ: ใน MVC 3 รุ่นก่อนวางจำหน่ายส่วนใหญ่คุณสมบัติ ViewBag มีชื่อว่าคุณสมบัติ ViewModel)
ViewData
และไม่เกี่ยวกับViewBag
ViewModel
dynamic
ViewBag.Message
หนึ่งใช้ViewData["Message"]
ไวยากรณ์เก่า
ViewBag vs ViewData ใน MVC
http://royalarun.blogspot.in/2013/08/viewbag-viewdata-tempdata-and-view.html
ความคล้ายคลึงกันระหว่าง ViewBag และ ViewData:
ช่วยในการรักษาข้อมูลเมื่อคุณย้ายจากคอนโทรลเลอร์ไปยังมุมมอง ใช้เพื่อส่งผ่านข้อมูลจากคอนโทรลเลอร์ไปยังมุมมองที่สอดคล้องกัน อายุการใช้งานสั้นหมายถึงค่ากลายเป็นค่าว่างเมื่อมีการเปลี่ยนเส้นทาง นี่เป็นเพราะเป้าหมายของพวกเขาคือการให้วิธีการสื่อสารระหว่างตัวควบคุมและมุมมอง มันเป็นกลไกการสื่อสารภายในการโทรของเซิร์ฟเวอร์
ความแตกต่างระหว่าง ViewBag และ ViewData:
ViewData เป็นพจนานุกรมของวัตถุที่ได้มาจากคลาส ViewDataDictionary และเข้าถึงได้โดยใช้สตริงเป็นกุญแจ ViewBag เป็นคุณสมบัติแบบไดนามิกที่ใช้ประโยชน์จากคุณลักษณะแบบไดนามิกใหม่ใน C # 4.0 ViewData ต้องการ typecasting สำหรับชนิดข้อมูลที่ซับซ้อนและตรวจสอบค่า Null เพื่อหลีกเลี่ยงข้อผิดพลาด ViewBag ไม่จำเป็นต้องพิมพ์ตัวอักษรสำหรับประเภทข้อมูลที่ซับซ้อน
ViewBag & ViewData ตัวอย่าง:
public ActionResult Index()
{
ViewBag.Name = "Arun Prakash";
return View();
}
public ActionResult Index()
{
ViewData["Name"] = "Arun Prakash";
return View();
}
กำลังโทรในมุมมอง
@ViewBag.Name
@ViewData["Name"]
typecasting
แต่คุณไม่ได้แสดงวิธีการพิมพ์ดีดอย่างไร
ViewData
: มันต้องใช้การหล่อแบบสำหรับชนิดข้อมูลที่ซับซ้อนและตรวจสอบค่า Null เพื่อหลีกเลี่ยงข้อผิดพลาด
ViewBag
: มันไม่จำเป็นต้องใช้การหล่อแบบสำหรับชนิดข้อมูลที่ซับซ้อน
ลองพิจารณาตัวอย่างต่อไปนี้:
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();
}
}
และรหัสสำหรับView
เป็นดังนี้:
@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>
ควรเปลี่ยนเป็น<h4>@ViewBag.Employee.Name</h4>
คำตอบทั้งหมดแนะนำว่าViewBag
และ / หรือViewData
คือการส่งผ่านข้อมูลจากController
ที่Views
ซึ่งเป็นข้อมูลที่ผิด ทั้งสองมีประโยชน์อย่างมากในการส่งข้อมูลจาก Views ไปยัง Layout หรือ Partial to Views (หรือ ViewComponents ฯลฯ ) มันไม่ได้เป็นตัวควบคุมพิเศษ
เนื่องจากตัวอย่าง asp.net เริ่มต้นมีสิ่งนี้ในหน้าเลย์เอาต์:
<title>@ViewData["Title"] - MyApp</title>
และในมุมมองใด ๆ
ViewData["Title"] = "Details";
ดังนั้นการถามคำถาม: "อะไรคือความแตกต่างระหว่างViewBag
และViewData
?"
ความแตกต่างที่โดดเด่นที่สุดคือViewData
พจนานุกรมที่ViewBag
มีการพิมพ์อย่างมากในขณะที่
เป็นประเภทแบบไดนามิก
โปรดทราบว่าข้อมูลภายในเป็นเหมือนกัน
ViewData["Title"] = "MyTitle";
ViewBag.Title; // returns "MyTitle";
ควรใช้อย่างใดอย่างหนึ่ง
ViewBag
ไม่รองรับชื่อ C # ที่ไม่ถูกต้อง คุณไม่สามารถเข้าถึงViewData["Key With Space"]
ด้วยViewBag
ViewBag.Something
เป็นแบบไดนามิกและคุณอาจมีปัญหาเมื่อเรียกวิธีการ (เช่นวิธีการขยาย) ที่ต้องรู้พารามิเตอร์ที่แน่นอนในเวลารวบรวมViewBag
สามารถตรวจสอบทำความสะอาดเกี่ยวกับการสร้างประโยคเป็นโมฆะได้: ViewBag.Person?.Name
ViewData
มีคุณสมบัติทั้งหมดของพจนานุกรมเช่นContainsKey
และAdd
อื่น ๆ เพื่อให้คุณสามารถใช้งานได้ViewData.Add("somekey", "somevalue")
โปรดจำไว้ว่ามันอาจส่งข้อยกเว้นViewData
มุมมองต้องใช้ TypeCasting โดยที่ViewBag
ไม่ต้องการการรู้ถึงความแตกต่างที่ละเอียดอ่อนการใช้หนึ่งอย่างหรือมากกว่านั้นเป็นเรื่องที่ชอบมากกว่า
โดยปกติคุณสามารถนึกถึงViewBag.AnyKey
นามแฝงของViewData["AnyKey"]
ฉันขอแนะนำให้คุณไม่ใช้อย่างใดอย่างหนึ่งได้หรือไม่?
ถ้าคุณต้องการที่จะ "ส่ง" ข้อมูลไปยังหน้าจอของคุณให้ส่งวัตถุที่พิมพ์อย่างรุนแรง (AKA ViewModel) เพราะง่ายต่อการทดสอบ
หากคุณผูกติดอยู่กับ "รุ่น" และมีรายการ "viewbag" หรือ "viewdata" แบบสุ่มอยู่บ้างก็ทำให้การทดสอบอัตโนมัติเป็นเรื่องยากมาก
หากคุณกำลังใช้สิ่งเหล่านี้ให้พิจารณาว่าคุณจะสามารถปรับโครงสร้างและใช้ ViewModels ได้อย่างไร
มีความแตกต่างเล็กน้อยบางอย่างซึ่งหมายความว่าคุณสามารถใช้ ViewData และ ViewBag ได้หลายวิธีจากมุมมอง ข้อดีอย่างหนึ่งคือสรุปไว้ในโพสต์นี้http://weblogs.asp.net/hajan/archive/2010/12/11/viewbag-dynamic-in-asp-net-mvc-3-rc-2.aspxและแสดงให้เห็นว่า สามารถหลีกเลี่ยงได้ในตัวอย่างโดยใช้ ViewBag แทน ViewData
viewdata:เป็นพจนานุกรมที่ใช้ในการจัดเก็บข้อมูลระหว่างมุมมองและตัวควบคุมคุณจำเป็นต้องโยนวัตถุมุมมองข้อมูลเป็นรูปแบบที่สอดคล้องกันในมุมมองเพื่อให้สามารถดึงข้อมูลจากมัน ...
ViewBag:เป็นคุณสมบัติแบบไดนามิกที่คล้ายกันในการทำงานกับข้อมูลมุมมอง แต่มันจะดีกว่าเพราะมันไม่จำเป็นต้องถูกโยนลงในโมเดล corressponding ก่อนที่จะใช้ในมุมมอง ...
ด้านล่างนี้เป็นจุดที่แตกต่างกันเกี่ยวกับ ViewData, ViewBag, TempData & Session เครดิต / คัดลอก askforprogram.in , ไปที่ลิงก์เพื่อดูตัวอย่างรหัสที่ฉันไม่ได้พูดถึงที่นี่
ViewData ใน MVC
ViewBag ใน MVC
TempData ใน MVC
เซสชันใน MVC
แม้ว่าคุณอาจไม่มีข้อได้เปรียบทางเทคนิคในการเลือกรูปแบบหนึ่งจากอีกรูปแบบหนึ่ง แต่คุณควรตระหนักถึงความแตกต่างที่สำคัญระหว่างไวยากรณ์สองรูปแบบ ความแตกต่างที่เห็นได้ชัดอย่างหนึ่งคือ ViewBag จะทำงานได้ก็ต่อเมื่อคีย์ที่คุณเข้าถึงคือรหัสประจำตัว C # ตัวอย่างเช่นหากคุณวางค่าใน ViewData ["Key With Spaces"] คุณจะไม่สามารถเข้าถึงค่านั้นได้โดยใช้ ViewBag เนื่องจากรหัสจะไม่คอมไพล์ อีกประเด็นสำคัญที่ควรพิจารณาคือคุณไม่สามารถส่งผ่านค่าไดนามิกเป็นพารามิเตอร์ในการขยายวิธีการ คอมไพเลอร์ C # ต้องทราบชนิดที่แท้จริงของทุกพารามิเตอร์ ณ เวลารวบรวมเพื่อเลือกวิธีการขยายที่ถูกต้อง หากพารามิเตอร์ใด ๆ เป็นแบบไดนามิกการรวบรวมจะล้มเหลว ตัวอย่างเช่นรหัสนี้จะล้มเหลวเสมอ: @ Html.TextBox ("ชื่อ", ViewBag.Name) ในการหลีกเลี่ยงปัญหานี้ให้ใช้ ViewData ["ชื่อ"
public ActionResult Index()
{
ViewBag.Name = "Monjurul Habib";
return View();
}
public ActionResult Index()
{
ViewData["Name"] = "Monjurul Habib";
return View();
}
In View:
@ViewBag.Name
@ViewData["Name"]
ด้วยวิธีนี้เราสามารถทำให้มันใช้ค่าในการส่งผ่านข้อมูลระหว่างตัวควบคุมไปยังหน้าอื่นด้วย TEMP DATA
ความแตกต่างหลักอย่างหนึ่งที่ฉันสังเกตเห็นระหว่าง ViewData และ ViewBag คือ:
ViewData: มันจะส่งคืนวัตถุโดยไม่คำนึงถึงสิ่งที่คุณกำหนดไว้และต้องพิมพ์อีกครั้งกลับไปเป็นประเภทเดิม
ViewBag: มันฉลาดพอที่จะคืนค่าประเภทที่คุณกำหนดให้มันไม่สำคัญว่าจะมีสภาพอากาศที่คุณกำหนดประเภทง่าย ๆ (เช่น int, string ฯลฯ ) หรือประเภทที่ซับซ้อน
เช่นรหัสควบคุม
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; }
}
}
ดูรหัส
<ul>
@foreach (WebApplication1.Controllers.Products item in ViewBag.Countries)
{
<li>@item.productId @item.productName</li>
}
</ul>
หน้าจอเอาท์พุท
ดูข้อมูล
http://www.gurujipoint.com/2017/09/view-data-viewbag-and-tempdata.html
นี่ViewDataและViewBagทั้งมีการใช้ข้อมูลที่ผ่านมาจากตัวควบคุมเพื่อดู
1. ViewData
- ViewData เป็นวัตถุพจนานุกรมที่ได้รับมาจากคลาสViewDataDictonary
- ข้อมูลอนุญาตสำหรับหนึ่งคำขอเท่านั้นค่า ViewData จะถูกล้างเมื่อเกิดการเปลี่ยนเส้นทางหน้า
- ค่า ViewData จะต้องพิมพ์ cate ก่อนการใช้งาน
ตัวอย่าง: ในตัวควบคุม
public ActionResult PassingDatatoViewWithViewData()
{
ViewData["Message"] = "This message shown in view with the ViewData";
return View();
}
ในมุมมอง
@ViewData["Message"];
- ด้วย ViewData เป็นคู่เช่นคีย์และค่าข้อความคือคีย์และในค่าจุลภาคกลับเป็นค่า
- ข้อมูลนั้นง่ายดังนั้นเราจึงไม่สามารถใช้ typecasting ที่นี่หากข้อมูลมีความซับซ้อนจากนั้นใช้การคัดเลือกประเภท
public ActionResult PassingDatatoViewWithViewData()
{
var type= new List<string>
{
"MVC",
"MVP",
"MVVC"
};
ViewData["types"] = type;
return View();
}
- สามารถดึงข้อมูลในมุมมองเป็น
<ul>
@foreach (var items in (List<string>)ViewData["types"])
{
<li>@items</li>
}
</ul>
2. ViewBag
--ViewBag ใช้คุณสมบัติแบบไดนามิก ViewBag wrapper รอบ ๆ ViewData
- ในการหล่อประเภท ViewBag จำเป็นต้องใช้
- เหมือนกับ ViewData หากค่าการเปลี่ยนเส้นทางเกิดขึ้นจะกลายเป็นค่าว่าง
ตัวอย่าง:
public ActionResult PassingDatatoViewWithViewBag()
{
ViewData.Message = "This message shown in view with the ViewBag";
return View();
}
ในมุมมอง
@ViewBag.vbMessage
- สำหรับประเภทที่ซับซ้อนให้ใช้ ViewBag
public ActionResult PassingDatatoViewWithViewBag()
{
var type= new List<string>
{
"MVC",
"MVP",
"MVVC"
};
ViewBag.types = type;
return View();
}
- สามารถดึงข้อมูลในมุมมองเป็น
<ul>
@foreach (var items in ViewBag.types)
{
<li>@items</li>
}
</ul>
- ความแตกต่างที่สำคัญคือViewBagไม่จำเป็นต้องพิมพ์ดีด แต่ViewDataจำเป็นต้องใช้ typecasting
ViewBag และ ViewData เป็นสองวิธีที่ใช้ในการส่งผ่านข้อมูลจากคอนโทรลเลอร์เพื่อดูใน ASP.Net MVC เป้าหมายของการใช้ทั้งสองกลไกคือการจัดเตรียมการสื่อสารระหว่างคอนโทรลเลอร์และมุมมอง ทั้งคู่มีอายุสั้นซึ่งเป็นค่าของทั้งคู่จะกลายเป็นโมฆะเมื่อมีการเปลี่ยนเส้นทางเกิดขึ้นเช่นเมื่อหน้าได้เปลี่ยนเส้นทางจากหน้าแหล่งที่มา (ที่เราตั้งค่าของ ViewBag หรือ ViewData) ไปยังหน้าเป้าหมายทั้ง ViewBag และ ViewData กลายเป็นโมฆะ
แม้จะมีความคล้ายคลึงกันเหล่านี้ทั้งสอง (ViewBag และ ViewData) เป็นสองสิ่งที่แตกต่างกันถ้าเราพูดถึงการใช้งานของทั้งสอง ความแตกต่างมีดังนี้:
1. ) หากเราวิเคราะห์การใช้งานทั้งสองอย่างอย่างชาญฉลาดเราจะพบว่า ViewData เป็นโครงสร้างข้อมูลพจนานุกรม - พจนานุกรมของวัตถุที่ได้มาจาก ViewDataDictionary และเข้าถึงได้โดยใช้สตริงเป็นกุญแจสู่ค่าเหล่านี้ในขณะที่ ViewBag ใช้คุณลักษณะแบบไดนามิกที่แนะนำใน C # 4.0 และ เป็นคุณสมบัติแบบไดนามิก
2. ) ในขณะที่เข้าถึงแบบฟอร์มค่า ViewData เราจำเป็นต้องพิมพ์ค่า (ประเภทข้อมูล) เนื่องจากถูกเก็บเป็นวัตถุในพจนานุกรม ViewData แต่ไม่มีความจำเป็นเช่นนี้หากเราเข้าถึงค่า th ในกรณีของ ViewBag
3. ) ใน ViewBag เราสามารถตั้งค่าดังนี้:
ViewBag.Name = "Value";
และสามารถเข้าถึงได้ดังต่อไปนี้:
@ViewBag.Name
ในขณะที่ในกรณีของ ViewData ค่าสามารถตั้งค่าและเข้าถึงดังนี้: การตั้งค่า ViewData ดังนี้:
ViewData["Name"] = "Value";
และการเข้าถึงคุณค่าเช่นนี้
@ViewData["Name"]
สำหรับรายละเอียดเพิ่มเติมคลิกที่นี่: