asp.net mvc - एएसपी.नेट एमवीसी नियंत्रक कार्यों के लिए सेट करने के लिए AJAX से संबंधित कोई विशेषता है?




asp.net-mvc asp.net-mvc-3 (4)

.NET कोर समाधान की तलाश करने वालों के लिए यह थोड़ा और अधिक शामिल है, क्योंकि 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;
  }
}

मैं एएसपी.नेट एमवीसी में AJAX कॉल के साथ आंशिक विचारों का उपयोग करना चाहता हूं, और यह पहली बार है जब मैं इसका उपयोग कर रहा हूं। मैंने अभी यह देखने के लिए खोज की है कि क्या कुछ खास है, मुझे पहले से पता होना चाहिए, और एक ऐसा है जिसे मैं उत्सुक हूं, यह देखना है कि क्या कोई विशेष विशेषता है जिसे सेट किया जाना चाहिए या AJAX कॉल से संबंधित है? कुछ [ChildActionOnly] या [HttpGet]


एएसपी.नेट एमवीसी यह जांचने के लिए एक विस्तार विधि प्रदान करता है कि कोई अनुरोध अजाक्स अनुरोध है या नहीं। आप यह तय करने के लिए इसका उपयोग कर सकते हैं कि क्या आप सामान्य दृश्य के बजाय आंशिक दृश्य या जेसन परिणाम वापस करना चाहते हैं।

if (Request.IsAjaxRequest())
{
    return PartialView("name");
}
return View();

अजाक्स कॉल करने के लिए एक एक्शन विधि को सीमित करने के लिए केवल आप एक कस्टम विशेषता लिख ​​सकते हैं। सामान्य अनुरोध के मामले में यह फ़िल्टर 404 को http अपवाद नहीं मिलेगा।

[AttributeUsage(AttributeTargets.Method)]
public class AjaxOnlyAttribute : ActionFilterAttribute
{
     public override void OnActionExecuting(ActionExecutingContext filterContext)
     {
        if (!filterContext.HttpContext.Request.IsAjaxRequest())
        {
            filterContext.HttpContext.Response.StatusCode = 404;
            filterContext.Result = new HttpNotFoundResult();
        }
        else
        {
            base.OnActionExecuting(filterContext);
        }
     }
}

आप इसका उपयोग इस तरह कर सकते हैं:

[AjaxOnly]
public ActionResult Index() {
    // do something awesome
}

मुहम्मद के उत्तर का एक स्पिनऑफ आपको यह बताते हुए बताता है कि यह अजाक्स अनुरोध भी नहीं होना चाहिए:

using System.Web.Mvc;
public class AjaxAttribute : ActionMethodSelectorAttribute
{
    public bool ajax { get; set; }
    public AjaxAttribute() { ajax = true; }
    public AjaxAttribute(bool a) { ajax = a; }
    public override bool IsValidForRequest(ControllerContext controllerContext, System.Reflection.MethodInfo methodInfo)
    {
        return ajax == controllerContext.HttpContext.Request.IsAjaxRequest();
    }
}

यह आपको चीजों की तरह करने देता है ...

[Ajax]
public PartialViewResult AjaxUpdatingPage() {
    return PartialView();
}

[Ajax(false)]
public ViewResult NotAjaxUpdatingPage() {
    return View();
}

मेरा समाधान [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