تا به اینجا از یک C# Class ساده به عنوان Controller استفاده کرده ایم . این کلاس تا اینجا از هیچ کلاسی ارث بری نکرده است. در برنامه نویسی در پروژه های MVC ، معمولا Controller از یک Base Class ارث بری مینماید .
بسمه تعالی
ASP.NET Core 1 – قسمت چهارهم
تا به اینجا از یک C# Class ساده به عنوان Controller استفاده کرده ایم . این کلاس تا اینجا از هیچ کلاسی ارث بری نکرده است. در برنامه نویسی در پروژه های MVC ، معمولا Controller از یک Base Class ارث بری مینماید .
این Base Class در Microsoft.ASPNET.MVC به عنوان NameSpace قرار گرفته است . این Base Class اطلاعاتی وسیعی در مورد هر Request در اختیار ما قرار خواهد داد و اینجاست که در پروژه های سنگین و خارج از بستر Hello Word بهتر است Controller از این کلاس ارث بری نماید .
به عنوان مثال ، یکی از قابلیتهایی که در اختیار ما قرار گرفته خواهد شد ، تایین نوع خروجی Action method ها خواهد بود . در قسمتهای قبلی و تا به اینجا ، خروجی متدها یک String ساده بود ، ولی امکان داشتن خروجیهای پیچیده تر در جهت تسهیل امور مختلف در Controller ها وجود دارد.
اصولن نتایج پیچیده تر در Action Method ها در اثر داشتن بک خروجی کپسوله شده از اینترفیس IActionResult خواهد بود . این اینترفیس دارای دامنه وسیعی از خروجیها برای Action Method ها خواهد بود .
این خروجیها می توانند محتوایی برای دانلود ، Json یا XML یا ... باشند که به فراخور حال از آنها میتوان استفاده نمود.
خوب اجازه بدهید در عمل ببینیم چگونه میتوان از این توانمندیها استفاده نمود .
به درون HomeController می رویم و تغییرات لازمه را اعمال مینماییم.
اگر الان درون متد Index بروید و از عبات This. استفاده کنید، خواهید دید که دامنه Method ها و امکانات در اختیار شما بسیار محدود و ضعیف میباشد . به همین دلیل است که Controller ما باید از یک Base Class آماده ارث بری نماید . امیدوارم با مفاهیم ارث بری و کلن شی گرایی در C# آشنایی داشته باشید و محتوای کاری ما برای شما تازه نباشد .
الان باید به سراغ ارث بری برویم.
کلاس ما باید از کلاس Controller ارث بری کرده و NameSpace لازمه هم توسط Visual Studio یا خود شما باید لحاظ گردد.
حالا اگر درون متد Index از عبارت this. استفاده کنید لیست بلند بالایی از متدها و خواص را مشاهده خواهید کرد . حالا دیگر یک Action Method میتواند خروجیهای مختلف و متنوعی داشته در اطلاعات Request ها و شکل جواب و به آنها و ... مدیریت شده تر و دقیق تر باشد .
در اینجا یک String ساده از نمایش داده ایم . اجازه بدهید همین خروجی را کمی دقیق تر و استاندارد تر نمایش دهیم . بجای ایجاد خروجی String به شکل زیر عمل کنید . اگر نوع خروجی متد را ContentResult قرار دهم ، هر نوع خروجی در متد را پشتیبانی می نماید و اگر از IActionResult هم استفاده کنیم ، همین نتیجه را در بر خواهد داشت. یعنی همه انواع خروجیها را می توان در Action Method برگرداند. شایان ذکر است که انعطاف IActionResult در مقایسه با ContentResult در سطح پروژه بیشتر میباشد .
در اینجا به دلیل ساده بودن نوع خروجی از همان ContentResult استفاده نمودیم . نکته اینجاست که اگر نوع خروجی شما واقعن یک Stringساده باشد و قصد انجام Unit Testing داشته باشید ، خواهید دید که این نوع ساده تر از IActionResult در روند انجام UnitTesting بهتر عمل خواهد کرد .
حال سوال اینجاست که چه تفاوتی در نتیجه بوجود آمد ؟. در هر 2 یک متن ساده نمایش داده شد و تغییری هم مشاهده نگردید .
جواب اینجاست که خوب بله در سطح چنین پروژه کوچکی و چنین محتوای ساده ای ، تفاوتی رخ نداد ، ولی تایین دقیق نوع خروجی برای متدها در تایین وضعیت کد ، خوانایی ، درک بهتر خروجی متدها و ساده شدن Test پروزه ها تاثیر دارد .
حالا اجازه بدید یک Model ساده برای پروژه ایجاد کنیم. برای اینکار یک فولدر به پروژه اضافه کنید و نام آنرا Models بگذارید . درون این فولدر با فرض نمایش و کارکرد با محتوای منطقی یک رستوران ، یک کلاس جدید ایجاد میکنیم . خوب حالا باید برای این کلاس چند Property به عنوان فیلدهای جدول تایین کنیم . هر رستوران یک ID و یک نام حد اقل خواهد داشت و در کلاس هم آنرا ایجاد خواهیم کرد .
خوب فعلن همین مدل ساده کافی است و با همین کار را ادامه میدهیم .
حالا به درون Index Action Method بروید و مراحل زیر را برای داشتن یک Instant از Model و ایجاد دیتای فرضی دنبال کنید .
خوب حالا که Model و دیتای فرضی داریم ، باید نوع خروجی متد را عوض کنیم تا بتوان اطلاعات را در خروجی نمایش داد.
یکی از انواع خروجیها میتواند ObjectResult باشد . برای این نوع خروجی ، باید مطابق زیر نوع مقدار Returnدر پروژه ها را مطابق زیر عوض کنیم .
خوب حالا Save و پروزه را اجرا کنید . نتیجه مقادیر رکورد فرضی ایجاد شده خواهد بود .
در سناریوهای جدی تر ، می بایست از محتوای Json یا XML استفاده کرده تا بتوان روالهای ساده تر و Optimize شده تری در اختیار داشت . ما هنوز View به شکل واقعی در اختیار نداریم و در نتیجه خروجیهای انواع دیگر به آن صورت کاربردی ندارد . در بخشهای بعدی به View نیز مسلح خواهیم شد خواهیم توانست به شکل پیشرفته تری روند ایجاد پروژه را دنبال کنیم .
دانلود سورس پروژه
موفق باشید .