Is there any attribute relating to AJAX to be set for ASP.NET MVC controller actions?

后端 未结 6 874
轻奢々
轻奢々 2020-11-30 02:13

I want to use partial views with AJAX calls in ASP.NET MVC, and this is the first time I\'m using it. I just searched to see if there is anything special I should know befor

相关标签:
6条回答
  • 2020-11-30 02:49

    I don't think there is built in attribute for ajax, but you can create your own AjaxOnly filter like this:

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

    And decorate your action methods like this:

    [AjaxOnly]
    public ActionResult AjaxMethod()
    {
       
    }
    

    See Also: ASP.NET MVC Action Filter – Ajax Only Attribute for another way of implementing this

    0 讨论(0)
  • 2020-11-30 02:54

    A spinoff of Muhammad's answer letting you specify that it mustn't be an ajax request as well:

    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();
        }
    }
    

    This lets you do things like...

    [Ajax]
    public PartialViewResult AjaxUpdatingPage() {
        return PartialView();
    }
    
    [Ajax(false)]
    public ViewResult NotAjaxUpdatingPage() {
        return View();
    }
    
    0 讨论(0)
  • 2020-11-30 02:55

    my solution follows the [ChildActionOnly] implementation:

    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
                ));
        }
    }
    
    0 讨论(0)
  • 2020-11-30 03:02

    ASP.NET MVC provides an extension method to check if an Request is an Ajax Request. You can use it to decide if you want to return a partial view or json result instead of a normal view.

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

    To limit an action method to Ajax calls only you can write a custom attribute. In case of a normal request this filter will return a 404 not found http exception.

    [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);
            }
         }
    }
    

    you can use it like that:

    [AjaxOnly]
    public ActionResult Index() {
        // do something awesome
    }
    
    0 讨论(0)
  • 2020-11-30 03:02

    For those looking for a .NET Core solution it's a little bit more involved, as IsAjaxRequest() is no longer available.

    Below is the code I've used in production on several projects to great effect.

    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;
      }
    }
    
    0 讨论(0)
  • 2020-11-30 03:06

    There is an [AjaxOnly] attribute provided in the ASP.NET MVC 3 Futures collection. It's a part of the official ASP.NET MVC Codeplex site that provides features before they are officially included in a future version of ASP.NET MVC.

    You can download it here. To use it, add a reference to the Microsoft.Web.Mvc assembly included in the release package.

    There is an explanation of the attribute on this page, along with all the other great features you can use.

    0 讨论(0)
提交回复
热议问题