انتقال اطلاعات در asp.net mvc
بسم الله الرحمن الرحیم
همانطور که اطلاع دارید در برنامه های asp.net mvc ما سه شی dynamic داریم.
این سه شی عبارت اند از
اشیا dynamic در mvc
ViewBag
ViewData
TempData
این اشیا به ما اجازه می دهند به صورت داینامیک Property های مورد نیاز خود را به آن اضافه کنیم. برای مثال
ViewData["firstName"] = "Esmaeil";
TempData["firstName"] = "Esmaeil";
ViewBag["firstName"] = "Esmaeil";
این ویژگی باعث می شود شما بتوانید اطلاعات مورد نیاز خود را در سطح برنامه به صورت موقت نگهداری کنید، این اشیا در واقع اطلاعات شما را در Session نگه داری می کنند، اما Scope و یا طول عمر هر یک از این سه شی با یکدیگر متفاوت است.
ViewBag
فقط تا زمانی که در Action و View مرتبط با آن هستید اعتبار دارد، برای انتقال اطلاعات از یک کنترلر به View مورد استفاده قرار می گیرد.
ViewData
فقط تا زمانی که در Action و View مرتبط با آن هستید اعتبار دارد. دقیقا مانند ViewBag است اما احتیاج به Type casting دارد.
TempData
برای انتقال اطلاعات از یک صفحه به صفحه دیگر مورد استفاده قرار می گیرد.
مهمترین مزیت TempData این است اگر شما اطلاعات آن را یک بار بخوانید، فضای اختصاص داده شده به Property شما آزاد خواهد شد.
مثال:
TempData["firstName"]="Esmaeil";
/**...Something*/
var firstName = TempData["firstName"];
پس از خواندن اطلاعات درون TempData، این اطلاعات از بین خواهند رفت، همین امر باعث می شود شما نیاز داشته باشید هر بار قبل از خواندن اطلاعات TempData، بررسی کنید که آیا TempData مقدار دارد و یا null است.
برای اینکار باید به صورت زیر عمل کنیم:
if (TempData["firstName"] != null)
var firstName = TempData["firstName"];
خط اول، مشخصا بررسی می کند که TempData ما برای Property ما (firstName) مقدار دارد یا خیر و در صورتی که مقدار داشته باشد خط بعد اجرا خواهد شد.
اما یک مشکل در این جا وجود دارد! جمله زیر را مجددا بخوانید
مهمترین مزیت TempData این است اگر شما اطلاعات آن را یک بار بخوانید، فضای اختصاص داده شده به Property شما آزاد خواهد شد.
این بدین معنا است که در خط اول با جرا شدن دستور if و بررسی اطلاعات درون TempData مقدار آن null خواهد شد و عملا خط بعد ما مقداری برای بازیابی نخواهیم داشت
راه حل چیست؟
راه حل اینکار بسیار ساده است کافی است برای جلوگیری از null شدن مقدار TempData در خط if خود به صورت زیر عمل کنید:
if(TempData.Peek("firstName") != null)
var firstName = TempData["firstName"];
دستور TempData.Peek فقط مقدار درون پرانتز را بررسی می کند.