मैंने ViewBag
MVC में देखा 3. ViewData
MVC 2 की तुलना में यह कैसे अलग है ?
मैंने ViewBag
MVC में देखा 3. ViewData
MVC 2 की तुलना में यह कैसे अलग है ?
जवाबों:
यह C # 4.0 डायनामिक फीचर का उपयोग करता है। यह दृश्यता के समान लक्ष्य को प्राप्त करता है और दृढ़ता से टाइप किए गए दृश्य मॉडल का उपयोग करने के पक्ष में बचा जाना चाहिए (जिस तरह से दृश्यता से बचा जाना चाहिए)।
तो मूल रूप से यह जादू के तार की जगह लेता है :
ViewData["Foo"]
जादू गुणों के साथ :
ViewBag.Foo
जिसके लिए आपके पास कोई संकलित समय सुरक्षा नहीं है।
मैं एमवीसी में इस अवधारणा को पेश करने के लिए Microsoft को दोष देना जारी रखता हूं।
गुणों के नाम पर मामला संवेदनशील है।
आंतरिक रूप से ViewBag गुण ViewData शब्दकोश में नाम / मूल्य जोड़े के रूप में संग्रहीत किए जाते हैं ।
नोट: MVC 3 के अधिकांश पूर्व-रिलीज़ संस्करणों में, ViewBag गुण को MVC 3 रिलीज़ नोट्स से इस स्निपेट में नोट किया गया ViewModel नाम दिया गया था:
(संपादित 10-8-12) यह सुझाव दिया गया था कि मैं इस जानकारी के स्रोत को पोस्ट करता हूं जिसे मैंने पोस्ट किया है, यहां स्रोत है: http://www.asp.net/whitepapers/mvc3-release-notes#_Toc2_4
MVC 2 नियंत्रक एक ViewData गुण का समर्थन करते हैं जो आपको एक देर से बाध्य शब्दकोश एपीआई का उपयोग करके डेटा को एक दृश्य टेम्पलेट में पास करने में सक्षम बनाता है। MVC 3 में, आप इसी उद्देश्य को पूरा करने के लिए ViewBag संपत्ति के साथ कुछ सरल सिंटैक्स का उपयोग कर सकते हैं। उदाहरण के लिए, ViewData ["संदेश"] = "पाठ" लिखने के बजाय, आप ViewBag.Message = "text" लिख सकते हैं। ViewBag संपत्ति का उपयोग करने के लिए आपको किसी भी दृढ़ता से टाइप की गई कक्षाओं को परिभाषित करने की आवश्यकता नहीं है। क्योंकि यह एक गतिशील संपत्ति है, आप इसके बजाय बस गुण प्राप्त कर सकते हैं या सेट कर सकते हैं और यह उन्हें गतिशील रूप से रन टाइम पर हल करेगा। आंतरिक रूप से, ViewBag गुणों को ViewData शब्दकोश में नाम / मूल्य जोड़े के रूप में संग्रहीत किया जाता है। (ध्यान दें: MVC 3 के अधिकांश पूर्व-रिलीज़ संस्करणों में, ViewBag संपत्ति को ViewModel संपत्ति का नाम दिया गया था।)
ViewData
और ViewBag
, के बारे में नहीं पूछता है ViewModel
।
dynamic
और समर्थन करता है ViewBag.Message
। एक पुराने ViewData["Message"]
वाक्यविन्यास का उपयोग करता है ।
MVC में ViewBag बनाम ViewData
http://royalarun.blogspot.in/2013/08/viewbag-viewdata-tempdata-and-view.html
ViewBag और ViewData के बीच समानताएं:
जब आप नियंत्रक से देखने के लिए स्थानांतरित करते हैं तो डेटा बनाए रखने में मदद करता है। नियंत्रक से संबंधित दृश्य में डेटा पास करने के लिए उपयोग किया जाता है। लघु जीवन का अर्थ है जब पुनर्निर्देशन होता है तो मूल्य शून्य हो जाता है। ऐसा इसलिए है क्योंकि उनका लक्ष्य नियंत्रकों और विचारों के बीच संवाद करने का एक तरीका प्रदान करना है। यह सर्वर कॉल के भीतर एक संचार तंत्र है।
ViewBag और ViewData के बीच अंतर:
ViewData ऑब्जेक्ट्स का एक शब्दकोश है जो ViewDataDictionary वर्ग से प्राप्त होता है और कुंजी के रूप में तार का उपयोग करके सुलभ होता है। ViewBag एक गतिशील संपत्ति है जो C # 4.0 में नई गतिशील सुविधाओं का लाभ उठाती है। ViewData को जटिल डेटा प्रकार के लिए टाइपकास्टिंग की आवश्यकता होती है और त्रुटि से बचने के लिए अशक्त मानों की जांच करनी चाहिए। 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
: इसमें त्रुटियों से बचने के लिए जटिल डेटा प्रकारों और अशक्त मानों की जाँच के लिए टाइप कास्टिंग की आवश्यकता होती है।
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
जिनसे गलत सूचना है। दृश्य से लेआउट या आंशिक से दृश्य (या ViewCompords, आदि) तक डेटा पास करने के लिए दोनों बहुत उपयोगी हैं। यह नियंत्रक अनन्य नहीं है।
डिफ़ॉल्ट asp.net नमूने के रूप में लेआउट पृष्ठ में यह है:
<title>@ViewData["Title"] - MyApp</title>
और किसी भी दृश्य में
ViewData["Title"] = "Details";
तो, सवाल पूछने के लिए: "क्या अंतर है ViewBag
और ViewData
?"
सबसे उल्लेखनीय अंतर ViewData
एक मजबूत टाइप का शब्दकोश है जबकि
ViewBag
एक गतिशील प्रकार है।
ध्यान दें कि डेटा सम के अंदर है
ViewData["Title"] = "MyTitle";
ViewBag.Title; // returns "MyTitle";
एक या दूसरे का उपयोग कब करें?
ViewBag
मान्य सी # नामों का समर्थन नहीं करता है। आप ViewData["Key With Space"]
साथ नहीं पहुँच सकतेViewBag
ViewBag.Something
डायनामिक है और आपको कॉलिंग मेथड्स (जैसे एक्सटेंशन मेथड्स) की समस्या हो सकती है, जिसे कंपाइल समय पर सटीक पैरामीटर पता होना चाहिए।ViewBag
नलियों के लिए जाँच कर सकते हैं सिंथेटिक क्लीनर: ViewBag.Person?.Name
ViewData
एक शब्दकोश के सभी गुण हैं ContainsKey
, जैसे Add
, आदि तो आप उपयोग कर सकते हैंViewData.Add("somekey", "somevalue")
ध्यान रखें कि यह अपवाद फेंक सकता है।ViewData
विचारों का उपयोग करते हुए टाइपकास्टिंग की आवश्यकता ViewBag
नहीं है।सूक्ष्म अंतरों को जानना, एक या दूसरे का उपयोग करना अधिक पसंद करने वाला स्वाद है।
आम तौर पर आप ViewBag.AnyKey
एक उपनाम के बारे में सोच सकते हैंViewData["AnyKey"]
क्या मैं आपको सलाह दे सकता हूं कि आप इसका इस्तेमाल न करें?
यदि आप अपनी स्क्रीन पर डेटा "भेजना" चाहते हैं, तो एक दृढ़ता से टाइप की गई वस्तु (AKA ViewModel) भेजें क्योंकि यह परीक्षण करना आसान है।
यदि आप किसी प्रकार के "मॉडल" से बंधते हैं और आपके पास यादृच्छिक "व्यूबैग" या "व्यूडेटा" आइटम हैं, तो यह स्वचालित परीक्षण को बहुत मुश्किल बना देता है।
यदि आप इन पर विचार कर रहे हैं कि आप कैसे पुनर्गठन कर सकते हैं और बस ViewModels का उपयोग कर सकते हैं।
कुछ सूक्ष्म अंतर हैं जिनका अर्थ है कि आप ViewData और ViewBag का उपयोग दृश्य से थोड़े अलग तरीके से कर सकते हैं। एक लाभ यह है इस पोस्ट में उल्लिखित है http://weblogs.asp.net/hajan/archive/2010/12/11/viewbag-dynamic-in-asp-net-mvc-3-rc-2.aspx और शो है कि कास्टिंग ViewData के बजाय ViewBag का उपयोग करके उदाहरण में टाला जा सकता है।
viewdata: व्यू और कंट्रोलर के बीच डेटा को स्टोर करने के लिए इस्तेमाल किया जाने वाला एक डिक्शनरी है, यू व्यू में ऑब्जेक्ट डेटा ऑब्जेक्ट को उसके संबंधित मॉडल में डालना है ताकि वह इससे डेटा रिकवर कर सके ...
ViewBag: दृश्य डेटा के लिए काम करने में समान एक गतिशील संपत्ति है, हालांकि यह बेहतर है cuz यह देखने में उपयोग करने से पहले अपने corresspolding मॉडल को डाली जाने की आवश्यकता नहीं है ...
नीचे ViewData, ViewBag, TempData और सत्र के बारे में बिंदु अंतर करने के लिए बिंदु है। क्रेडिट / कॉपी किया गया askforprogram.in , कोड उदाहरण के लिए लिंक का पालन करें जिसका मैंने यहां उल्लेख नहीं किया है।
एमवीसी में ViewData
MVC में ViewBag
एमवीसी में टेंपडाटा
एमवीसी में सत्र
यद्यपि आपको एक प्रारूप को दूसरे पर चुनने का तकनीकी लाभ नहीं हो सकता है, आपको दो वाक्यविन्यासों के बीच कुछ महत्वपूर्ण अंतरों के बारे में पता होना चाहिए। एक स्पष्ट अंतर यह है कि ViewBag केवल तभी काम करता है जब आप जिस कुंजी तक पहुंच रहे हैं वह एक मान्य C # आइडेंटी एर है। उदाहरण के लिए, यदि आप ViewData ["Key With Spaces"] में कोई मान रखते हैं, तो आप उस मान को ViewBag का उपयोग करके एक्सेस नहीं कर सकते क्योंकि कोड संकलित नहीं होगा। विचार करने के लिए एक और महत्वपूर्ण मुद्दा यह है कि आप डायनामिक मानों में विस्तार के तरीकों के मापदंडों के रूप में पारित नहीं कर सकते। C # संकलक को सही विस्तार विधि का चयन करने के लिए संकलन समय पर प्रत्येक पैरामीटर का वास्तविक प्रकार जानना चाहिए। यदि कोई पैरामीटर गतिशील है, तो संकलन विफल हो जाएगा। उदाहरण के लिए, यह कोड हमेशा विफल रहेगा: @ Html.TextBox ("name", 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: यह सटीक प्रकार वापस करने के लिए पर्याप्त स्मार्ट है जिसे आपने इसे सौंपा है यह कोई फर्क नहीं पड़ता है कि आपने साधारण प्रकार (यानी इंट, स्ट्रिंग आदि) या जटिल प्रकार को सौंपा है।
Ex: नियंत्रक कोड।
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 डिक्शनरी ऑब्जेक्ट है जो ViewDataDictonary वर्ग से लिया गया है ।
- डेटा केवल एक अनुरोध के लिए अनुमति देता है, पेज रीडायरेक्ट होने पर ViewData मान साफ़ हो जाते हैं।
- उपयोग करने से पहले ViewData मान को टाइप किया जाना चाहिए।
उदाहरण: नियंत्रक में
public ActionResult PassingDatatoViewWithViewData()
{
ViewData["Message"] = "This message shown in view with the ViewData";
return View();
}
दृश्य में
@ViewData["Message"];
- ViewData कुंजी और मूल्य की तरह एक जोड़ी है , संदेश कुंजी है और उलटा अल्पविराम मूल्य मान है।
- डेटा सरल है इसलिए हम यहां टाइपकास्टिंग का उपयोग नहीं कर सकते हैं यदि डेटा जटिल है तो टाइप कास्टिंग का उपयोग करें।
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. दृश्यबाग
- व्यूबग डायनेमिक फीचर का उपयोग करता है। व्यूडाटा के आसपास विजुअल रैपर।
- व्यूबैग प्रकार में कास्टिंग आवश्यक है।
- 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 को टाइपकास्टिंग की आवश्यकता है।
ViewBag और ViewData, ASP.Net MVC में देखने के लिए कंट्रोलर से जानकारी पास करने के लिए उपयोग किए जाने वाले दो साधन हैं। दोनों तंत्र का उपयोग करने का लक्ष्य नियंत्रक और दृश्य के बीच कम्युनिकेटन प्रदान करना है। दोनों का छोटा जीवन है जो पुनर्निर्देशन के घटने के बाद दोनों का मूल्य शून्य हो जाता है अर्थात, एक बार जब पृष्ठ स्रोत पृष्ठ से अनुप्रेषित हो जाता है (जहाँ हम ViewBag या ViewData का मान सेट करते हैं) तो लक्ष्य पृष्ठ, ViewDag दोनों के साथ ही ViewData अशक्त हो जाता है।
इन दोनों समानताओं के होने के बावजूद (ViewBag और ViewData) दो अलग चीजें हैं अगर हम दोनों के कार्यान्वयन के बारे में बात करते हैं। अंतर इस प्रकार हैं:
1.) यदि हम दोनों कार्यान्वयन वार का विश्लेषण करते हैं, तो हम पाएंगे कि ViewData एक डिक्शनरी डेटा संरचना है - व्यूडेटा से प्राप्त वस्तुओं का शब्दकोश और इन मूल्यों के लिए कुंजी के रूप में स्ट्रिंग्स का उपयोग करके पहुंच योग्य है, जबकि व्यूबाग सी / 4.0 में पेश किए गए गतिशील सुविधाओं का उपयोग करता है। एक गतिशील संपत्ति है।
2.) व्यूडेट फॉर्म को एक्सेस करने के दौरान, हमें वैल्यूज (डेटाटाइप्स) टाइप करने की जरूरत है क्योंकि वे व्यूडाटा डिक्शनरी में ऑब्जेक्ट्स के रूप में स्टोर किए जाते हैं, लेकिन व्यूबाग के मामले में वें वैल्यू एक्सेस कर रहे हैं तो ऐसी कोई जरूरत नहीं है।
3.) ViewBag में हम इस तरह से मान सेट कर सकते हैं:
ViewBag.Name = "Value";
और निम्नानुसार उपयोग कर सकते हैं:
@ViewBag.Name
ViewData के मामले में मान निम्नानुसार सेट और एक्सेस किए जा सकते हैं: ViewData को निम्नानुसार सेट करना:
ViewData["Name"] = "Value";
और इस तरह से पहुँच मूल्य
@ViewData["Name"]
अधिक जानकारी के लिए यहां क्लिक करें: