ViewBag C# 4.0 में पेश की गई डायनामिक फीचर का उपयोग करता है। यह एक ऑब्जेक्ट को डायनामिकली प्रॉपर्टीज जोड़ने की अनुमति देता है। आंतरिक रूप से, यह ControllerBase क्लास की एक डायनामिक टाइप प्रॉपर्टी है जो Controller क्लास का बेस क्लास है।
ViewData से ViewBag के अंतर
| विशेषता | ViewData | ViewBag |
|---|---|---|
| सिंटैक्स | ViewData["Key"] | ViewBag.Key |
| टाइप | ViewDataDictionary | dynamic (ExpandoObject) |
| कंपाइल-टाइम चेकिंग | नहीं | नहीं |
| इंटेलीसेंस | नहीं | सीमित (डायनामिक) |
| नल हैंडलिंग | कास्टिंग आवश्यक | नल रेफरेंस एक्सेप्शन संभव |
ViewBag में डेटा स्टोर करना
ViewBag.Countries = countriesList;
ViewBag से डेटा रिट्रीव करना
string country = ViewBag.Countries;
महत्वपूर्ण विशेषताएं
- केवल कंट्रोलर से व्यू में डेटा ट्रांसफर करता है (वन-वे)
- रिडायरेक्शन होने पर ViewBag वैल्यूज नल हो जाती हैं
- डायनामिकली वैल्यू सेट और गेट कर सकते हैं
- कन्वर्जन के बिना किसी भी संख्या में अतिरिक्त फील्ड्स जोड़ सकते हैं
उदाहरण: कंट्रोलर
using System.Collections.Generic;
using System.Web.Mvc;
namespace DemoMvcApplication.Controllers
{
public class HomeController : Controller
{
public ViewResult Index()
{
ViewBag.Countries = new List
{
"India",
"Malaysia",
"Dubai",
"USA",
"UK"
};
// एकाधिक प्रॉपर्टीज डायनामिकली
ViewBag.PageTitle = "Countries List";
ViewBag.CurrentUser = "Admin";
ViewBag.ItemCount = 5;
ViewBag.IsActive = true;
return View();
}
}
}
उदाहरण: व्यू (Index.cshtml)
@{
ViewBag.Title = "Countries List";
}
Countries List
@foreach (string country in ViewBag.Countries)
{
- @country
}
Page Title: @ViewBag.PageTitle
User: @ViewBag.CurrentUser
Count: @ViewBag.ItemCount
Status: @(ViewBag.IsActive ? "Active" : "Inactive")
आउटपुट

एडवांस्ड: ViewBag के साथ डायनामिक ऑब्जेक्ट्स
public ActionResult Dashboard()
{
// एनोनिमस ऑब्जेक्ट को ViewBag में असाइन करें
ViewBag.User = new
{
Name = "John Doe",
Email = "john@example.com",
Roles = new[] { "Admin", "User" },
LastLogin = DateTime.Now.AddDays(-2)
};
// नेस्टेड डायनामिक ऑब्जेक्ट्स
ViewBag.Stats = new
{
TotalUsers = 1250,
ActiveUsers = 890,
Revenue = 45000.50m
};
return View();
}
@* व्यू में *@
Users: @ViewBag.Stats.TotalUsers
Active: @ViewBag.Stats.ActiveUsers
Revenue: @ViewBag.Stats.Revenue:C
सावधानियां और सीमाएं
1. रिडायरेक्शन पर डेटा लॉस
public ActionResult Create()
{
ViewBag.Message = "Created successfully";
return RedirectToAction("Index"); // ViewBag.Message यहां खो जाएगा!
}
// समाधान: TempData उपयोग करें
TempData["Message"] = "Created successfully";
return RedirectToAction("Index");
2. टाइप सेफ्टी की कमी
// टाइपो - कंपाइल नहीं होगा, रनटाइम पर एरर
@ViewBag.Countrys // गलत स्पेलिंग - Countries होना चाहिए
// सुरक्षित पैटर्न
@{
var countries = ViewBag.Countries as List ?? new List();
}
@foreach (var c in countries) { ... }
3. परफॉरमेंस ओवरहेड
डायनामिक डिस्पैच में रनटाइम बाइंडिंग ओवरहेड होता है। हाई-परफॉरमेंस परिदृश्यों के लिए, स्ट्रॉन्गली-टाइप्ड व्यू मॉडल्स प्राथमिकता दें।
सर्वोत्तम अभ्यास
- सरल, छोटे डेटा के लिए ViewBag का उपयोग करें (टाइटल, फ्लैग्स, छोटी लिस्ट्स)
- कॉम्प्लेक्स डेटा के लिए स्ट्रॉन्गली-टाइप्ड व्यू मॉडल्स का उपयोग करें
- रिडायरेक्ट के बाद डेटा के लिए TempData का उपयोग करें
- कुंजी नामों के लिए कॉन्स्टेंट्स परिभाषित करें टाइपो से बचने के लिए
- नल-चेकिंग के साथ सुरक्षित एक्सेस पैटर्न का उपयोग करें
स्ट्रॉन्गली-टाइप्ड विकल्प (अनुशंसित)
// ViewModel
public class CountryViewModel
{
public List Countries { get; set; }
public string PageTitle { get; set; }
public int ItemCount { get; set; }
}
// Controller
public ViewResult Index()
{
var model = new CountryViewModel
{
Countries = new List { "India", "Malaysia", "Dubai", "USA", "UK" },
PageTitle = "Countries List",
ItemCount = 5
};
return View(model);
}
// View (@model CountryViewModel)
@Model.PageTitle
@foreach (var country in Model.Countries)
{
- @country
}