Je veux utiliser des vues partielles avec les appels AJAX dans ASP.NET MVC, et c’est la première fois que je l’utilise. Je viens de chercher pour voir s’il y a quelque chose de spécial que je devrais savoir à l’avance, et un de ceux dont je suis curieux, est de voir s’il y a des atsortingbuts spéciaux à définir ou qui sont liés aux appels AJAX? Quelque chose comme [ChildActionOnly]
ou [HttpGet]
Je ne pense pas qu’il existe un atsortingbut intégré pour ajax mais ce n’est pas trop difficile d’en créer un. vous pouvez créer un filtre AjaxOnly comme
public class AjaxOnlyAtsortingbute : ActionMethodSelectorAtsortingbute { public override bool IsValidForRequest(ControllerContext controllerContext, System.Reflection.MethodInfo methodInfo) { return controllerContext.RequestContext.HttpContext.Request.IsAjaxRequest(); } }
et décorer vos méthodes d’action comme
[AjaxOnly] public ActionResult ajaxMethod() { }
Regardez cet article pour un autre moyen d’implémenter cet atsortingbut
ASP.NET MVC fournit une méthode d’extension pour vérifier si une requête est une requête Ajax. Vous pouvez l’utiliser pour décider si vous souhaitez renvoyer une vue partielle ou un résultat json au lieu d’une vue normale.
if (Request.IsAjaxRequest()) { return PartialView("name"); } return View();
Pour limiter une méthode d’action aux appels Ajax, vous pouvez uniquement écrire un atsortingbut personnalisé. En cas de requête normale, ce filtre renverra une exception HTTP 404 non trouvée.
[AtsortingbuteUsage(AtsortingbuteTargets.Method)] public class AjaxOnlyAtsortingbute : ActionFilterAtsortingbute { public override void OnActionExecuting(ActionExecutingContext filterContext) { if (!filterContext.HttpContext.Request.IsAjaxRequest()) { filterContext.HttpContext.Response.StatusCode = 404; filterContext.Result = new HttpNotFoundResult(); } else { base.OnActionExecuting(filterContext); } } }
vous pouvez l’utiliser comme ça:
[AjaxOnly] public ActionResult Index() { // do something awesome }
Une retombée de la réponse de Mahomet vous permettant de préciser que cela ne doit pas être une requête ajax également:
using System.Web.Mvc; public class AjaxAtsortingbute : ActionMethodSelectorAtsortingbute { public bool ajax { get; set; } public AjaxAtsortingbute() { ajax = true; } public AjaxAtsortingbute(bool a) { ajax = a; } public override bool IsValidForRequest(ControllerContext controllerContext, System.Reflection.MethodInfo methodInfo) { return ajax == controllerContext.HttpContext.Request.IsAjaxRequest(); } }
Cela vous permet de faire des choses comme …
[Ajax] public PartialViewResult AjaxUpdatingPage() { return PartialView(); } [Ajax(false)] public ViewResult NotAjaxUpdatingPage() { return View(); }
Un atsortingbut [AjaxOnly] est fourni dans la collection ASP.NET MVC 3 Futures . C’est une partie du site officiel ASP.NET MVC Codeplex qui fournit des fonctionnalités avant qu’elles ne soient officiellement incluses dans une future version d’ASP.NET MVC.
Vous pouvez le télécharger ici . Pour l’utiliser, ajoutez une référence à l’assembly Microsoft.Web.Mvc inclus dans le package de la version.
Il y a une explication de l’atsortingbut sur cette page, ainsi que toutes les autres fonctionnalités que vous pouvez utiliser.
ma solution suit l’ [ChildActionOnly]
:
public class AjaxOnlyAtsortingbute : FilterAtsortingbute, IAuthorizationFilter { public void OnAuthorization(AuthorizationContext filterContext) { if (filterContext == null) throw new ArgumentNullException("filterContext"); if (!filterContext.HttpContext.Request.IsAjaxRequest()) throw new InvalidOperationException(ssortingng.Format( CultureInfo.CurrentCulture, "The action '{0}' is accessible only by an ajax request.", filterContext.ActionDescriptor.ActionName )); } }
Pour ceux qui recherchent une solution .NET Core, c’est un peu plus IsAjaxRequest()
, car IsAjaxRequest()
n’est plus disponible.
Vous trouverez ci-dessous le code que j’ai utilisé en production pour plusieurs projets.
public class AjaxOnlyAtsortingbute : ActionMethodSelectorAtsortingbute { 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 SsortingngValues requestedWithHeader)) { if(requestedWithHeader.Contains("XMLHttpRequest")) { return true; } } return false; } }