آموزش ASP.NET MVC5 – فصل۶

آموزش ASP.NET MVC5 – فصل۶

 آموزش ASP.NET MVC5 – فصل6 

 

سلام دوستـــان ، در جلسه قبل با HtmlHelper های MVC آشنا شدیم و توانستیم خودمان HtmlHelper بنویسیم:

»»» مطالعه مقاله جلسه پنجم سری آموزشی MVC

 

آشنایی با Area در MVC و نحوه استفاده از آن در پروژه

 

لزوم استفاده از Area در پروژه‌های MVC:

در این جلسه میخواهیم با مبحث Area ها آشنا شویم . برای پروژه های نسبتا بزرگ که مثلا شامل 500 تا کنترولر می باشد ، منطقی نیست که همه آنها را داخل یک فولدری بنام Controllers در روت پروژه بریزیم . برای حل این مشکل ، مایکروسافت در MVC4 مفهومی بنام Area را مطرح کرد .

 

نحوه افزودن Area به پروژه ASP.NET-MVC:

هر Area تمام امکانات روت پروژه را دارد مانند Models , Views و … برای افزودن یک Area به پروژه خود ، روی نام پروژه در Solution Explorer راست کلیک کرده و سپس Add—>Area را انتخاب میکنیم . در این مرحله نام area موردنظرمان را تایپ کرده مثلا admin و ok میکنیم . اتوماتیک فولدر Area در روت پروژه ایجاد می شود و در فولدر Area ، فولدر admin ساخته می شود .

 

ActionLink چیست و چه کاربردی دارد؟

برای رفتن از روت پروژه به یک اکشنی در area و یا برعکس ، بهتر است از actionLink استفاده کنیم . اکشن لینک بطور معمول دو پارامتر میگیرد : اولی linkText و دیگری actionName .

تعریف linkText و actionName:

linkText متنی که برای لینک نمایش داده می شود می باشد و actionName نام اکشنی که میخواهیم به آن لینک بدهیم . دقت کنید که در اینصورت ، آن اکشن باید در همین کنترولر باشد . اگر بخواهیم به اکشنی در کنترولر دیگری لینک بدهیم هم controllerName را نیز باید تعریف کنیم :

@Html.ActionLink(linkText: "Help", actionName: "Help") 
@Html.ActionLink(linkText: "Help", actionName: "Help", controllerName: "Home")

نحوه لینک دادن به اکشن در Area دیگر:

اگر بخواهیم به اکشنی لینک بدهیم که در Area دیگری وجود دارد ، باید actionLink را به روش خاصی تعریف کنیم که شاید یه کمی پیچیده باشد .

فرض کنید Area ما admin است ، روش تعریف actionLink بصورت زیر اشتباه می باشد :

@Html.ActionLink(linkText: "Users List", actionName: "List", controllerName: "User", areaName: "admin")

روش صحیح تعریف actionLink در صورت وجود داشتن area بصورت زیر است :

@Html.ActionLink(linkText: "Users List", actionName: "List", controllerName: "User", routeValues: new { Area = "admin" }, htmlAttributes: null)

 

لینک به یک اکشن در روت پروژه:

اگر Area برابر null string باشد منظور کنترولر واقع در روت root پروژه است . کاربرد این روش زمانی است که در یک area هستیم و میخواهیم به اکشنی در روت پروژه لینک بدهیم . بنابراین باید actionLink ما باید بصورت زیر تعریف شود :

@Html.ActionLink(linkText: "Home", actionName: "Index", controllerName: "Home", routeValues: new { Area = "" }, htmlAttributes: null)

در صورت تعریف area به آدرس بار مرورگر ما یک پارامتر اضافه می شود یعنی بصورت زیر می شود :

https://mohtava.info/areaName/controllerName/actionName/parameters(optional)

برای یادگیری بیشتر در مورد Area به وب سایت asp.net مراجعه کنید .

 

یکسان بودن نام کنترولر در Area با کنترولر در Root پروژه:

حال این سوال پیش می آید که اگر نام کنترولری در area با نام کنترولری در روت پروژه یکسان باشد ، چه مشکلی رخ میدهد . مثلا اگر علاوه بر HomeController ای که در روت پروژه داریم ، یک HomeController دیگری در area داشته باشیم ، کامپایلر دچار ابهام می شود که کدام HomeController منظور ما است.

 

لزوم استفاده از Routing در MVC:

برای حل این مشکل می بایست از مبحث routing استفاده کنیم . در روت پروژه فولدری بنام app_start وجود دارد . در این فولدر فایلی بنام RouteConfig وجود دارد که میتوان routing دلخواه را در آن تعریف کرد .

فایل RouteConfig:

تابع RegisterRoutes در فایل RouteConfig بطور پیش فرض بصورت زیر تعریف شده است :

public static void RegisterRoutes (System.Web.Routing.RouteCollection routes) { 
 routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 
 routes.MapRoute( name: "Default", url: "{controller}/{action}/{id}", 
  defaults: new { controller = "Home", action = "Index", id = System.Web.Mvc.UrlParameter.Optional 
  } 
 ); 
}

 

کنترلر و اکشن پیش‌فرض در MVC:

در هنگام اجرای پروژه ، کنترولر پیش فرض Home می باشد و اکشن پیش فرض نیز Index . این اسامی در این تابع تعریف شده اند . در صورتی که اسم کنترولر را ذکر نکنیم Home و اگر اکشن را قید نکنیم Index اجرا میشود . در صورت لزوم می توان آنها را تغییر داد مثلا نام کنترولر پیش فرض را Default قرار بدهیم !

روش حل مشکل تداخل اسامی یکسان کنترلرها:

برای حل مشکل تداخل یا conflict نام های یکسان کنترولر ، باید پارامتری بنام nameSpace را به تابع RegisterRoutes اضافه نمود :

routes.MapRoute( 
 name: "Default", 
 url: "{controller}/{action}/{id}", 
 defaults: new { controller = "Home", 
 action = "Index", 
 id = System.Web.Mvc.UrlParameter.Optional }, 
 namespaces: new[] { "LEARNING_AREA.Controllers" } 
 ); 
}

توضیح : LEARNING_AREA.Controllers اسم namespace کنترولر Home روت پروژه می باشد . در اینصورت با اجرای پروژه ، اگر نام کنترولر را ننویسیم ، کامپایلر با رجوع به این فایل میفهمد که منظور ما کنترولر واقع در روت پروژه می باشد .

فایل routeConfig در Area:

در هر area نیز فایل routeConfig را داریم . پس به این مسیر می رویم :

Root > Areas > admin > adminAreaRegistration.cs

تابع RegisterArea:

در این فایل تابع RegisterArea کار همان تابع RegisterRoutes را انجام می دهد . nameSpace مربوط به کنترولر Home داخل admin area را باید تعریف کنیم :

public override void RegisterArea(System.Web.Mvc.AreaRegistrationContext context) { 
 context.MapRoute( 
  "Administrator_Default", 
  "Administrator/{controller}/{action}/{id}", 
  new { controller = "Home", action = "Index", id = System.Web.Mvc.UrlParameter.Optional }, 
  namespaces: new[] { "LEARNING_AREA.Areas.Administrator.Controllers" } 
 ); 
}

 

نوگت T4MVC چیست و چه کاربردی دارد؟

سناریو : به یاد دارید که در زمان RedirectToAction باید نام اکشن را بصورت دستی می نوشتیم و نیز در ActionLink ها ، نام کنترولر و نام اکشن و سایر پارامترها را بطور دستی تایپ میکردیم . اینکار مشکلاتی بهمراه دارد . یکی اینکه امکان غلط دیکته ای در تایپ وجود دارد . دیگری اینکه باید اول ببینیم در فلان کنترولر چه اکشنی وجود دارد تا از آن استفاده کنیم . برای رفع این مشکل با نوگت (nuget) دیگری آشنا می شویم بنام T4MVC .

 

نحوه نصب T4MVC در پروژه ASP.NET MVC:

دوستان عزیز ، در مقاله آشنایی با فریم ورک بوت استرپ نحوه استفاده از نوگت را فرا گرفتید . بنابراین به مسیر زیر می رویم :

Tools > NuGet Package Manager > Package Manager Console

مطابق شکل زیر ، دستور نصب T4MVC را تایپ میکنیم :

نصب T4MVC

 

اجرای دستور install-package T4MVC:

با اجرای این فرمان ، سه فایل و فولدر به پروژه اضافه می شود و تمام area و action و controller ها را stronglyType میکند . هر زمانی که بعنوان مثال کنترولری میسازیم یا آنرا rename میکنیم یا پاک میکنیم ، area میسازیم rename یا پاک میکنیم ، اکشنی add , rename , delete میکنیم و یا signature آنرا تغییر میدهیم ، روی فایل t4mvc.tt دابل کلیک کرده و آنرا باز میکنیم و سپس روی همان فایل راست کلیک کرده (مطابق شکل زیر) و گزینه Run Custom Tool را میزنیم :

اجرای T4MVC

استفاده از T4MVC در RedirectToAction :

دیگر از این پس لازم نیست نام اکشن ها و کنترولرهای خود را حفظ کنید و آنها را دستی تایپ کنید ، چرا که توسط T4MVC شما میتوانید با نوشتن کلمه MVC (با حروف بزرگ) و سپس زدن نقطه ، تمام کنترولرهای موجود را ببینید (مانند شکل زیر) :

استفاده از T4MVC

استفاده از T4MVC در ActionLink :

فرض کنید میخواهیم لینکی در view قرار دهیم که به area Administrator و کنترولر User و اکشن List هدایت شود . سه روش برای اینکار وجود دارد . اول اینکه لینک را بصورت کلاسیک بنویسیم :

<a href="~/Administrator/User/List">Users List</a>

روش دوم اینست که با actionLink و بدون استفاده از T4MVC آنرا بنویسیم :

@Html.ActionLink(
 "Users List", 
 actionName: "List", 
 controllerName: "User", 
 routeValues: new { Area = "Administrator" }, 
 htmlAttributes: null)

روش سوم و بهترین روش اینست که actionLink را توسط T4MVC بنویسیم :

@Html.ActionLink("Users List", MVC.Administrator.User.List())

 

همانطور که میبینیم در روش سوم توانستیم با سه کلمه به لینک مورد نظر خود برسیم ولی در روش دوم با دوخط !

امیدوارم جلسه ششم از سری آموزشی ASP.NET-MVC5 مفید بوده باشد . برای تکمیل آموخته های خود درباره نوگت مهم T4MVC ، به وب سایت مرجع T4MVC مراجعه کنید .

در جلسه بعد (جلسه هفتم) با Action Filter Attribute آشنا می شویم . همراه ما باشید …

0/5 ( 0 نظر )

مشخصات مقاله

آموزش ASP.NET MVC5 – فصل۶

فرم ارسال دیدگاه درباره

آموزش ASP.NET MVC5 – فصل۶

دیدگاه کاربران درباره

آموزش ASP.NET MVC5 – فصل۶

دیدگاهی وجود ندارد