• ASP.NET Core 1 – قسمت هفدهم
ASP.NET Core 1 – قسمت هفدهم
1395/02/02 - 18:50:30 // MVC 5 & 6 // 0 نظر // 482 بازدید

در این بخش به بررسی چگونگی کارکرد دیتا و عملن کار با Sql Server خواهیم پرداخت ، ولی برای رسیدن به این نقطه باید ابتدا یکسری مفاهیم پایه را بررسی کنیم .

بسمه تعالی

ASP.NET Core 1 قسمت هفدهم

در این بخش به بررسی چگونگی کارکرد دیتا و عملن کار با Sql Server خواهیم پرداخت ، ولی برای رسیدن به این نقطه باید ابتدا یکسری مفاهیم پایه را بررسی کنیم . در این سری مباحث از Entity Frame Work استفاده خواهد شد که تکنولوژی روز تحرکات دیتابیس می باشد ، هر چند برای پروژه های بزرگ اینجانب شخصا آنرا پیشنهاد نکرده و به دلیل برخورد با لیستی از مشکلات در طول یک پروژه بزرگ آنرا را به شما هم پیشنهاد نمی کنم. شایان ذکر است که این فقط نظر شخصی من است شما باید راه خود را خودتان در این روالها پیدا کنید .

در روال طراحی یک پروژه MVC مخصوصا در بستر ASP.NET دو مفهوم بسیار شایان توجه میباشد .

1- Model

2- View Model

در اکثر پروزه ها ما با یک دیتابیس (مثلن دیتابیس رستوران با فیلدها و مشخصات خودش روبرو هستیم ). خوب حالا شاید به فرمی برای ذخیره سازی داده های رستوران نیاز پیدا کنیم که خوب از طریق یک View این موجودیت ایجاد میگردد. اگر فیلدهای جدول رستوران شامل Name و Address و Type باشد ، یک فرم Edit مثلن فیلدهای زیادتری لازم دارد . مثلن برای Type یک لیست نیاز داریم تا کاربر بتواند از ان انتخاب کند ولی در هنگام نمایش اطلاعات آن رکورد دیگر به آن لیست Type ها نیاز نداریم و فقط آیتم انتخاب شده باید نمایش داده شود . در چنین شرایطی ما به دو Object در Model نیاز داریم که به آنها Model Object هم گفته میشود . اولی به عنوان Entity Model که مستقیم با دیتابیس در رابطه بوده و به آن متصل است . اصولن Entity Model دقیقا شبیه DataBase Schema میباشد و مطابق آن ولی توسط کدهای مثلن C# ایجاد خواهد شد . اگر در دیتابیس در جدول رستوران فقط Name و Address و Type داشته باشیم ، Entity Model ما هم دقیقن به همان شکل باید ساخته شده باشد .

آیتم بعدی که عنوان Model Object در سناریوی بالا نقش دارد ، View Model میباشد . نقش View Model بردن و آوردن دیتا بین View و Controller میباشد . این موجودیت حاوی هر چیزی است که View برای نمایش به شکل HTML نیاز دارد. مثلن در سناریوی Edit View متعلق به رستوران ، من به یک View Model حاوی اطلاعات Cuisine Type ها هم نیاز دارم . در مواردی View Model را DTO هم می نامند . DOT در عمل یعنی Data Transfer Object چرا که نقش View Model فقط داشتن یک کپی از داده ها به همراه اطلاعات کمتر با بیشتر برای تحرک بین Controller وView میباشد . شکل زیر هم همین مطالب ذکر شده را نمایش میدهد .

 
 
 
 
خوب حال بهتر است به جای توضیحات اضافی ببینیم در عمل چگونه میتوان این مطلب را بازتر نمود .

تا اینجا Home Page ما لیست رستورانها را نمایش میدهد . حالا اگر این Home Page قرار بود اطلاعات بیشتری نمایش دهد ، چه باید بکنیم ؟. فرض کنید علاوه بر این لیست به پیام روز که از Configuration File می آید هم نیاز داریم . اینجا اصلن مهم نیست در وضعیت یک Relational DataBase قرار داریم یا یک Doc File یا هر چیز دیگری . اینجا ما فقط نیاز داریم این لیست را همراه با یک پیام نمایش دهیم . ما در این اینجا یک Model نیاز داریم که هر دو مقدار را با هم به View پاس داده و آنرا نمایش دهد . خوب من در اینجا Restaurant.cs را میخواهم به عنوان Entity تصور کنم و بعدا با دیتابیس هم از طریق همین کلاس رابطه بر قرار کنم. قاعدتا در Viewهم آن لیست ساده از داده ها که توسط @model تعریف شده دیگر جوابگو نخواهد بود .

برای شروع فولدر Models را باید Rename کنم و نام آنرا Entities بگذارم . دقت کنید بعد از این کار اگر فایل در VS باز است یکبار آنرا بسته و دوباره باز کنید ، چرا که گاهی VS.NET بازی در می آورد و NameSpace ها را تصحیح نمیکند . اگر باز هم NameSpace ها مشکل داشت ، دستی آنرا تصحیح کنید .

برای ادامه یک فولدر جدید به نام ViewModels هم ایجاد کنید . دقت کنید که پروژه هایی هست که میتواند ViewModel نداشته باشد و همان Entity نقش ViewModel را بازی کند ، ولی در سناریوهای بزرگ اصولن باید از این قابلیت استفاده کرد .

در این پروژه ، در همان HomePage نیاز به داشتن یک ViewModel داریم و در نتیجه نام آنرا HomePageViewModel میگذاریم . درون آن هم Property های لازم را مطابق زیر ایجاد میکنیم .

 
 
 
خوب حالا برویم درون Controller و تغییرات لازمه را ایجاد کنیم .اول از همه باید هر جا در NameSpace ها Models وجود دارد به ViewModels تغییر کند .پس از اصلاح نام NameSpace باید به سراغ متد Index رفته و شرایطی ایجاد کنیم که لیست رستورانها و آن پیام Greeting کنار هم نمایش داده شود .

به جای متد GetAll باید وضعیت را به شکل زیر تغییر داد .

 
 
 
دقت کنید . با داشتن یک ViewModel من توانستم یک جعبه جدید ایجاد کنم که هم حاوی دیتای موجود در لیست رستورانهاست و هم پیامی که تویط Greeting Service نمایش داده میشد . حالا برای این پیام هم به درستی به ViewModel ارسال شود یکسری تغییرات نیاز داریم و قبل از ان باید چند قسمت دیگر را هم اصلاح کنیم .

اولن در RestaurantData.CS نام NameSpace را در قسمت Using ها از Models به Entities تغییر دهید . حالا هنوز مانده که پیام Greeting را به Model که فعلن "" قرار داده این ارسال کنیم.برای اینکار میتوان پارامتر ورودی دیگری به متد سازنده HomeController اضافه نمود و مقدار آنرا در یک Private Filed دیگر ذخیره نمود . حالا در Index می توان از متد GetGreeter این Property مطابق شکل زیر استفاده نمود .

 
 
 
حالا Controller مقادیر را مطابق میل ما ارسال میکند و فقط اصلاحView باقی مانده است . برای اینکار اول باید model صفحه را عوض کرد چرا که موجودیت قبلی مقدار Greeting ندارد و قابل استفاده نیست . وضعیت را مشابه تصویر زیر تغییر دهید .

 
 
 
 
همانطور که میبینید مقدار CurrentGreeting هم در لیست مقادیر درون Model قابل دسترسی است و درون یک h3 در حال نمایش است . مقدار Model هم در Loop باید به Model.Restaurants تغییر کند چرا که الان دیگر Model حاوی یک لیست تنها نیست و 2 بسته حاوی دیتا درون خود دارد و باید مشخص شود کدام یک در را نیاز داریم . Model صفحه هم که به ViewModel ما تبدیل شده و در تصویر مشهود است و این هم نتیجه اجرا :

 
 
 
 
 
پس همانطور که مشاهده کردید ، از طریق ViewModel می توانید 2 یا چند بسته دیتا را که شاید حتی بعضی از آنها از دیتابیس هم نمی آیند را در همدیگر تلفیق و در View ها از آنها استفاده کنید و این بود مفهوم و بررسی ViewModel در MVC که باید در پروژه ها به فراخور حال استفاده گردد.

بخش بعدی یک صفحه Details مبتنی بر کلیک کاربر هم ایجاد میکنیم و خواهید دید چقدر ساده میتوان در صفحات دیگر هم Navigate نمود .

دانلود سورس پروژه

علی کلاهدوزان

موفق باشید .

علی کلاهدوزان
معرفی نویسنده : علی کلاهدوزان

سلام بر دوستان ،
شاید رایج است به عنوان پروفایل کاربر ، چند خطی راجع به خودم بنویسم ، ولی وضعیت کاری و سوابق من با یک جستجوی ساده در گوگل مشخص خواهد شد ، لذا سرتان را با مطالب بی مورد به درد نیاورم بهتر است . اگر نکته خاصی لازم بود بدانید در قسمت "ایلیا سافت در یک نگاه" به احتمال زیاد یافت خواهد شد . جزئیات بیشتر را سوال کنید ، آدرس ایمیل Ali@Kolahdoozan.com همیشه جوابگوی شماست .امیدوارم از مطالب سایت استفاده کرده باشید . شاد و پیروز باشید .

امتیاز به مطلب
           
نظرات کاربران
ارسال نظر