ViewData กับ ViewBag ต่างกันอย่างไร


คำตอบ:


388

มันใช้คุณสมบัติแบบไดนามิก C # 4.0 มันบรรลุเป้าหมายเดียวกันกับวิวดาต้าและควรหลีกเลี่ยงการใช้โมเดลวิวที่พิมพ์อย่างรุนแรง (เช่นเดียวกับวิวดาต้าควรหลีกเลี่ยง)

ดังนั้นโดยพื้นฐานแล้วมันจะแทนที่สตริงมายากล :

ViewData["Foo"]

ด้วยคุณสมบัติเวทย์มนตร์ :

ViewBag.Foo

ที่คุณไม่มีเวลารวบรวมความปลอดภัย

ฉันยังคงโทษ Microsoft อย่างต่อเนื่องที่นำเสนอแนวคิดนี้ใน MVC

ชื่อของคุณสมบัติคำนึงถึงขนาดตัวพิมพ์


11
เพื่ออะไรคุณจะโทษ Microsoft หากไม่มีข้อมูลมุมมองเราจะผูกรายการแบบหล่นลงจากโมเดลได้อย่างไร (ฉันไม่คิดว่าการใช้รายการที่เลือกภายในแบบจำลองจะเป็นความคิดที่ดี)
Subin Jacob

15
@SubinJacob คุณควรตั้งคำถามใหม่หากคุณต้องการคำตอบ การสร้าง SelectList นั้นเป็นวิธีการสร้าง dropdownlist อย่างแน่นอน
MiniRagnarok

25
ฉันคิดว่ามันเป็นเรื่องส่วนตัว โมเดลที่พิมพ์ได้ดีนั้นดีและ yada yada แต่สำหรับสถานการณ์ที่คุณได้รับมุมมองและใช้งานอย่างรวดเร็ว ViewBag และทำงานได้เร็วกว่า Controller, View, Model, AutoMapper ถึง ViewModel เป็นต้น
Craig Brett

11
@Darin ทำไมคุณ "ตำหนิ" Microsoft สำหรับการแนะนำนี้ มันเป็นเพียงเครื่องมือที่มอบให้กับนักพัฒนา หากคุณรู้ว่าคุณกำลังทำอะไรอยู่คุณสามารถใช้ประโยชน์จากมันให้ได้มากที่สุด หากคุณไม่ชอบหรือรู้สึกว่ามันมีแนวโน้มที่จะเกิดข้อผิดพลาดมากขึ้นก็อย่าใช้มัน :)
Bilal Fazlani

5
คุณแนะนำให้ส่งต่อข้อมูลระหว่างชิ้นส่วนและโครงร่างอย่างไร ผู้คนตำหนิเมื่อพวกเขาไม่เห็นภาพเต็ม ฉันจินตนาการว่าคุณมีผู้ควบคุมฐานและโมเดลมุมมองพื้นฐานหรือวัตถุคงที่ / ซิงเกิลตันทุกที่ คาดเดาสิ่งที่ดีกว่าเรียนรู้การใช้ข้อมูลการดูและตำหนิตัวเองสำหรับการใช้เครื่องมือที่ผิดสำหรับงาน
Bart Calixto

42

ภายใน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
Matthew Flaschen

ขอบคุณสำหรับ Matthew Flaschen ที่ขึ้นหัวฉันมีการพิมพ์ผิดในการตอบสนองและแก้ไขมันตอนนี้อ่าน "ViewData" แทน ViewModel ซึ่งเป็นข้อผิดพลาด :)
Rich Bianco

ตอนนี้มันไม่ถูกต้อง ไม่ถูกเปลี่ยนชื่อเป็นอื่น พวกเขาทั้งสองยังคงอยู่ หนึ่งคือการและสนับสนุนdynamic ViewBag.Messageหนึ่งใช้ViewData["Message"]ไวยากรณ์เก่า
Matthew Flaschen

1
+1 แต่คุณอ้างอิงจากแหล่งใด ... ควรให้ลิงค์จริงๆ
Sam

1
ขอบคุณแซมสำหรับคำแนะนำ ฉันได้เพิ่มลิงก์ไปยังแหล่งต้นฉบับ
Rich Bianco

34

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"]

7
คำตอบของคุณระบุtypecastingแต่คุณไม่ได้แสดงวิธีการพิมพ์ดีดอย่างไร
อเล็กซ์

31

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>

6
ช่วยฉันในการ undestand แต่ฉันคิดว่ามีข้อผิดพลาด สิ่งนี้ <h4>@ViewBag.emp.Name</h4> ควรเปลี่ยนเป็น<h4>@ViewBag.Employee.Name</h4>
Benny Margalit

24

คำตอบทั้งหมดแนะนำว่า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"]


14

ฉันขอแนะนำให้คุณไม่ใช้อย่างใดอย่างหนึ่งได้หรือไม่?

ถ้าคุณต้องการที่จะ "ส่ง" ข้อมูลไปยังหน้าจอของคุณให้ส่งวัตถุที่พิมพ์อย่างรุนแรง (AKA ViewModel) เพราะง่ายต่อการทดสอบ

หากคุณผูกติดอยู่กับ "รุ่น" และมีรายการ "viewbag" หรือ "viewdata" แบบสุ่มอยู่บ้างก็ทำให้การทดสอบอัตโนมัติเป็นเรื่องยากมาก

หากคุณกำลังใช้สิ่งเหล่านี้ให้พิจารณาว่าคุณจะสามารถปรับโครงสร้างและใช้ ViewModels ได้อย่างไร


4
การละเว้นหลักการ "คอมไพเลอร์คือการทดสอบหน่วยแรก" แบบจำลองมุมมองที่พิมพ์แบบคงที่ทำให้โค้ดของคุณสามารถทดสอบได้มากกว่าแบบไดนามิกหรือไม่ ในขณะที่ข้อกำหนดสำหรับการทดสอบมีความสำคัญมากกว่าในโซลูชันที่พิมพ์แบบไดนามิกหากโซลูชันทั้งสองใช้จำนวนและประเภทการทดสอบเท่ากันคุณก็ไม่เสียอะไรเลย
Darren Lewis

ฉันเห็นด้วยมันคลุมเครือเล็กน้อย บางทีอาจเกี่ยวข้องกับ Intellisense
Joshua Ramirez

1
ตัวอย่างหนึ่งจะเยาะเย้ย หากคุณต้องการหน่วยทดสอบการกระทำของคอนโทรลเลอร์คุณสามารถสร้างวัตถุ "จำลอง" ให้ง่ายขึ้นเพื่อยืนยันและยืนยันแทนที่จะพยายามยืนยันว่ามีการเพิ่มสตริงบางส่วนลงในพจนานุกรมบางส่วนหรือตั้งค่าบางฟิลด์เป็นแบบไดนามิก แนวคิดที่คล้ายคลึงกับสัญญาบริการที่มี "คำขอ" หนึ่งรายการและ "ตอบสนอง" หนึ่งวัตถุแทนที่จะรับหลายพารามิเตอร์
nootn

คุณจะส่งข้อมูลจากมุมมองไปยังเค้าโครงอย่างไรหากไม่ได้ใช้งาน -1
Bart Calixto

นี่เป็นคำตอบอย่างไร
JSON

11

มีความแตกต่างเล็กน้อยบางอย่างซึ่งหมายความว่าคุณสามารถใช้ ViewData และ ViewBag ได้หลายวิธีจากมุมมอง ข้อดีอย่างหนึ่งคือสรุปไว้ในโพสต์นี้http://weblogs.asp.net/hajan/archive/2010/12/11/viewbag-dynamic-in-asp-net-mvc-3-rc-2.aspxและแสดงให้เห็นว่า สามารถหลีกเลี่ยงได้ในตัวอย่างโดยใช้ ViewBag แทน ViewData


6

viewdata:เป็นพจนานุกรมที่ใช้ในการจัดเก็บข้อมูลระหว่างมุมมองและตัวควบคุมคุณจำเป็นต้องโยนวัตถุมุมมองข้อมูลเป็นรูปแบบที่สอดคล้องกันในมุมมองเพื่อให้สามารถดึงข้อมูลจากมัน ...

ViewBag:เป็นคุณสมบัติแบบไดนามิกที่คล้ายกันในการทำงานกับข้อมูลมุมมอง แต่มันจะดีกว่าเพราะมันไม่จำเป็นต้องถูกโยนลงในโมเดล corressponding ก่อนที่จะใช้ในมุมมอง ...


4

ด้านล่างนี้เป็นจุดที่แตกต่างกันเกี่ยวกับ ViewData, ViewBag, TempData & Session เครดิต / คัดลอก askforprogram.in , ไปที่ลิงก์เพื่อดูตัวอย่างรหัสที่ฉันไม่ได้พูดถึงที่นี่

  1. ViewData ใน MVC

    • ViewData เป็นคุณสมบัติของคลาส ControllerBase
    • ViewData เป็นวัตถุพจนานุกรมชนิดหนึ่ง
    • ViewData เป็นชุดพจนานุกรมมูลค่าคีย์
    • ViewData เปิดตัวในรุ่น MVC 1.0
    • ViewData ทำงานร่วมกับ. Net framework 3.5 ขึ้นไป
    • จำเป็นต้องทำการแปลงรหัสในขณะแจกแจง
    • วัตถุ ViewData เก็บข้อมูลสำหรับคำขอปัจจุบันเท่านั้น
  2. ViewBag ใน MVC

    • ViewBag เป็นคุณสมบัติของคลาส ControllerBase
    • ViewBag เป็นวัตถุแบบไดนามิกชนิดหนึ่ง
    • ViewBag เป็นวัตถุชนิดหนึ่ง
    • ViewBag เปิดตัวในรุ่น MVC 3.0
    • ViewBag ทำงานได้กับ. Net framework 4.0 ขึ้นไป
    • ViewBag ใช้คุณสมบัติและจัดการกับมันดังนั้นไม่จำเป็นต้องทำการแปลงชนิดในขณะที่แจกแจง
    • วัตถุ ViewBag เก็บข้อมูลสำหรับคำขอปัจจุบันเท่านั้น
  3. TempData ใน MVC

    • TempData เป็นคุณสมบัติของคลาส ControllerBase
    • TempData เป็นวัตถุพจนานุกรมชนิดหนึ่ง
    • TempData เป็นชุดพจนานุกรมค่าคีย์
    • TempData ถูกนำมาใช้ในรุ่น MVC 1.0
    • TempData ทำงานร่วมกับ. Net framework 3.5 ขึ้นไป
    • จำเป็นต้องทำการแปลงรหัสในขณะแจกแจง
    • วัตถุ TempData จะใช้กับข้อมูลระหว่างคำขอปัจจุบันและคำขอต่อมา
  4. เซสชันใน MVC

    • Session เป็นคุณสมบัติของ Controller (Abstract Class)
    • เซสชันเป็นชนิดของ HttpSessionStateBase
    • เซสชั่นเป็นคอลเลกชันพจนานุกรมค่าคีย์
    • เปิดตัวเซสชันในเวอร์ชัน MVC 1.0
    • TempData ทำงานร่วมกับ. Net framework 1.0 ขึ้นไป
    • จำเป็นต้องทำการแปลงรหัสในขณะแจกแจง
    • วัตถุเซสชันเก็บข้อมูลสำหรับคำขอทั้งหมด ใช้ได้สำหรับคำขอทั้งหมดไม่มีวันหมดอายุ

1

แม้ว่าคุณอาจไม่มีข้อได้เปรียบทางเทคนิคในการเลือกรูปแบบหนึ่งจากอีกรูปแบบหนึ่ง แต่คุณควรตระหนักถึงความแตกต่างที่สำคัญระหว่างไวยากรณ์สองรูปแบบ ความแตกต่างที่เห็นได้ชัดอย่างหนึ่งคือ ViewBag จะทำงานได้ก็ต่อเมื่อคีย์ที่คุณเข้าถึงคือรหัสประจำตัว C # ตัวอย่างเช่นหากคุณวางค่าใน ViewData ["Key With Spaces"] คุณจะไม่สามารถเข้าถึงค่านั้นได้โดยใช้ ViewBag เนื่องจากรหัสจะไม่คอมไพล์ อีกประเด็นสำคัญที่ควรพิจารณาคือคุณไม่สามารถส่งผ่านค่าไดนามิกเป็นพารามิเตอร์ในการขยายวิธีการ คอมไพเลอร์ C # ต้องทราบชนิดที่แท้จริงของทุกพารามิเตอร์ ณ เวลารวบรวมเพื่อเลือกวิธีการขยายที่ถูกต้อง หากพารามิเตอร์ใด ๆ เป็นแบบไดนามิกการรวบรวมจะล้มเหลว ตัวอย่างเช่นรหัสนี้จะล้มเหลวเสมอ: @ Html.TextBox ("ชื่อ", ViewBag.Name) ในการหลีกเลี่ยงปัญหานี้ให้ใช้ ViewData ["ชื่อ"


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

ด้วยวิธีนี้เราสามารถทำให้มันใช้ค่าในการส่งผ่านข้อมูลระหว่างตัวควบคุมไปยังหน้าอื่นด้วย TEMP DATA


0

ความแตกต่างหลักอย่างหนึ่งที่ฉันสังเกตเห็นระหว่าง 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 &nbsp;&nbsp;&nbsp;@item.productName</li>
            }
        </ul>

หน้าจอเอาท์พุท

ป้อนคำอธิบายรูปภาพที่นี่


0

ดูข้อมูล

  1. ViewData ใช้เพื่อส่งผ่านข้อมูลจากคอนโทรลเลอร์เพื่อดู
  2. ViewData มาจากคลาส ViewDataDictionary และโดยทั่วไปแล้วเป็นวัตถุพจนานุกรม ieKeys และค่าที่ Keys เป็นสตริงในขณะที่ค่าจะเป็นวัตถุ
  3. การพิมพ์ข้อมูลเป็นสิ่งจำเป็นในขณะที่ดึงข้อมูลจาก ViewData เนื่องจากชนิดข้อมูลของวัตถุและการตรวจสอบค่าว่างเป็นโมฆะก่อนที่จะทำการหล่อมิฉะนั้นจะทำให้แอปพลิเคชันหยุดทำงาน หากการเปลี่ยนเส้นทางเกิดขึ้นค่าของมันจะเป็นโมฆะอ่านความแตกต่างเต็มรูปแบบระหว่าง TempData ViewData และ View Bag

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


0
ViewData
  1. ViewData ใช้เพื่อส่งผ่านข้อมูลจากคอนโทรลเลอร์เพื่อดู
  2. มันมาจากคลาส ViewDataDictionary
  3. มันสามารถใช้ได้สำหรับการร้องขอปัจจุบันเท่านั้น
  4. ต้องการ typecasting สำหรับชนิดข้อมูลที่ซับซ้อนและตรวจสอบค่า Null เพื่อหลีกเลี่ยงข้อผิดพลาด
  5. หากการเปลี่ยนเส้นทางเกิดขึ้นค่าของมันจะเป็นโมฆะ
ViewBag
  1. ViewBag ยังใช้เพื่อส่งผ่านข้อมูลจากคอนโทรลเลอร์ไปยังมุมมองที่เกี่ยวข้อง
  2. ViewBag เป็นคุณสมบัติแบบไดนามิกที่ใช้ประโยชน์จากคุณลักษณะแบบไดนามิกใหม่ใน C # 4.0
  3. นอกจากนี้ยังสามารถใช้ได้กับคำขอปัจจุบันเท่านั้น
  4. หากการเปลี่ยนเส้นทางเกิดขึ้นค่าของมันจะเป็นโมฆะ
  5. ไม่ต้องการ typecasting สำหรับชนิดข้อมูลที่ซับซ้อน

0

นี่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


-1

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"] 

สำหรับรายละเอียดเพิ่มเติมคลิกที่นี่:


2
ขอโทษฉัน downvote แต่คำตอบนี้ใช้เวลาหลายย่อหน้าที่จะพูดว่าไม่มีประโยชน์ สิ่งที่มีประโยชน์ที่ขาดหายไปจากคำตอบที่ยอมรับคือประโยค "viewbag เป็น wrapper แบบไดนามิกรอบ ๆวิวดาต้า
Chris F Carroll
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.