2010-09-10 10 views
1

L'une des beautés de MVC est la possibilité d'utiliser des actions pour les appels Web normaux ainsi que les appels Ajax. Mais ce faisant, je suis un peu mal à l'aise avec mon code. J'aimerais savoir ce que les autres pensent. Donc, je veux voir les détails d'un élément dans une liste. J'ai créé une vue Détails. J'ai également décidé d'utiliser le hijaxing - si un utilisateur a Javascript activé, je veux que le formulaire Détails soit un popup. Donc, pour le Details.aspx, j'ai besoin de html complet, mais si c'est une requête ajax, j'ai seulement besoin des éléments de formulaire. Alors, voici comment je l'ai écrit ma méthode de commande:Comment gérer les appels Ajax au contrôleur dans ASP.Net MVC

public ActionResult Details(int id) 
{ 
    if (Request.IsAjaxRequest()) 
    { 
     return PartialView(GetAjaxModel()); 
    } 
    else 
     return View(GetModel()); 
} 

Il fonctionne, mais chaque fois que j'ai un géant « si » entourant mon code entier, cela me dérange. Comment puis-je m'en débarrasser et/ou améliorer le code?

Je pourrais aussi écrire une méthode distincte appelée AjaxDetails, mais ce que je voudrais vraiment écrire est ceci:

public ActionResult Details(int id) 
{ 
     return View(GetModel()); 
} 

[Ajax] 
public ActionResult Details(int id) 
{ 
    return View(GetAjaxModel()); 
}  

Mais à ma connaissance, il n'y a pas d'attribut pour filtrer Ajax vs les appels normaux.

Comment écrivez-vous vos appels Ajax?

MISE À JOUR Clicktricity a en effet la bonne réponse. Un autre changement est toutefois que que depuis deux méthodes de contrôleur ne peut pas avoir la même signature, je dois écrire le code du contrôleur en tant que tel:

public ActionResult Details(int id) 
{ 
     return View(GetModel()); 
} 

[AjaxRequest] 
[ActionName("Details")] 
public ActionResult DetailsAjax(int id) 
{ 
    return PartialView(GetAjaxModel()); 
}  
+0

points – Clicktricity

Répondre

3

Vous avez raison qu'il n'y a pas un filtre qui fait cela - mais d'une manière typique MVC, il n'y a aucune raison pour laquelle vous ne pourriez pas écrire les vôtres.

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

Ensuite, vous pouvez utiliser [AjaxRequest] sur vos méthodes d'action.

(S'il vous plaît noter, je n'ai pas testé)

+0

+1 intéressant pour la réponse, et la mise en garde d'accompagnement! –

Questions connexes