2010-07-08 3 views
2

J'ai une application ASP.NET MVC avec une zone d'administration qui traite de l'administration des sociétés et de leurs entités enfants, telles que les utilisateurs et les produits. La route par défaut associée à une entité enfant est défini comme suit:Routage ASP.NET MVC - Transmettre automatiquement la valeur de route entrante aux URL sortantes?

"Admin/Company/{companyID}/{controller}/{id}/{action}" 

je voudrais faire en sorte que, partout dans la région Admin, chaque fois que la route entrante comprend COMPANYID, que cette valeur est automatiquement incluse dans toutes les URL générées . Par exemple, si ma page de modification d'utilisateur a un lien défini avec Html.ActionLink("back to list", "Index"), le système de routage saisira automatiquement l'ID de société à partir des données de route entrantes et l'inclura dans la route sortante, sans avoir à le spécifier explicitement dans l'appel à ActionLink.

Je pense qu'il y a plus d'un moyen d'y parvenir, mais y a-t-il un moyen préféré? Est-ce qu'il crie pour un gestionnaire de route personnalisé? Autre chose? Mon but est de ne pas perdre le contexte actuel de l'entreprise lors de la navigation dans les sous-sections, et je ne veux pas utiliser Session - qui pourrait me brûler si l'utilisateur ouvre plusieurs sociétés dans différentes fenêtres/onglets du navigateur .

Merci d'avance!

Répondre

0

Todd,

J'utilise un ActionFilterAttribute pour que cela se produise dans mon application MVC 2. Il peut y avoir de meilleurs moyens de le faire:

[AttributeUsage(AttributeTargets.Class|AttributeTargets.Method, Inherited = true, AllowMultiple = true)] 
sealed class MyContextProviderAttribute : ActionFilterAttribute 
{ 
    public override void OnActionExecuting(ActionExecutingContext filterContext) 
    { 
     // See if the context is provided so that you can cache it. 
     string myContextParam = filterContext.HttpContext.Request["myContextParam"] ; 
     if (!string.IsNullOrEmpty(myContextParam)) 
      filterContext.Controller.TempData["myContextParam"] = myContextParam; 
     else 
      // Manipulate the action parameters and use the cached value. 
      if (filterContext.ActionParameters.Keys.Contains("myContextParam")) 
       filterContext.ActionParameters["myContextParam"] = filterContext.Controller.TempData["myContextParam"]; 
      else 
       filterContext.ActionParameters.Add("myContextParam", filterContext.Controller.TempData["myContextParam"]); 

     base.OnActionExecuting(filterContext); 
    } 
} 
+0

Merci pour la réponse. Solution intéressante Bien que je n'ai pas essayé cela, TempData est lié à Session et par conséquent je ne * pense * pas que cela résout mes inquiétudes concernant un utilisateur qui va et vient entre les onglets du navigateur avec différents "contextes". Alors que je voulais éviter d'écrire un tas de méthodes alternatives UrlHelper (et en me souvenant de les utiliser TOUJOURS), c'est essentiellement le chemin que j'ai pris à la fin. –

+0

Todd, TempData ne survit que pour une requête ultérieure, cela devrait donc fonctionner pour vous. Mon application permet également aux utilisateurs de générer des rapports pour différentes personnes dans différents onglets. Voir http://stackoverflow.com/questions/173159/difference-between-viewdata-and-tempdata –