درخواست های ارتباط
جستجو
لیست دوستان من
صندوق پیام
همه را دیدم
  • در حال دریافت لیست پیام ها
صندوق پیام
رویدادها
همه را دیدم
  • در حال دریافت لیست رویدادها
همه رویدادهای من
دوره های مرتبط
دوره آموزشی ساخت ربات تلگرام
مدرس: taghandiki
این دوره را در 8 قسط خریداری کنید
ساخت و مدیریت ربات تلگرام از صفر با زبان سی شارپ
مدرس: مهدی عادلی
این دوره را در 2 قسط خریداری کنید
دوره آموزشی مقدماتی برنامه نویسی به زبان سی شارپ
مدرس: حسین احمدی
این دوره را در 17 قسط خریداری کنید
دوره آموزشی پردازش متن با زبان برنامه نویسی پایتون
مدرس: taghandiki
این دوره را در 20 قسط خریداری کنید
دوره آموزشی برنامه نویسی حرفه ای پایتون به زبان ساده
مدرس: حسین احمدی
این دوره را در 23 قسط خریداری کنید
دوره آموزشی برنامه نویسی اندروید با زبان جاوا به زبان ساده
مدرس: مهدی عادلی
این دوره را در 27 قسط خریداری کنید
دوره آموزشی طراحی رابط کاربری با JavaFX
مدرس: hharddy
این دوره را در 13 قسط خریداری کنید
دوره آموزشی برنامه نویسی به زبان پرل بصورت پروژه محور
مدرس: dr-iman
این دوره را در 13 قسط خریداری کنید
دوره آموزشی مقدماتی برنامه نویسی جاوا به زبان ساده
مدرس: مهدی عادلی
این دوره را در 17 قسط خریداری کنید
دوره آموزشی Exploit نویسی به زبان Perl
مدرس: dr-iman
این دوره را در 7 قسط خریداری کنید

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

2 نظرات
41 بازدیدها
سلام .به عنوان اولین مقاله قصد دارم که یک سری مقاله رو آغاز کنم با عنوان 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 برای کلاینت ارسال میشه .

با آرزوی موفقیت...
برچسب ها
مطالب مرتبط

در حال دریافت اطلاعات

نظرات

برای ارسال نظر ابتدا به سایت وارد شوید

arrow