TipTip - پذیرش درخواست های Ajax یی و رد سایر درخواست ها در ASP.NET MVC

سلام .به عنوان اولین مقاله قصد دارم که یک سری مقاله رو آغاز کنم با عنوان TipTip که در هر سری ، یک یا چند نکته در زمینه ی وب رو بررسی میکنم.در ASP.NET MVC ، مفهومی با عنوان Action Filters وجود داره که این امکان رو به ما میده تا بتونیم عملیات فراخوانی Action ها رو کنترل کنیم .Attribute یی با نام ActionFilterAttribute وجود داره که دارای چهارتابع به شکل زیر هست:

public virtual void OnActionExecuting(ActionExecutingContext filterContext)
{
}

public virtual void OnActionExecuted(ActionExecutedContext filterContext)
{
}

public virtual void OnResultExecuting(ResultExecutingContext filterContext)
{
}

public virtual void OnResultExecuted(ResultExecutedContext filterContext)
{
}


OnActionExecuting ، قبل از اجرای Action فراخوانی می شه و OnActionExecuted بعد از فراخوانی اون .همینطور تابع OnResultExecuting ، قبل از اجرای تابع Execute مربوط به Result فراخوانی میشه ، و OnResultExecuted بعد از اجرای آن.فرض کنید که ما کنترلری با نام Home داریم که داخل اون یک Action به نام Test تعریف شده:
public class HomeController : Controller
{
        public ActionResult Test()
        {
            return View();
        }
}

یعنی ما می تونیم اکشن Test رو از طریق مرورگر به شکل زیر فراخونی کنیم:
http://domain.com/Home/Test

وقتی این درخواست به وب سرور می رسه ، بعد از اینکه عملیات روتینگ انجام شد ، اکشن Test فراخونی میشه ، عملیات داخلیش انجام شده و بعد یک خروجی از نوع ActionResult رو برمیگردونه .کاری که ما قصد داریم انجام بدیم این هست که تنها درخواستهایی رو بپذیریم که بصورت Ajaxیی ارسال شده باشن. یعنی در Header ارسالی کلید X-Requested-With با مقدار XMLHttpRequest وجود داشته باشه .برای اینکار یک کلاس جدید با نام AjaxRequest ایجاد میکنیم که از ActionFilterAttribute ارث بری کنه :
public class AjaxRequest : ActionFilterAttribute
{
    
}


چون ما میخوایم قبل از اجرای Action بررسیمون رو انجام بدیم ، پس تابع OnActionExecuting رو Override میکنیم و کد زیر رو داخلش قرار میدیم:
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
    if (filterContext.HttpContext.Request.IsAjaxRequest()) return;

    filterContext.Result = new ContentResult();
}

کاری که کد بالا انجام میده ، قبل از فراخوانیه اکشن ، بررسی میکنه که آیا این درخواست یک درخواست Ajax یی هست یا نه .در صورتی که باشه ، کارش رو ادامه میده ، در غیر این صورت پراپرتی Result مربوط به filterContext رو برابر با ContentResult میکنه .این کار باعث میشه ، تا فراخوانی اکشن Test متوقف بشه . چون بعد از پایان تابع OnActionExecuting بررسی میشه که آیا Result مقداری گرفته یا نه. در صورتی که مقداری گرفته باشه ، صرفا همون Result رو اجرا میکنه و دیگه اکشن فراخوانی نمیشه .در اینجا من یک ContentResult رو ست کردم ، بدین معنی که یک صفحه ی خالی براش ارسال میشه ، شما ممکنه بخواید Exception یی رو throw کنید . روش ها متفاوت است .کد نهایی ما به شکل زیر در میاد:
public class AjaxRequest : ActionFilterAttribute
{
    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        if (filterContext.HttpContext.Request.IsAjaxRequest()) return;

        filterContext.Result = new ContentResult();
    }
}

حال ما میتونیم این Filter رو بروی اکشنمون قرار بدیم. به شکل زیر:
public class HomeController : Controller
{
    [AjaxRequest]
    public ActionResult Test()
    {
           return Content("Hello World");
    }
}

حالا ، اگه درخواستی بصورت مستقیم از طریق مرورگر برای Test ارسال بشه ، صرفا صفحه ای خالی دیده میشه . ولی اگه درخواست بصورت Ajaxیی صورت بگیره متن Hello World برای کلاینت ارسال میشه .

با آرزوی موفقیت...
#درخواست_ajax_در_asp.net_mvc #ajax_در_asp.net_mvc #مدیریت_درخواست_های_ajax
2 نظر
mr_rostami
استاد بسیاااار بسیااااااار عالی بود.. منتظر مقالات بعدی شما هستیم ;)
علی شکرالهی
:)) قربونت عزیز دل ... ما منتظر مقالات شما هستیم ;)
نظر شما
برای ارسال نظر باید وارد شوید.
تنظیمات حریم خصوصی
تائید صرفنظر
×

تو می تونی بهترین نتیجه رو تضمینی با بهترین های ایران بدست بیاری ، پس مقایسه کن و بعد خرید کن : فقط توی جشنواره بهاره می تونی امروز ارزونتر از فردا خرید کنی ....