تشخیص درخواست های Ajax در Asp.net MVC

دوشنبه 16 آذر 1394

برای اینکه در سمت سرور تنها درخواست هایی که از نوع Ajax هستند را پردازش کنیم باید یک صفت بنویسیم که در آن تعیین کنیم قبل از پردازش action مورد نظر Ajax بودن آن بررسی شود و اگر از نوع ajax نبود از پردازش آن جلوگیری شود.

تشخیص درخواست های Ajax در Asp.net MVC

Ajax چیست؟ یک تکنولوژی برای پیاده سازی برنامه های تحت وب است که در آن با کمک اسکریپت هایی که در سمت کلاینت نوشته می شوند برای برقراری ارتباط با سمت سرور استفاده می شود.با این کار بدون نیاز به refresh کامل صفحه می توان قسمت هایی را که مایلیم به روز رسانی کرد.این کار باعث ارتباط بی وقفه و سریع کاربران با سرور می شود.

در ورژن های قبلی mvc برای چک کردن اینکه درخواستی که به سمت سرور آمده است از نوع Ajax هست یا نه از دستور زیر استفاده می کردیم:

IsAjaxRequest() = false;

نحوه استفاده از این دستور را در یک Action به صورت زیر میتوان دید

public ActionResult YourActionName()  
{
     // Check if the request is an AJAX call
     var isAjax = Request.IsAjaxRequest();

     // Do something about it.
}

اما در ورژن های جدیدتر mvc نیاز به این دستور نیست بلکه میتوان از Attribute  به شکل زیر استفاده کرد

[AjaxOnly]
public ActionResult YourActionName()  
{
     // Omitted for brevity
}

برای اینکه تغییراتی که خودتان مایل هستید در این صفت بدهید از کلاس زیر استفاده کنید

public class AjaxOnlyAttribute : ActionFilterAttribute  
{
    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        if (!filterContext.HttpContext.Request.IsAjaxRequest())
        {
            filterContext.Result = new HttpNotFoundResult();
        }
    }
}


صفت [AjaxOnly] در MVC6
تابع IsAjaxRequest هدر صفحه ارسالی از سمت کاربر را چک می کند و می تواند تشخیص دهد که آیا این یک صفحه معمولی است یا یک صفحه که با ajax کار می کند

public static bool IsAjaxRequest(this HttpRequestBase request)  
{
  if (request == null)
    throw new ArgumentNullException("request");
  if (request["X-Requested-With"] == "XMLHttpRequest")
    return true;
  if (request.Headers != null)
    return request.Headers["X-Requested-With"] == "XMLHttpRequest";
  return false;
}


صفت [AjaxOnly] در mvc6 به صورت زیر پیاده سازی شده است

public class AjaxOnlyAttribute : ActionMethodSelectorAttribute  
{
       public override bool IsValidForRequest(RouteContext routeContext, ActionDescriptor action)
        {
            return routeContext.HttpContext.Request?.Headers["X-Requested-With"] == "XMLHttpRequest";
        }
}

اگر آدرسی را در صفحه مرورگر خود وارد کنید درخواستی به سمت سرور ارسال می شود که در جواب آن سرور یک کاری انجام میدهد و خروجی را به صورت html برمی گرداند.اگر قصد داشته باشیم درخواست هایی از نوع ajax را بپذیریم (یعنی در هدر صفحه ارسالی به سمت سرور کلید X-Requested-With با مقدار XMLHttpRequest مقداردهی شده باشد)برای این کار یک کلاسی باید ایجاد کنیم که از ActionFilterAttribute ارث بری کرده باشد.

public class AjaxRequest : ActionFilterAttribute
{
    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        if (filterContext.HttpContext.Request.IsAjaxRequest()) return;
 
        filterContext.Result = new ContentResult();
    }
}


چون قصد داریم قبل از اجرای action مربوطه بررسی کنیم که آیا یک درخواست ajax هست یا نه باید متد OnActionExecuting که در داخل هر صفتی وجود دارد را بازنویسی (Override) کنیم .کد مربوط به این تابع به صورت زیر است :

public override void OnActionExecuting(ActionExecutingContext filterContext)
{
    if (filterContext.HttpContext.Request.IsAjaxRequest()) return;
 
    filterContext.Result = new ContentResult();
}


اگر درخواست از نوع ajax نباشد اجرای action متوقف خواهد شد.حال می توانیم این صفت را برای action های خود اضافه کنیم

[AjaxOnly]
public ActionResult YourActionName()  
{
     // Omitted for brevity
}

برنامه نویسان

نویسنده 3355 مقاله در برنامه نویسان

کاربرانی که از نویسنده این مقاله تشکر کرده اند

در صورتی که در رابطه با این مقاله سوالی دارید، در تاپیک های انجمن مطرح کنید