آشنایی با ViewBag و ViewData در ASP.NET CORE

آشنایی با ViewBag و ViewData در ASP.NET CORE

ViewBag و ViewData برای انتقال داده ها از کنترلر – Controller به ویو – View مورد استفاده قرار میگیرند. در اصل ViewData یک دیکشنری از ابجکت ها – dictionary of objects میباشد. و بر اساس Key – Value کار میکند. ViewData یکی از property های controller است، که نمونه ای از کلاس ViewDataDictionary را نمایش میدهد. ViewBag بسیار شبیه ViewData است، در اصل یک Dynamic Property میباشد. ViewBag قادر به Set و Get کردن مقادیر به صورت داینامیک میباشد.

آشنایی با ViewBag و ViewData در ASP.NET CORE

آشنایی با ViewBag و ViewData در ASP.NET CORE

ViewBag چیست؟

ViewBag در ASP.NET یک مکانیزم برای انتقال داده‌ها به صورت موقت است، که در مدل گنجانده نشده‌اند. و برای انتقال داده‌ها از کنترلر به ویو به طور داخلی مورد استفاده قرار میگیرند. ViewBag یک property از نوع داینامیک در کلاس ControllerBase است. که کلاس پایه‌ی Controller می‌باشد.

ویو بگ این امکان را می‌دهد که مقادیر مختلفی را بدون نیاز به تعریف قبلی، به ViewBag اضافه کنیم و در ویو به آن‌ها دسترسی پیدا کنیم. اما، باید توجه داشت که ViewBag فقط برای انتقال داده از کنترلر به ویو است و نه برعکس، و مقادیر آن در صورت انجام ریدایرکت (redirection)، null خواهند شد.

ViewBag یک پراپرتی Property پویا یا Dynamik از کلاس Controller هست ، پس در هر کلاسی که از کلاس Controller ارث بری می کند می توان از این پراپرتی پویا استفاده کرد.

نحوه تعریف ViewBag در Action

public IActionResult Index()
{
    ViewBag.Name = "TehranIT.Net";
    ViewBag.Time= DateTime.Now;
    return View();
}

نحوه نمایش ViewBag در View

<span>Name : </span> @ViewBag.Name
<br />
<span>Time : </span> @ViewBag.Time

ViewData چیست؟

ViewData یک مکانیزم در ASP.NET میباشد، که برای انتقال داده‌ها از کنترلر به ویو استفاده می‌شود. این مکانیزم برای ارسال داده‌ها از کنترلر به ویو در الگوی طراحی MVC استفاده می‌شود. معمولاً برای ارسال داده‌ها از کنترلر به ویو از ViewData استفاده می‌شود. ViewData یک متغیر dynamic است که از آن برای ذخیره و ارسال داده به ویو استفاده می‌شود. در کنترلر، می‌توانید داده‌های مورد نیاز را به ViewData اضافه کنید، سپس این داده‌ها در ویو قابل دسترسی خواهند بود.

ViewData یک متغیر پویا یا Dynamik از کلاس Controller هست ، پس در هر کلاسی که از کلاس Controller ارث بری می کند می توان از این متغیر پویا استفاده کرد.

نحوه تعریف ViewData در Action

ViewData["Name"] = "TehranIt.Net";

نحوه نمایش ViewData در View

@ViewData["Name"]

تفاوت ViewBag با ViewData

ViewBag و ViewData هر دو برای انتقال داده‌ها از کنترلر به ویو مورد استفاده قرار میکیرند، اما تفاوت‌هایی نیز با هم دارند:

ViewData یک متغیر dynamic است که از آن برای ارسال داده‌ها از کنترلر به ویو استفاده می‌شود. ViewData به صورت یک دیکشنری  از object ها میباشد برای دسترسی به داده‌ها در ویو، باید آن‌ها را با استفاده از کلید مربوطه خواند.

ViewBag یک پراپرتی داینامیک است که از آن برای ارسال داده‌ها از کنترلر به ویو استفاده می‌شود. در واقع، ViewBag یک dynamic property bag است که به عنوان یک Wrapper برای ViewData عمل می‌کند و مقداردهی و دسترسی به داده‌ها را راحت‌تر می‌کند. با استفاده از ViewBag، نیازی به استفاده از کلیدها برای دسترسی به داده‌ها نیست و می‌توان به صورت مستقیم به آن‌ها دسترسی پیدا کرد.

بنابراین، تفاوت اصلی بین ViewData و ViewBag این است که ViewData یک دیکشنری است که باید با استفاده از کلیدها به داده‌ها دسترسی یابید، در حالی که ViewBag یک dynamic property bag است که به صورت مستقیم دسترسی به داده‌ها را فراهم می‌کند.

سورس کد TransferData ViewBag ViewData

شما می‌توانید سورس کد کامل TransferData ViewBag ViewData را از طریق گیت مشاهده کنید و یا اگر گیت کار نمی‌کنید، به راحتی آن را به صورت فایل فشرده (ZIP) دانلود کنید. فایل‌های دانلودی شامل تمام بخش‌های پروژه است و می‌توانید آن را روی سیستم خود اجرا یا تغییر دهید.

سورس کد TransferData ViewBag ViewData

مشاهده در آپارات یا یوتیوب

محتوای ویدیویی این صفحه در سایت قابل مشاهده است. اما اگر عادت دارید توی پلتفرم آپارات یا یوتیوب ویدیوها را مشاهده کنید، می‌توانید از دکمه‌های زیر استفاده کنید.

تماشای ویدیوی آشنایی با ViewBag و ViewData در ASP.NET CORE در آپارات و یوتیوب

اشتراک‌گذاری با یک کلیک

با یک کلیک، محتوای این صفحه را در شبکه‌های اجتماعی، ایمیل یا پیام‌رسان‌های مورد علاقه‌تان به‌سرعت به اشتراک بگذارید.

اشتراک‌گذاری صفحه آشنایی با ViewBag و ViewData در ASP.NET CORE در شبکه‌های اجتماعی

نظرات ارزشمند شما

نظرات شما برای ما ارزشمند است و آنها را میخوانیم و پاسخ میدهیم.

تصویر bassam

سلام
چرا باید از viewbag استفاده کنیم، تفاوتش نسبت به اون روشی که با return View() میفرستادیم چیه؟

تصویر محمدرضا احدیان

باسلام.
وقتی نیاز به ارسال داده‌های کوچک و موقت مثل پیام‌های ساده یا داده‌های کم‌حجم داریم. و یا وقتی مدل ویو پیچیده نیست و نیازی به چک کردن نوع داده در کامپایل تایم نداریم. و یا برای ارسال متغیرهای اضافی کنار مدل اصلی مثلاً پیام‌های هشدار یا اطلاعات اضافی از ViewBag استفاده میکنیم.
وقتی داده‌های ساختاریافته و پیچیده داریم. و یا وقتی از فرم‌های ورودی استفاده می‌کنیم باید از return View(model) استفاده کنیم. استفاده از ViewBag فقط برای داده‌های ساده مناسب است.
<img src="https://tehranit.net/wp-content/uploads/2025/03/ReturnViewVsViewBag.jpg" alt="ViewBag" style="width:100%" />
در کل میتوان گفت از ViewBag فقط برای مقادیر ساده و کم‌حجم استفاده میکنیم و داده‌های پیچیده را با مدل return View(model) ارسال میکنیم.

تصویر alamir

سلام داخل ViewData , object
ذخیره میشه در بخش view
برای downcasting, user انجام شد که درست هست پس چرا برای سایر مقادیر بدون cast کردن نشان میدهد. مگرنه اینکه , base class , object همه کلاس ها میباشد پس برای مقادیر مثل string نیز باید cast شود و برای integer که cast میکنیم چون value type هست , unboxing میاشد باید انجام داد درحالی که بدون cast کردن نیز جواب میدهد.

تصویر alamir

من چک کردن در ویو cast کردن لازم نبوده ولی در خود کنترلر باید حتما cast بشه
var str = TempData["Name"];
if (str != null)
{
return Content((string)str);
}

تصویر محمدرضا احدیان

در ViewData همه مقادیر به‌صورت object ذخیره می‌شن، چون دیکشنری از نوع Dictionary<string, object> هست. بنابراین هنگام بازیابی مقدار، باید به نوع اصلیش Cast یا Unbox بشه. برای انواع مقدار‌ی (مانند int) عملیات unboxing نیاز هست و اگه نوع رو اشتباه Cast کنیم، خطای زمان اجرا (InvalidCastException) می‌گیریم. اما در مورد string، چون هم string یک reference type هست و هم compiler به‌طور خودکار cast را انجام می‌دهد (implicit casting)، معمولاً بدون نیاز به cast دستی کار می‌کنه. با این حال، در پشت‌صحنه همچنان عملیات cast انجام می‌شه؛ فقط ما نیازی نداریم اون‌رو به‌صورت صریح بنویسیم. برای اطمینان و خوانایی بهتر، پیشنهاد می‌شه همیشه از cast صریح یا الگوهایی مانند as string یا Convert.ToInt32(...) استفاده بشه.

تصویر محمدرضا احدیان

در Razor View (cshtml)، موتور Razor به‌صورت خودکار تلاش می‌کند objectهای ذخیره‌شده در ViewData یا TempData را به نوع موردنظر تبدیل کند، مخصوصاً برای string که reference type است و casting ضمنی (implicit) برای آن مجاز است. اما در کنترلر که مستقیماً با زبان C# کار می‌کنیم، متغیرهای خوانده‌شده از TempData از نوع object هستند و برای استفاده از ویژگی‌ها یا متدهای مخصوص نوع اصلی (مثل string.Length) نیاز به cast صریح داریم؛ به همین دلیل در کنترلر باید بنویسیم (string)TempData["Name"]. این تفاوت به دلیل سیاست‌های نوع‌دهی سخت‌گیرانه در C# در مقایسه با موتور Razor است.

فرم افزودن دیدگاه

با ارسال نظرات خود ما را در ایجاد محتوای بهتر کمک کنید.

با خدمات تهران آی تی آشنا شوید

تهران آی تی با افتخار خدمات زیر را ارائه می‌دهد.