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

آموزش ASP.NET MVC5 - فصل7

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

 

سلام دوستان ، در جلسه ششم با مفهوم Area آشنا شدیم و لزوم استفاده از آنها را بیان کردیم:

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

در این جلسه وارد دنیای Action Filter Attribute می شویمsurprise 

 

اکشن فیلتر در MVC چیست و چه کاربردی دارد؟

ما یک سری فولدر در یک پروژه MVC داریم که نام آنها رزرو شده است و نمی توان نام آنها را عوض کرد که عبارتند از : App_Data , Controllers , Views , Shared و یک سری فولدر داریم که نام آنها عرفی هستند یعنی توصیه شده و بهتر است که نامشان همین باشد مانند : Models , ViewModels  Infrastructure .

ما در این آموزشها ، کلاسهایی را که پر کاربرد هستند و ممکن است در پروژه های دیگر نیز بدرد ما بخورند را در فولدر Infrastructure تعریف میکنیم .

نکته : Attribute ها کلاسهایی هستند که معمولا در بالای اکشن ها نوشته می شوند مانند دستورات زیر :

 [System.Web.Mvc.HttpGet] ,  [System.Web.Mvc.HttpGet] , [System.Web.Mvc.ActionName(“Learn_Mohtava”)]

 

ایجاد اتریبیوت سفارشی (Custom Attribute):

در این سری آموزشی ما میخواهیم خودمان یک Attribute بنویسیم . روی فولدر Infrastructure راست کلیک میکنیم و add->class را میزنیم . نام کلاس باید به کلمه Attribute ختم شود مثلا LogAttribute.cs . در بالای این کلاس فقط باید نام namespace یعنی Infrastructure نوشته شده باشد :

namespace Infrastructure

ارث بری از ActionFilterAttribute:

وقتی میخواهیم کلاس ما از کلاس دیگری ارث ببرد ، باید بدین صورت نوشته شود :

public class LogAttribute : System.Web.Mvc.ActionFilterAttribute

با ارث بری از ActionFilterAttribute میتوان ۴ متد را override کرد :

OnActionExecuting و OnActionExecuted و OnResultExecuting و OnResultExecuted

سورس کد کلاس LogAttribute:

بنابراین کل کلاس LogAttribute ما بصورت زیر می شود :

 
namespace Infrastructure
{
    public class LogAttribute : System.Web.Mvc.ActionFilterAttribute
    {
        public LogAttribute()
        {
        }
        public override void OnActionExecuting
            (System.Web.Mvc.ActionExecutingContext filterContext)
        {
            base.OnActionExecuting(filterContext);
        }
        public override void OnActionExecuted
            (System.Web.Mvc.ActionExecutedContext filterContext)
        {
            base.OnActionExecuted(filterContext);
        }
        public override void OnResultExecuting
            (System.Web.Mvc.ResultExecutingContext filterContext)
        {
            base.OnResultExecuting(filterContext);
        }
        public override void OnResultExecuted
            (System.Web.Mvc.ResultExecutedContext filterContext)
        {
            base.OnResultExecuted(filterContext);
        }
    }
}
                                 

 

استفاده از Attribute سفارشی در پروژه MVC:

برای استفاده از Attribute ای که خودمان نوشتیم در بالای نام اکشن به چند روش میتوان عمل کرد :

[Infrastructure.Log]
[Infrastructure.Log()]

اگر میخواهیم پارامتر یا پارامترهایی را به Attribute خود ارسال کنیم باید از روش دوم استفاده کنیم و در داخل پرانتز پارامترها را بیان کنیم ولی اگر مانند این مثال ، پارامتری نمیگیرد بهتر است به روش اول آنرا فراخوانی کنیم (در صورت استفاده از روش دوم ، پیغام خطا نمیدهد) .

 

ترتیب اجرای پروسه های اکشن فیلتر :

پس از ایجاد Attribute و استفاده از آن ، ترتیب اجرای پروسه ها تا نمایش آن به کاربر بصورت زیر می شود :

  1. ابتدا وارد Default Constructor کنترولر اکشن می شود .

  2. سپس وارد Default Constructor کلاس Attribute می شود .

  3. وارد متد OnActionExecuting می شود .

  4. وارد اکشنی می شود که Attribute برایش تعریف شده است .

  5. وارد متد OnActionExecuted می شود .

  6. وارد متد OnResultExecuting می شود .

  7. وارد view مربوط به اکشن می شود و آنرا render میکند .

  8. وارد متد OnResultExecuted می شود .

  9. در نهایت وارد متد OnResultExecuted می شود و نتیجه بصورت HTML به کلاینت نمایش داده می شود .

 

اهمیت ایجاد اتریبیوت سفارشی و دانستن ترتیب اجرای پروسه ها:

از کاربردهای بهره بردن از Custom Attribute و دانستن توالی اجرای پروسه ها اینست که میتوان مفاهیمی نظیر Log , Performance , Security , Statistic را در متد OnActionExecuting و سایر متدها بررسی کرد .

بعنوان مثال میتوان در متد فوق  :

  • بررسی کنیم که آیا کاربری که وارد این مرحله شده است به سایر مراحل میتواند دسترسی داشته باشد و یا لاگین کرده است یا خیر .
  • میتوان IP کاربران حاضر در سایت را در دیتابیس ذخیره کنیم .
  • میتوان آمار سایت را بدین وسیله بدست بیاوریم .
  • میتوان با محاسبه اختلاف زمان متد OnActionExecuting و متد OnActionExecuted  متوجه شویم کدام یک از اکشن های ما زمان بیشتری برای اجرا نیاز دارند و یا سنگین تر هستند .

 

تعریف اتریبیوت لاگ (Log Attribute):

فرض کنید attribute فوق را بالای اکشن Index (بصورت زیر) تعریف کرده ایم :

 
[Infrastructure.Log]
public System.Web.Mvc.ViewResult Index()
{
    return (View());
}
                                 

پس با اجرای اکشن Index وارد LogAttribute و متدهای مربوط به آن می شویم . پس اگر اتریبیوت را در بالای هر اکشن بنویسیم فقط روی آن اکشن اعمال می شود . حال اگر بخواهیم اتریبیوت خاصی برای تمام اکشن های یک کنترولر فراخوانی شود ، باید آنرا در بالای نام کلاس Controller نوشت :

 
[Infrastructure.Log]
public class HomeController : System.Web.Mvc.Controller
{
}
                                 

 

اجرای اتریبیوت سفارشی برای کل پروژه:

برای اینکه Attribute ای که نوشتیم برای کل پروژه اجرا شود ، باید آنرا در فایل FilterConfig.cs واقع در فولدر App_Start رجیستر کنیم :

 
 filters.Add(new Infrastructure.LogAttribute());
                                 

بنابراین دستورات تابع RegisterGlobalFilters واقع در فایل FilterConfig بصورت زیر است :

 
public static void RegisterGlobalFilters
    (System.Web.Mvc.GlobalFilterCollection filters)
{
    filters.Add(new Infrastructure.LogAttribute());
    filters.Add(new System.Web.Mvc.HandleErrorAttribute());
}
                                 

با اینکار ، LogAttribute برای تمام area ها ، کنترولرها و اکشن های پروژه اجرا می شود .

تعریف دو اتریبیوت سفارشی در بالای اکشن در MVC:

سناریو : اگر فرض کنیم دو attribute تعریف کرده ایم و میخواهیم هر دو را برای کل پروژه اعمال کنیم ، (اولی LogAttribute و دومی AnotherAttribute)

باید با دستورات زیر آنها را در filterConfig تعریف کنیم :

 
filters.Add(new Infrastructure.LogAttribute());
filters.Add(new Infrastructure.AnotherAttribute());
                                 

ترتیب اجرای پروسه‌های دو اتریبیوت سفارشی:

ترتیب اجرای پروسه های آن دو بدین صورت می شود :

  1. ابتدا Default Constructor اولین اتریبیوت یعنی Log اجرا می شود .
  2. سپس Default Constructor دومین اتریبیوت یعنی Another اجرا می شود .
  3. در مرحله سوم Default Constructor کنترولر اجرا می شود .
  4. متد OnActionExecuting اتریبیوت Log
  5. متد OnActionExecuting اتریبیوت Another
  6. اکشن اجرا می شود .
  7. متد OnActionExecuted اتریبیوت دوم یعنی Another 
  8. متد OnActionExecuted اتریبیوت اول یعنی Log
  9. متد OnResultExecuting اتریبیوت اول یعنی Log
  10. متد OnResultExecuting اتریبیوت دوم یعنی Another 
  11. به view می رود و render می شود .
  12. متد OnResultExecuted اتریبیوت دوم یعنی Another 
  13. متد OnResultExecuted اتریبیوت اول یعنی Log
  14. در نهایت داده بصورت HTML به کلاینت ارسال می شود laugh

 

اجرای Attribute برای برخی از اکشن‌ها:

در این بخش میخواهیم attribute خاصی را برای کل پروژه به استثنای یک یا چند اکشن اعمال کنیم . باید attribute ای بنویسیم که Ignorable باشد یعنی توسط پارامتر ignore به آن اتریبیوت بگوییم که از فلان اکشن صرف نظر کن . برای اینکار باید ignore را true قرار دهیم . روش انجام اینکار بدین صورت است :

تعریف یک property بنام ignore:

در کلاس attribute مثلا LogAttribute.cs یک property بنام ignore تعریف میکنیم :

public bool Ignore { get; set; }

مقداردهی false در سازنده کلاس:

در سازنده کلاس ، مقدارش را false قرار میدهیم (زیرا بطور پیش فرض نباید صرف نظر کند) :

 
public LogAttribute()
{
    Ignore = false;
}
                                 

تعریف سازنده دیگر با پارامتر ورودی ignore:

یک سازنده دیگر میسازیم که ignore را بعنوان پارامتر میگیرد :

 
public LogAttribute(bool ignore)
{
    Ignore = ignore;
}
                                 

ویرایش متد OnActionExecuting:

بعد در متد OnActionExecuting میگوییم اگر ignore برابر false بود عملیات Log را انجام دهد :

 
public override void OnActionExecuting
(System.Web.Mvc.ActionExecutingContext filterContext)
{
    base.OnActionExecuting(filterContext);
    if (Ignore == false)
    {
        object objAction =
            filterContext.RouteData.Values[“action”];
        object objController =
            filterContext.RouteData.Values[“controller”];
    }
}
                                 

اجرا نشدن اتریبیوت برای اکشن‌های دلخواه:

برای هر اکشنی که میخواهیم این Attribute اجرا نشود ، بصورت زیر ، پارامتر ignore را برابر true قرار میدهیم :

 
[Infrastructure.Log(ignore: true)]
public System.Web.Mvc.ActionResult SomeAction()
{
    return (View());
}
                                 

تعریف اتریبیوت Authorize برای تعیین هویت کاربران:

فرض کنید بخواهیم اکشن امن تعریف کنیم یعنی مثلا کاربر باید لاگین کرده باشد تا بتواند وارد این اکشن یا کنترولر بشود . اتریبیوتی بنام Authorize تعریف میکنیم . فرض کنید اکشن SecuredAction را میخواهیم امن کنیم . در متد OnActionExecuting بصورت زیر نام کنترولر و اکشن را پیدا کرده و در شرط if بررسی میکنیم که اگر اکشن SecuredAction فراخوانی شده بود به اکشن AccessDenied هدایت شود :

 
public override void OnActionExecuting
    (System.Web.Mvc.ActionExecutingContext filterContext)
{
    base.OnActionExecuting(filterContext);
    string strAction =
        filterContext.RouteData.Values[“action”].ToString();
    string strController =
        filterContext.RouteData.Values[“controller”].ToString();
    if ((string.Compare(strController, "Home", ignoreCase: true) == 0) &&
        (string.Compare(strAction, "SecuredAction", ignoreCase: true) == 0))
    {
        filterContext.Result =
            new System.Web.Mvc.RedirectToRouteResult(
            new System.Web.Routing.RouteValueDictionary
            {
                { "area", string.Empty },
                { "controller", "Home" },
                { "action", "AccessDenied" }
            });
    }
}
                                 

از این طریق میتوان ورود کاربران عادی را به بخش مدیریت سایت کنترل نمود cool برای تمرین بیشتر و تکمیل اطلاعات خود به وب سایت asp.net مراجعه کنید. جلسه هفتم از مجموعه آموزشی MVC به پایان رسید .

در جلسه بعد ، آموزش Linq to EF – Code First را خواهیم داشت . همراه ما باشید …laugh

 

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

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

دیدگاهتان را بنویسید

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

دوازده − یازده =

مقالات اخیر

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

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

دانلود کتاب " سرویس سرچ کنسول گوگل - گوگل وبمستر تولز سابق (نسخه جدید) "

راهنمای کامل سرچ کنسول جدید گوگل

عضویت در کانال تلگرام «مجـلـه آمـوزشـی محـتـوا» !

کتاب گوگل ادز

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

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

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

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

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

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