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]
Réponses
Trop de publicités?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
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
}
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();
}
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.
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
));
}
}