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 así como [ChildActionOnly]
o [HttpGet]
¿Hay algún atributo relacionado con AJAX que se establezca para las acciones del controlador ASP.NET MVC?
Respuesta
No creo que haya un atributo incorporado para ajax, pero no es demasiado difícil crear uno. puede crear AjaxOnly filtro como
public class AjaxOnlyAttribute : ActionMethodSelectorAttribute
{
public override bool IsValidForRequest(ControllerContext controllerContext, System.Reflection.MethodInfo methodInfo)
{
return controllerContext.RequestContext.HttpContext.Request.IsAjaxRequest();
}
}
y decorar sus métodos de acción como
[AjaxOnly]
public ActionResult ajaxMethod()
{
}
Mira this post de otra forma de ejecución de este atributo
ASP.NET MVC proporciona un método de extensión para comprobar 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);
}
}
}
puede utilizar de esa manera:
[AjaxOnly]
public ActionResult Index() {
// do something awesome
}
Hay un [AjaxOnly] atributo previsto en la colecciónASP.NET MVC 3 Futuros. Es una parte del sitio oficial de ASP.NET MVC Codeplex que proporciona características antes de que se incluyan oficialmente en una versión futura de ASP.NET MVC.
Puede descargarlo here. Para usarlo, agregue una referencia al ensamblado Microsoft.Web.Mvc incluido en el paquete de lanzamiento.
Hay una explicación del atributo en la página this, junto con todas las demás funciones excelentes que puede usar.
mi solución sigue la [ChildActionOnly]
aplicación:
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
));
}
}
+1 para proporcionar una implementación que se puede aplicar a un controlador completo (en lugar de aplicarlo a todos y cada uno de los métodos de acción por separado, lo que puede ser una verdadera tensión). – xDisruptor
un spin-off de la respuesta de Muhammad que le permite especificar que no debe ser una petición ajax así:
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 le permite hacer cosas como ...
[Ajax]
public PartialViewResult AjaxUpdatingPage() {
return PartialView();
}
[Ajax(false)]
public ViewResult NotAjaxUpdatingPage() {
return View();
}
Para aquellos que buscan una solución .NET Core es ' s un poco más involucrado, ya que IsAjaxRequest()
ya no está disponible.
A continuación se muestra el código que he utilizado 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;
}
}
- 1. Diseño de acciones del controlador ASP.NET MVC
- 2. acciones ASP.Net MVC controlador que devuelven vacío
- 3. Asp.net Mvc: enumere todas las acciones en un controlador con el atributo específico
- 4. ¿Hay algún diseñador gráfico para ASP.NET MVC?
- 5. Asignación de botones individuales en ASP.NET MVC Vista para las acciones del controlador
- 6. Enforce Acción de filtrado en todas las acciones del controlador (C#/ASP.NET MVC)
- 7. ¿Cómo localizar los nombres y las acciones del controlador en una aplicación ASP.NET MVC?
- 8. ASP.Net MVC 3: Atributo Autorizar Inverso
- 9. ASP.NET MVC redirige del atributo
- 10. acciones sobrecarga del controlador
- 11. Tabla paginada con ASP.NET MVC y AJAX
- 12. ASP.NET MVC: Ejecutar código en todas las acciones (global OnActionExecuting?)
- 13. acciones sobrecarga ASP.NET MVC
- 14. ASP.NET MVC: AJAX ActionLink: segmentar un atributo HTML
- 15. Deshabilitar condicionalmente el controlador MVC de ASP.NET
- 16. jQuery Ajax matriz POSTing para controlador ASP.NET MVC
- 17. Acciones del controlador ASP.NET MVC que devuelven JSON o html parcial
- 18. ASP.NET MVC AJAX con jQuery
- 19. ASP.NET MVC: Controlador simulado.Url.Action
- 20. ASP.NET MVC y AJAX
- 21. jquery ajax formularios para ASP.NET MVC 3
- 22. Autorizar el atributo y jquery AJAX en asp.net MVC
- 23. Anular Autorizar atributo en ASP.NET MVC
- 24. ¿Hay algún otro atributo útil para las propiedades de C#?
- 25. Contexto del controlador Asp.net-mvc burlón
- 26. ASP .Net MVC 3: Acciones del controlador de prueba unitaria
- 27. ASP.NET MVC Html.DropDownList poblado por Ajax llamada al controlador?
- 28. ASP.NET MVC 3 + Razor Error: las acciones secundarias no pueden realizar acciones de redirección
- 29. Ciclo de vida del controlador ASP.NET MVC
- 30. Ajustar todas las acciones del controlador en transacciones en Rails
Cómo MVC sabe que esta es realmente una solicitud de AJAX.¿Utiliza algún campo de encabezado HTTP personalizado? A veces, XmlHttpRequest no envía encabezados personalizados. –
Utiliza el encabezado 'X-Requested-With' y este es el encabezado que se lee mediante el método' Request.IsAjaxRequest() '. –
¿Hay alguna manera de hacer algo como esto con AttributeRouting? Implementa HttpRouteAttribute. – appsecguy