تشخیص درخواست های Ajax در Asp.net MVC
دوشنبه 16 آذر 1394برای اینکه در سمت سرور تنها درخواست هایی که از نوع Ajax هستند را پردازش کنیم باید یک صفت بنویسیم که در آن تعیین کنیم قبل از پردازش action مورد نظر Ajax بودن آن بررسی شود و اگر از نوع ajax نبود از پردازش آن جلوگیری شود.
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 }
- ASP.net MVC
- 2k بازدید
- 2 تشکر