व्यूबैग एक गतिशील शब्दकोश है। तो जब कार्य विधियों और विचारों के बीच डेटा स्थानांतरित करने के लिए व्यूबैग का उपयोग करते हैं, तो आपके कंपाइलर को आपके दृश्य में व्यूबैग आइटम तक पहुंचने का प्रयास करते समय आपके कोड में टाइपो बनाने में सक्षम नहीं होगा। आपका दृश्य रन टाइम पर क्रैश हो जाएगा :(
आम तौर पर आपके एक्शन विधियों और विचारों के बीच डेटा स्थानांतरित करने के लिए एक दृश्य मॉडल का उपयोग करना एक अच्छा विचार है। मॉडल देखें एक साधारण पीओसीओ वर्ग है जिसमें दृश्य के लिए विशिष्ट गुण हैं। यदि आप देखने के लिए कुछ अतिरिक्त डेटा पास करना चाहते हैं, तो अपने दृश्य मॉडल में एक नई संपत्ति जोड़ें और इसका उपयोग करें। सशक्त टाइप किए गए दृश्य कोड क्लीनर और बनाए रखने के लिए अधिक आसान बनाते हैं। इस दृष्टिकोण के साथ, आपको स्पष्ट कास्टिंग करने की आवश्यकता नहीं है आप दृश्य बैग के साथ क्या करना है जो कुछ प्रकार के आगे पीछे करने के लिए अपने viewbag शब्दकोश मद।
public class ProductsForCategoryVm
{
public string CategoryName { set;get; }
public List<ProductVm> Products { set;get;}
}
public class ProductVm
{
public int Id {set;get;}
public string Name { set;get;}
}
और अपनी कार्रवाई विधि में, इस दृश्य मॉडल की एक वस्तु बनाने के गुण लोड और देखने के लिए कि भेजें।
public ActionResult Category(int id)
{
var vm= new ProductsForCategoryVm();
vm.CategoryName = "Books";
vm.Products= new List<ProductVm> {
new ProductVm { Id=1, Name="The Pragmatic Programmer" },
new ProductVm { Id=2, Name="Clean Code" }
}
return View(vm);
}
और आपके विचार, जो दृढ़ता से दृश्य मॉडल के लिए लिखा गया हो,
@model ProductsForCategoryVm
<h2>@Model.CategoryName</h2>
@foreach(var item in Model.Products)
{
<p>@item.Name</p>
}
ड्रापडाउन डेटा?
कई ट्यूटोरियल/पुस्तकों में कोड नमूने हैं जो ड्रॉपडाउन डेटा के लिए व्यूबैग का उपयोग करते हैं। मैं व्यक्तिगत रूप से अभी भी महसूस करता हूं कि इसके लिए व्यूबैग का उपयोग नहीं किया जाना चाहिए। ड्रॉपडाउन डेटा पास करने के लिए यह आपके व्यू मॉडल में List<SelectListItem
> की एक संपत्ति होनी चाहिए। यहां एक post है उदाहरण के साथ कोड कैसे करें।
क्या ऐसी स्थितियां हैं जहां व्यूबैग बिल्कुल जरूरी है?
कुछ वैध उपयोग के मामलों जहां (आवश्यक नहीं) कर सकते हैं ViewBag का उपयोग डेटा भेजने के लिए कर रहे हैं। उदाहरण के लिए, आप अपने लेआउट पेज पर कुछ दिखाना चाहते हैं, इसके लिए आप व्यूबैग का उपयोग कर सकते हैं। एक और उदाहरण ViewBag.Title
(पृष्ठ शीर्षक के लिए) डिफ़ॉल्ट एमवीसी टेम्पलेट में मौजूद है।
public ActionResult Create()
{
ViewBag.AnnouncementForEditors="Be careful";
return View();
}
और लेआउट में, आप ViewBags साथ ViewBag.AnnouncementForEditors
<body>
<h1>@ViewBag.AnnouncementForEditors</h1>
<div class="container body-content">
@RenderBody()
</div>
</body>
माइक्रोसॉफ्ट के परिप्रेक्ष्य से, हम कभी भी व्यूबैग या व्यूबैग का उपयोग करने के लिए सहमत नहीं हैं, मॉडल नंबर पास करने के लिए व्यूबैग का उपयोग करने वाला कोई नंबर नहीं है और इसे निराश किया जाना चाहिए। मेटा-डेटा (सूची का चयन करें) पास करने के लिए व्यूबैग का उपयोग करना ठीक है। सैंडर्सन और अन्य पुस्तकों द्वारा प्रो एमवीसी उनका उपयोग करते हैं और ऐसी कोई निश्चित घोषणा नहीं करते हैं - 2. एबीएस आवश्यक - मुझे शक है। – RickAndMSFT