asp.net-mvc - ماهو - mvc 5 شرح




هل هناك أي سمة تتعلق بأجاكس يتم تعيينها لإجراءات تحكم ASP.NET MVC؟ (4)

أرغب في استخدام العروض الجزئية مع مكالمات AJAX في ASP.NET MVC ، وهذه هي المرة الأولى التي أستخدمها فيها. لقد بحثت للتو لمعرفة ما إذا كان هناك أي شيء خاص يجب أن أعرفه مسبقًا ، وأحد الأمور التي أشعر بالفضول بشأنها ، هو معرفة ما إذا كان هناك أي سمة خاصة يجب تعيينها أو أنها مرتبطة بمكالمات AJAX؟ شيء مثل [ChildActionOnly] أو [HttpGet]


بالنسبة لأولئك الذين يبحثون عن حل .NET Core ، يكون الأمر أكثر تعقيدًا ، حيث لم يعد IsAjaxRequest() متوفرًا.

في ما يلي الشفرة التي استخدمتها في الإنتاج في العديد من المشروعات بشكل كبير.

public class AjaxOnlyAttribute : ActionMethodSelectorAttribute
{
  public override bool IsValidForRequest(RouteContext routeContext, ActionDescriptor actionDescriptor)
  {
    if(routeContext.HttpContext.Request.Headers != null &&
      routeContext.HttpContext.Request.Headers.ContainsKey("X-Requested-With") &&
      routeContext.HttpContext.Request.Headers.TryGetValue("X-Requested-With", out StringValues requestedWithHeader))
    {
      if(requestedWithHeader.Contains("XMLHttpRequest"))
      {
        return true;
      }
    }

    return false;
  }
}

توجد سمة [AjaxOnly] المتوفرة في مجموعة Futures ASP.NET MVC 3 . وهو جزء من موقع ASP.NET MVC Codeplex الرسمي الذي يوفر ميزات قبل أن يتم تضمينها رسميًا في إصدار مستقبلي من ASP.NET MVC.

يمكنك تنزيله من here . لاستخدامه ، إضافة مرجع إلى تجميع Microsoft.Web.Mvc المضمنة في حزمة الإصدار.

هناك تفسير للسمة في this الصفحة ، بالإضافة إلى جميع الميزات الرائعة الأخرى التي يمكنك استخدامها.


لا أعتقد أن هناك سمة مضمنة في ajax ولكن ليس من الصعب جدًا إنشاء واحد. يمكنك إنشاء فلتر AjaxOnly مثل

public class AjaxOnlyAttribute : ActionMethodSelectorAttribute 
    {
        public override bool IsValidForRequest(ControllerContext controllerContext, System.Reflection.MethodInfo methodInfo)
        {
            return controllerContext.RequestContext.HttpContext.Request.IsAjaxRequest();
        }
    }

وتزيين أساليب العمل الخاصة بك مثل

[AjaxOnly]
public ActionResult ajaxMethod()
{

}

انظر إلى هذه المشاركة لطريقة أخرى لتنفيذ هذه السمة


يتبع الحل الخاص [ChildActionOnly] تنفيذ [ChildActionOnly] :

public class AjaxOnlyAttribute : FilterAttribute, IAuthorizationFilter
{
    public void OnAuthorization(AuthorizationContext filterContext)
    {
        if (filterContext == null)
            throw new ArgumentNullException("filterContext");
        if (!filterContext.HttpContext.Request.IsAjaxRequest())
            throw new InvalidOperationException(string.Format(
                CultureInfo.CurrentCulture, 
                "The action '{0}' is accessible only by an ajax request.", 
                filterContext.ActionDescriptor.ActionName
            ));
    }
}






aop