این مبحث درباره ی دو شئ View است که برای پاس دادن داده ها از یک کنترلر به یک view استفاده میشوند.
مورد استفاده ی این اشیای View نیز در MVC است ، در این مقاله به طور کامل و به صورت قدم به قدم چگونگی کار با آن ها به همراه تصاویر و نحوه ی استفاده ی بهینه و کاربرد کلی آن ها را شرح میدهیم.
ViewBag و ViewData برای پاس دادن داده ها از یک کنترلر به view استفاده میشوند.
حال اجازه دهید که هردوی آنها را تک تک مشاهده کنیم :
برسی کامل ViewBag و ViewData
ViewBag
ViewBag از ویژگی های پویا برای افزودن ویژگی خاص استفاده میشود که در C# ورژن ۴.۰ معرفی شد.
نسخه ی نمایشی
یک پروژه جدید ASP.NET MVC بسازید و قالب آن را خالی و موتور مشاهده آن را تیغ (Razor) بگذارید.
بر روی تایید کلیک کنید.
این کار یک پروژه خالی جدید برای ما میسازد.
به صفحه ی جستجوی راه حل (Solution Explorer) بروید و بر روی فولدر کنترلر راست کلیک کنید و سپس گزینه ی افزودن -> کنترلر کلیک کنید.
کنترلر را به HomeController تغییر دهید و قالب کنترلر MVC خالی را انتخاب کنید :
گزینه افزودن را انتخاب نمایید.
HomeController ما ساخته شد.
حال بیایبد تعدادی کد در داخل متد Index Action بنویسیم :
زمانیکه ما میگوییم ViewBag(.),
در این ViewBag ما میتوانیم هر داده ی پویایی را که میخواهیم پاس بدهیم و این داده مانند یک ویژگی پویا رفتار میکند.
ما نام برند داده ی پویا را به آن اضافه میکنیم :
ما یک لیستی از اشیای جدیدی ساختیم که در آن ۵ شئ با ارزش رشته را قرار دادیم و داده را به ViewBag.BrandName اختصاص میدهیم و در انتها مقدار View را بازمیگردانیم.
برنامه را ذخیره و اجرا کنید.
با یک خطای استثنا رو به رو میشویم زیرا ما داریم مقدار View را به جایی که هنوز نساختیم برمیگردانیم و از آنجایی که این یک متد Index Action میباشد ما یک View با همین ,Indexنام بسازید.
اما قبل از اینکه اقدامی کنیم ابتدا ببینیم که تابع View در واقع چه چیزی را بازمیگرداند.
نوع بازگشتی تابع View یک ViewResult میباشد اما متد Index Action به ما ActionResult برمیگرداند.
پس چرا برنامه اروری نمیدهد ؟
با فشردن دکمه F12 یا راست کلیک بر روی تابع View و انتخاب , به مقصد تابع View بروید.
ابتدا شما خواهید دید که تابع View , ViewResult را برمیگرداند.
اگر شما به مقصد ViewResult بروید میتوانید ببینید که این کلاس از کلاس ViewResultBase ارث بری میکند.
و حال اگر شما به مقصد ViewResultBase بروید میتوانید ببینید که این کلاس از کلاس ActionResult ارث بری میکند.
این دلیلی است که ما میتوانیم از نوع برگشتی ActionResult با وجود نوع برگشتی تابع ViewResult باشد , استفاده کنیم.
بیایید یک Index View بیافزاییم
دکمه ی افزودن را کلیک کنید.
فایل Index.cshtml ما در داخل فولدر Views ساخته خواهد شد.
در داخل تگ div ما یک un-orderedhplhri میسازیم:
• <ul>
•
• </ul>
در گام بعدی ما باید در میان BrandeName ها حلقه بزنیم و به کد زیر برای حلقه foreach استفاده میشود:
در موتور Razor View اگر شما بخواهید که از HTML به C# تغییر کد دهید و سپس از “@” استفاده کنید، ما میان هر رشته ی اشیای موجود در ViewBag.BrandName با ویژگی پویا حلقه میزنیم.
اکنون ما همه ی داده ها را در آیتمی که از ویژگی ViewBag.BrandName دریافت کردیم , داریم.
گام بعدی برای افزودن و نمایش این آیتم ها به فرم یک لیست میباشد و برای اینکار میتوانیم از <li> </li> استفاده کنیم:
برنامه را اجرا کنید.
ما با موفقیت داده ها را از یک کنترلر به View با استفاده از ViewBag.DynamicData پاس دادیم
حال بیاید ببینیم چگونه همین کار را با استفاده از ViewData اجرا کنیم.
ViewData یک دیکشنری اشیا است که رشته ها را مانند کلید ذخیره و بازیابی میکند.
کلید را به عنوان “BrandName” پاس دهید .
ما کلید Indexed string ها را در ViewData پاس داده ایم جایی که لیست جدید اشیا را ذخیره میکنیم.
در Index View ما نیاز به کمی تغییرات داریم.
حال ما احتیاج داریم که برای هر [ViewData[BrandName] , حلقه ایجاد کنیم.
برنامه را ذخیره و راه اندازی کنید.
زمانی که ما برنامه را اجرا میکنیم یک خطای کامپایل دریافت میکنیم زیرا ما نوع قالبی ViewData را به درستی انتخاب نکرده ایم.
در حال حاضر ViewData , شئ ViewDataDictionary را برمیگرداند.
تا آنجایی که ما میدانیم این ViewData داده هایی با نوع رشته را ذخیره میکند.
پس برای دریافت آن رشته ها , ما باید نوع قالبی آن را به لیست <string> تغییر دهیم :
برنامه را اجرا کنید :
حال ما هردو راه پاس دادن داده ها از کنترلر به View را مشاهده کردیم.
اما برخی چیز ها در هردوی آنها یکسان است.
هردوی ViewData و ViewBag چک خطا در زمان کامپایل ارائه نمیدهند.
بنابراین اگر ما املای غلطی برای کلمات و کلید ها بکار ببریم به ما خطای کامپایلی نشان داده نمیشود.
خطا را تنها در زمان اجرا میتوان دید.
در اینجا من BrandName را به BrandNames تغییر میدهم.
اگر ما این برنامه را بسازیم هیچ خطایی دریافت نمیکنیم اما زمانی که برنامه را اجرا کنیم با خطا مواجه میشویم.
به همین علت بهتر است که تمرین هایی مبنی بر صحیح نوشتن کلمات در Views همانطور که در بحث پیشین درباره ی سری های MVC داشتیم انجام دهید.
با تشکر
بسیار خوووب : )
لایک
مرسی و ممنون از آموزشتون
۵