در قسمت قبلی یک لیست از رستورانها را نمایش دادیم و این قابلیت را با استفاده از یک ViewModel به صورت ساده تر به نمایش گذاشتیم . مسئله اینجاست که همیشه نمی توان همه داده ها را در یک صفحه خلاصه و نمایش داد .
بسمه تعالی
ASP.NET Core 1 – قسمت هجدهم
در قسمت قبلی یک لیست از رستورانها را نمایش دادیم و این قابلیت را با استفاده از یک ViewModel به صورت ساده تر به نمایش گذاشتیم . مسئله اینجاست که همیشه نمی توان همه داده ها را در یک صفحه خلاصه و نمایش داد . گاهی لازم است بخشی از داده ها بر اساس درخواست و کلیک کاربر در صفحه ای دیگر و به صورت مجزا نمایش داده شود ، ضمن اینکه این کار سبب جلوگیری از Load حجم زیادی از Data در خیلی از موارد خواهد شد . در این قسمت به بررسی چگونگی سناریوی نمایش Detail برای هر رکورد خواهیم پرداخت .
اولین قدم اضافه کردن یک Action Method دیگر خواهد بود . وظیفه این Action Method نمایش ریز اطلاعات رکورد انتخاب شده خواهد بود . مسلمن این Action Method هم دارای خروجی view Result خواهد بود . هر رکورد در سناریوی فعلی یک ID دارد که unique میباشد و در نتیجه متد ما هم باید دارای یک ورودی ID باشد تا بر اساس آن مشخص شود کدام رکورد انتخاب شده است .
فعلن برای اینکه بتوان نمایش داد که ID انتخاب شده در وضعیت درستی قرار دارد یا نه ، نوع خروجی متد را String قرار داده و فقط مقدار وارد شده را بر میکردانیم .
خوب حالا با اجرای پروزه و استفاده از 2//Home/Detail به عنوان مثال می توانید نتیجه را ببینید . مقدار وارد شده در خروجی نمایش داده خواهد که در اینجا 2 خواهد بود . اگر Routing را به خاطر داشته باشید ، می توانید متوجه شوید که ID چگونه به عنوان یک پارامتر در سیستم Handle خواهد شد .
این مقدار همانطور که مشاهده میکنید Optional تعریف شده بود و در صورت مقدار دهی میتوان از آن استفاده کرد . از طریق Route تعریف شده ، سیستم منتظر یک مقدار به ازای ID خواهد بود . به عنوان مثال اگر پارامتر را به شکل Details?id=2 هم وارد کنید ، باز هم وضعیت مشابه خواهد بود و Query String را هم به عنوان پارامتر ورودی خواهد شناخت به شرطی که ID را به عنوان پارامتر در URL ببیند .
خوب حالا برویم و متد تازه ایجاد شده را برای نمایش رکورد انتخاب شده سر و سامان دهیم .
حالا که خروجی متد را عوض کردیم و متدی به نام Get استفاده کردیم که اصلن وجود خارجی ندارد ، باید به سراغ Service از قبل ایجاد شده رفته و متد را برای آن ایجاد کنیم و بعد بازکردیم و خروجی متد را تصحیح و آنرا به حالت مورد نظر تغییر دهیم .
برای ایجاد سرویس جدید باید به سراغ RestaurantData.cs رفته و تغییرات لازم را در آن ایجاد کنیم .
اولن باید یک متد به نام Get به Interface ایجاد شده اضافه گردد . در مرحله بعد باید این متد پیاده سازی و بدنه آن ایجاد شود . بدنه متد عملن یک خط کد Linq خواهد بود که سبب یافته شده رکورد بر اساس ID و سپس Return شدن آن خواهد شد . مواظب اضافه شدن System.Linq در NameSpace ها هم باشید .
خوب حالا باید تغییرات لازم در Home Controller ایجاد گردد.
تصویر بالا نتیجه تغییر در HomeController میباشد . مقدار Model به View پاس داده خواهد شد. خوب حالا به یک View جدید به نام Details نیاز داریم تا جزئیات را نمایش دهیم . برای ساده شدن کار من یک Copy از Index خواهم گرفت و نام آنرا عوض خواهم نمود .روی نام Index یک Ctrl+C بزنید و بعد در همان فولدر Home باز Ctrl+V زده و سپس فایل را Rename ونام آنرا Details قرار دهید .
برای این Viewجدید در اولین قدم باید Model صفحه را عوض نمود . بعد از آن هم باید محتوای صفحه را طوری تغییر داد که فقط نام رستوران انتخاب شده زا نمایش دهد . تغییرات به شکل زیر خواهد بود .
خوب حالا اگر در هنگام تست به جای /Home/Details/2 مثلن وارد کنیم /Home/Details/99 خواهیم دید که با پیام خطا روبرو خواهیم شد چرا که هیج رکوردی یافت نخواهد شد . View به دنبال یک Model غیر Null میگردد و با پیدا نشدن هیچ رکوردی این مقدار Null خواهد بود. برای جلوگیری از بروز خطا راههای زیادی هست . مثلن میتوان در Details Action یک IF برای بررسی مقدار و Null نبودن آن و سپس ایجاد خطای 404 در صورت Null بودن ایجاد کرد . برای اینکار باید مطابق شکل زیر خروجی متد را هم IActionResult قرار داد .
یا مثلن میتوان در صورت یافت نشدن رکورد و Null بودن مدل ، باز به همان صفحه Index باز گردیم . برای اینکار باید از Redirecttoaction استفاده کنیم.
وقتی به صفحه Details میرویم ، بد نیست یک Link برای بازگشت هم داشته باشیم . برای اینکار راههای متعددی هست که امتحان میکنیم .
وضعیت تگ A که روشن است . دومی هم یک HTML Helper است که در MVC 5 هم وجود داشت و برای ما Link تولید خواهد کرد . مقدار اول یک متن و مقدار بعدی نام Action Method خواهد بود . به دلیل عدم ذکر نام Controller فرض MVC بر این خواهد بود که در Current Controller به دنبال این متد باید بگردد. نتیجه هم 2 عدد Link با متن Home خواهد بود که در پایین صفحه Details ما را به صفحه Index هدایت خواهند کرد .
خوب در لیست رستورانها هم باید مثلن ID آنها یک Link باشد و بتوان با کلیک بر روی ان به صفحه Details رفت . برای اینکار کافی است از یک Actionlink دیگر در Index View هم استفاده کنیم .
همانطور که مشاهده میکنید Action Link میتواند یک Text برای نمایش و یک نام ActionMethod و یک پارامتر هم بگیرد و این پارامتر همان ID خواهد و با Save و اجرای پروژه خواهید دید که در لیست از این به بعد ID یک لینک است و می توان با کلیک روی آن به صفحه Details رفت .
وقتی من روی رکورد شماره 2 میروم و موس را روی ID شماره 2 نگه میدارم این لینک در پایین صفحه نمایان میشود و این یعنی همان URL که به صورت دستی در Browser وارد میکردیم و در اصل یعنی همان چیزی که میخواستیم .
در قسمت بعدی به بررسی Input Model های پیچیده تر و ایجاد فرم ثبت رستوران خواهیم پرداخت .
دانلود سورس پروژه
علی کلاهدوزان
موفق باشید .