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

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

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

 

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

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

 

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

 

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

در این جلسه میخواهیم با مبحث Area ها آشنا شویم . برای پروژه های نسبتا بزرگ که مثلا شامل ۵۰۰ تا کنترولر می باشد ، منطقی نیست که همه آنها را داخل یک فولدری بنام 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 نظر )
.ez-toc-title-container { text-align: right; display: inline; color: green; font-weight: bolder; direction: ltr; }

این مقاله را در شبکه‌های اجتماعی به اشتراک بگذارید!

Share on facebook
Share on google
Share on linkedin
Share on telegram
Share on email

پاسخی بگذارید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

کتابخانه آنلاین

فروشگاه آنلاین مجله آموزشی محتوا

مقالات اخیر

مقالات تصادفی

فهرست کلی مقالات

کتاب آموزش گوگل آنالیتیکس

دانلود رایگان کتاب الکترونیکی

آموزش تصویری گوگل آنالیتیکس

آموزش کامل فعال‌سازی HTTPS در وردپرس

دانلود کتاب "فعال‌سازی HTTPS در وردپرس"

دانلود رایگان کتاب الکترونیکی

معرفی بهترین ابزارهای بازاریابی محتوا در سال 2019

دانلود رایگان کتاب الکترونیکی "معرفی بهترین ابزارهای بازاریابی محتوا در سال 2019"