
آشنایی با 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 چیست؟
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.TimeViewData چیست؟
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) دانلود کنید. فایلهای دانلودی شامل تمام بخشهای پروژه است و میتوانید آن را روی سیستم خود اجرا یا تغییر دهید.
































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