یادداشتهای یک برنامه نویس

بیان تجربیات و دیدگاه های یک برنامه نویس در مورد نرم افزار , طراحی و تولید برنامه با استفاده از تکنولوژی های مایکروسافت

یادداشتهای یک برنامه نویس

بیان تجربیات و دیدگاه های یک برنامه نویس در مورد نرم افزار , طراحی و تولید برنامه با استفاده از تکنولوژی های مایکروسافت

یکی از ارکان اصلی MVC و حتی MVVM توجه به این نکته بسیار مهم است که هیچ ارتباط مستقیم (Reference) و وابستگی (Dependency) بین Model و View وجود نداشته باشد. از سوی دیگر همه ما می دانیم که یکی از نیازهای اصلی در یک برنامه تبادل اطلاعات بین UI و Data source می باشد که وظیفه انجام این ارتباط در MVVM به عهده ViewModel و در MVC به عهده Controller است .
به طور کلی در MVC سه مکانیسم برای ارتباط Controller با View جهت تامین اطلاعات مورد نیاز در View پیش بینی شده است .


روش اول استفاده از ViewData


از دیدگاه ساختمان داده، ViewData یک Dictionary تلقی میشود و چنانچه از قبل میدانیم Dictionary دارای ساختاری است که با استفاده از دو جزء کلید و مقدار (Key Value Pair) امکان دستیابی به این ساختار میسر می باشد . به طور مشخص با تعیین یک کلید (Key) دلخواه مقادیر مورد نظر خودمان را در Dictionary ذخیره کرده و یا بازیابی می کنیم.


public ActionResult ShowError()
{
ViewData["ErrorCode"] = 12345;
ViewData["ErrorDescription"] = "Something bad happened";
ViewData["ErrorDate"] = DateTime.Now;
ViewData["Exception"] = new Exception();
return View();
}


در مثال ارائه شده با تعیین کلیدهای ErrorCode و ErrorDescription و ٍErrorDate و Exception به ترتیب مقادیر 12345 و Something bad happened و DateTime.Now و یک نمونه از کلاس Exception در ViewData قرار گرفته است . بر اساس همین مثال میتوان نتیجه گرفت که امکان قرار دادن هر نوع داده دلخواه ، شامل انواع پایه ساده (Primitive Types) تا انواع داده های پیچیده تر (Complex Types) در ViewData میسر می باشد . همچنین در مثال فوق واضح است که با توجه به اینکه با استفاده از return View() ، صریحا نام View ذکر نشده است، چنانچه قبلا اشاره شد، Controller اطلاعات موجود در ViewData را به یک View هم نام با action یعنی ShowError (فایل ShowError.cshtml) ارسال خواهد کرد. همچنین در مورد محل پیش فرض این فایل قبلا توضیحاتی ارائه شده است .
در Viewی مذکور و با استفاده از موتور Razor دسترسی به اطلاعات ارسال شده به View میسر خواهد بود .


<h1>An error was found</h1>
<h2>Error Code: @ViewBag.ErrorCode</h2>
<h2>@ViewBag.ErrorDescription</h2>


روش دوم استفاده از ViewBag


این روش از بسیاری از جهات با روش قبلی مشابه می باشد و تنها تفاوت در اینجاست که در ViewBag از ویژگی خواص پویا (Dynamic Property) که در C# 4.0 معرفی شد استفاده شده است . لطفا به مثال ساده ای در این زمینه توجه کنید:


public ActionResult ShowError()
{
ViewBag.ErrorCode = 12345;
ViewBag.ErrorDescription = "Something bad happened";
ViewBag.Exception = new Exception();
return View();
}


در این صورت روش دسترسی به داده های موجود در ViewBag از View به صورت زیر خواهد بود :

 

<h1>An error was found</h1>
<h2>Error Code: @ViewBag.ErrorCode</h2>
<h2>@ViewBag.ErrorDescription</h2>


جالب است بدانیم که حتی در هنگام استفاده از ViewBag عملا از ViewData استفاده میشود که در حقیقت از یک Dictionary واحد برای ارسال اطلاعات از Controller به View استفاده خواهد شد. در اینجا ممکن است این سوال مطرح شود که بر اساس مطلبی که عنوان شد آیا استفاده از ViewBag.ErrorCode = 12345; و در ادامه دستیابی به این اطلاعات در View به صورت <h2>@ViewData["ErrorCode"]</h2> مجاز می باشد ؟
پاسخ این سوال مثبت است و البته واضح است که لزومی به استفاده از این روش نیست و تا زمانیکه نام کلید دارای کاراکتر های مجاز و مخصوصا فاقد Space باشد مورد مذکور معتبر خواهد بود .
یک نکته بسیار مهم در هنگام استفاده از ViewData یا ViewBag این است که به محض آنکه View میزبان اطلاعات موجود در یکی از این دو ساختار Dictionary را Render نماید ، دسترسی مجدد به این Dictionary مجاز نخواهد بود . در یک سناریوی ساده تصور کنید که بعد از یک بار Render کردن اطلاعات Dictionary با استفاده از یک RedirectToAction ، مسیر پردازش به یک action دیگر (که نام آن در پارامتر ذکر خواهد شد) هدایت شود . در این صورت واضح است که یک کد 302 به Browser ارسال میشود که از سوی Browser ، اجبار به Redirect به یک مقصد جدید تلقی و تفسیر خواهد شد . در این صورت محتویات Dictionary (منظور ViewData یا ViewBag) به طور کامل Reset شده و دستیابی به این اطلاعات در View جدید به هیچ وجه میسر نخواهد بود . در صورت برخورد با سناریوی مشابه (یعنی نیاز به حفظ موقت اطلاعات تقریبا مشابه با تکنیک استفاده از ViewState در ASP .NET Web Form) توصیه شده که از ساختار TempData که اطلاعات خود را در Session ذخیره می نماید استفاده شود .


روش سوم استفاده از مفهوم Strongly Typed View:


با وجود انعطاف و سادگی دو روش مذکور در بسیاری از سناریو ها امکان استفاده از ViewData و ViewBag میسر نیست و بر اساس توضیحاتی که ارائه شد، به نظر میرسد که استفاده از این دو با محدودیت هایی روبرو می باشد ...

 ... ادامه دارد
 

موافقین ۰ مخالفین ۰ ۹۳/۰۲/۱۸
مهران حسین نیا

نظرات  (۰)

هیچ نظری هنوز ثبت نشده است

ارسال نظر

ارسال نظر آزاد است، اما اگر قبلا در بیان ثبت نام کرده اید می توانید ابتدا وارد شوید.
شما میتوانید از این تگهای html استفاده کنید:
<b> یا <strong>، <em> یا <i>، <u>، <strike> یا <s>، <sup>، <sub>، <blockquote>، <code>، <pre>، <hr>، <br>، <p>، <a href="" title="">، <span style="">، <div align="">
تجدید کد امنیتی