2009-08-26 4 views
7

Mon application ASP.NET MVC est une petite partie d'une application ColdFusion plus grande qui va bientôt être remplacée complètement. Je passe certains paramètres de la partie ColdFusion via des cookies et je dois vérifier ces informations avant d'exécuter chaque action. Dans le cas où l'information est manquante, je dois rediriger vers le site parent. Quel est le meilleur endroit pour mettre cette fonctionnalité et comment l'appeler uniformément?Comment câbler du code commun à partir d'un contrôleur de base dans ASP.NET MVC

Actuellement, j'ai implémenté un contrôleur de base et, dans chaque méthode d'action, j'appelle une méthode du contrôleur de base et, en fonction du résultat de retour, redirige ou continue l'action. Cette approche semble fonctionner mais elle encombre mes méthodes d'action avec consern pas directement lié à l'action. Comment pourrais-je le séparer, y a-t-il des événements de cycle de vie pour le contrôleur que je pourrais exploiter?

Répondre

6

Si vous avez déjà mis en place un contrôleur de base juste passer outre sa OnActionExecuting() méthode:

public class YourBaseController : Controller 
{ 
    protected override void OnActionExecuting(ActionExecutingContext filterContext) 
    { 
     base.OnActionExecuting(filterContext); 

     if(somethingIsWrong) 
     { 
      filterContext.Result = new RedirectToRouteResult(
       new System.Web.Routing.RouteValueDictionary { ... }); 
     } 
    } 
} 
2

Si cela est nécessaire à chaque action dans un contrôleur particulier, une option potentielle que vous pourriez probablement utiliser est de faire tout ce dans le contrôleur de base ...

public class MyBaseController: Controller 
{ 
    protected override void Initialize(RequestContext requestContext) 
    { 
     base.Initialize(requestContext); 

     var cookie = base.Request.Cookies["coldfusioncookie"]; 
     //if something is wrong with cookie 
      Response.Redirect("http://mycoldfusionapp"); 
    } 
} 
2

La meilleure approche serait de implémentez un ActionFilterAttribute personnalisé et remplacez la méthode OnActionExecuting pour gérer la logique, puis décorez simplement vos actions avec l'attribut.

public class CheckCookieAttribute : ActionFilterAttribute 
{ 
    public override void OnActionExecuting(ActionExecutingContext filterContext) 
    { 
     // Check your cookie and handle the redirect here, otherwise, do nothing 
     // You can get to your cookie through the filterContext parameter 
    } 
} 

public class ActionController : Controller 
{ 
    [CheckCookie] 
    public ActionResult GetFoo() 
    { 
     return View(); 
    } 
} 

Espérons que cela aide.

+1

réponse de Kurt semble plus logique puisque cela sera réalisé sur chaque action. Si ce n'était que certaines actions, votre approche serait meilleure. – Martin

+0

Pas de soucis Martin. Si vous en avez besoin pour chaque action, je suggérerais ce que eu-ge-ne a répondu. J'étais à peu près aussi, mais ensuite j'ai vu sa réponse. –

Questions connexes