¿Hay algún atributo relacionado con AJAX que se establezca para las acciones del controlador ASP.NET MVC?

Quiero usar vistas parciales con llamadas AJAX en ASP.NET MVC, y esta es la primera vez que lo estoy usando. Solo busqué para ver si hay algo especial que debería saber de antemano, y uno de ellos que me causa curiosidad, es ver si hay algún atributo especial que deba establecerse o que esté relacionado con las llamadas AJAX. Algo como [ChildActionOnly] o [HttpGet]

No creo que haya un atributo incorporado para ajax, pero no es muy difícil crear uno. puedes crear filtro AjaxOnly como

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

y decora tus métodos de acción como

 [AjaxOnly] public ActionResult ajaxMethod() { } 

Mire esta publicación para otra forma de implementar este atributo

ASP.NET MVC proporciona un método de extensión para verificar si una Solicitud es una Solicitud Ajax. Puede usarlo para decidir si desea devolver una vista parcial o un resultado json en lugar de una vista normal.

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

Para limitar un método de acción a las llamadas Ajax, solo puede escribir un atributo personalizado. En caso de una solicitud normal, este filtro devolverá una excepción http no encontrada 404.

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

puedes usarlo así:

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

Hay un atributo [AjaxOnly] proporcionado en la colección ASP.NET MVC 3 Futures . Es una parte del sitio oficial ASP.NET MVC Codeplex que proporciona características antes de que se incluyan oficialmente en una versión futura de ASP.NET MVC.

Puedes descargarlo aquí . Para usarlo, agregue una referencia al ensamblado Microsoft.Web.Mvc incluido en el paquete de lanzamiento.

Hay una explicación del atributo en esta página, junto con todas las otras características excelentes que puede usar.

Una derivación de la respuesta de Muhammad que le permite especificar que no debe ser también una solicitud de AJAX:

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

Esto te permite hacer cosas como …

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

mi solución sigue la implementación [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 )); } } 

Para aquellos que buscan una solución .NET Core es un poco más complicado, ya que IsAjaxRequest() ya no está disponible.

Debajo está el código que he usado en la producción en varios proyectos con gran efecto.

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