ViewData vs ViewBag در ASP.NET Core MVC
اگر با ASP.NET Core MVC کار میکنی، احتمالاً با این دو مورد برخورد کردی:
ViewData و ViewBag
هر دو برای انتقال داده از Controller به View استفاده میشوند، اما یک تفاوت مهم در نحوه استفاده دارند.
1️⃣ ViewData چیست؟
ViewData یک Dictionary است که دادهها را با یک Key ذخیره میکند:
public IActionResult Index()
{
ViewData["Title"] = "Product List";
ViewData["Message"] = "Welcome to our store";
return View();
}
و در View:
<h1>@ViewData["Title"]</h1>
<p>@ViewData["Message"]</p>
یعنی شما داده را با یک string key ذخیره و سپس با همان key دریافت میکنید.
2️⃣ ViewBag چیست؟
ViewBag یک روش سادهتر برای دسترسی به همان دادههاست:
public IActionResult Index()
{
ViewBag.Title = "Product List";
ViewBag.Message = "Welcome to our store";
return View();
}
در View:
<h1>@ViewBag.Title</h1>
<p>@ViewBag.Message</p>
اینجا دیگر نیازی به ["Title"] نداریم.
تفاوت اصلی چیست؟
| ViewData | ViewBag |
|---|---|
| Dictionary است | Dynamic property است |
| استفاده با Key | استفاده با Property |
ViewData["Title"] | ViewBag.Title |
| نیاز به Key دارد | خواناتر است |
| امکان خطای Key وجود دارد | امکان خطای نام Property وجود دارد |
اما نکته مهم:
ViewBag و ViewData دو سیستم کاملاً جدا نیستند.
در ASP.NET Core MVC، ViewBag در واقع یک wrapper روی ViewData است.
یعنی:
ViewData["Title"] = "Products";
و:
ViewBag.Title = "Products";
به همان ViewData مربوط میشوند.
حتی میتوانی این را انجام بدهی:
ViewData["Title"] = "Products";
و در View:
<h1>@ViewBag.Title</h1>
پس کدام را استفاده کنیم؟
برای دادههای ساده و کوچک که فقط برای نمایش یا اطلاعات جانبی View هستند، هر دو قابل استفادهاند.
مثلاً:
ViewBag.PageTitle = "Products";
ViewBag.TotalProducts = 25;
اما برای داده اصلی صفحه، معمولاً بهتر است از Strongly Typed ViewModel استفاده کنی.
مثلاً به جای:
ViewBag.Products = products;
بهتر است:
public IActionResult Index()
{
var model = new ProductViewModel
{
Products = products
};
return View(model);
}
و در View:
@model ProductViewModel
@foreach (var product in Model.Products)
{
<p>@product.Name</p>
}
خلاصه
ViewData و ViewBag → برای دادههای جانبی و ساده
ViewModel → برای داده اصلی و ساختاریافته View
اگر پروژه MVC واقعی میسازی، وابسته کردن View به تعداد زیادی ViewBag معمولاً خیلی زود کد را سختتر میکند.
در قسمت بعدی میتوانیم سراغ Partial View برویم و ببینیم چطور بخشهای مشترک View را به کامپوننتهای قابل استفاده مجدد تبدیل کنیم.




عالی ساده مفید