45 votes

Existe-t-il un attribut relatif à AJAX à définir pour les actions du contrôleur ASP.NET MVC?

Je veux utiliser des vues partielles avec des 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 l'un d'entre eux qui m'intéresse, est de voir s'il y a un attribut spécial qui devrait être défini ou lié aux appels AJAX? Quelque chose comme [ChildActionOnly] ou [HttpGet]

82voto

Muhammad Adeel Zahid Points 8420

Je ne pense pas qu'il y ait un attribut 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 AjaxOnlyAttribute : ActionMethodSelectorAttribute 
    {
        public override bool IsValidForRequest(ControllerContext controllerContext, System.Reflection.MethodInfo methodInfo)
        {
            return controllerContext.RequestContext.HttpContext.Request.IsAjaxRequest();
        }
    }
 

et décorez vos méthodes d'action comme

 [AjaxOnly]
public ActionResult ajaxMethod()
{

}
 

Regardez ce post pour une autre façon de mettre en œuvre cet attribut

19voto

tehshin Points 401

ASP.NET MVC fournit une méthode d'extension pour vérifier si une demande est une demande 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 uniquement, vous pouvez écrire un attribut personnalisé. En cas de demande normale, ce filtre renverra une exception http 404 introuvable.

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

vous pouvez l'utiliser comme ça:

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

4voto

Pluto Points 630

Un spin-off de la réponse de Muhammad vous permettant de spécifier qu'il ne doit pas s'agir également d'une demande 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();
    }
}
 

Cela vous permet de faire des choses comme ...

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

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

3voto

Xcalibur Points 1312

Il y a un [AjaxOnly] attribut fourni dans le ASP.NET MVC 3 contrat de collecte. C'est une partie de l'officiel ASP.NET MVC Codeplex site qui offre des fonctionnalités avant qu'ils soient officiellement inclus dans une future version de ASP.NET MVC.

Vous pouvez le télécharger ici. Pour l'utiliser, ajoutez une référence à Microsoft.Web.Mvc assemblée inclus dans le package de la version.

Il y a une explication de l'attribut sur cette page, ainsi que toutes les autres fonctionnalités que vous pouvez utiliser.

2voto

sanjuro Points 474

ma solution suit l'implémentation [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
            ));
    }
}
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X