2009-07-11 3 views
2

J'ai besoin d'options de navigation, qui nécessitent des clés spécifiques à l'utilisateur courant, qui résident dans une page maître. J'ai besoin de conseils sur les meilleures pratiques.Comment définir les variables de navigation dans les pages maîtres MVC

En ont les liens suivants dans une navigation de gauche dans un masterpage

http://www.example.com/manageShop/123

http://www.example.com/addProductToShop/123

http://www.example.com/addStaffToShop/123

Où '123' est l'identifiant du magasin que le courant l'utilisateur est le gestionnaire de. J'ai besoin d'une certaine façon de la passer à la masterpage

Actuellement, je vais quelque chose à cet effet:

<li><%= Html.ActionLink<ShopController>(x => x.ManageShop((int)Session["ShopKey"]), "Manage")%></li> 

Je pensais que c'était une bonne idée que je ne pour régler la ShopKey une fois dans la session et c'est fait, l'inconvénient est que iv remarqué que la session se mélange si vous avez le site ouvert est de deux onglets.

Sinon j'ai essayé ceci:

<li><%= Html.ActionLink<ShopController>(x => x.ManageShop((int)ViewData["ShopKey"]), "Manage")%></li> 

Mais cela signifie que vous devez garder le réglage de la ViewData dans toutes les actions dans chaque contrôleur. Ce qui est horrible.

EDIT: J'ai eu alook à des filtres comme eu-ge-ne suggéré ci-dessous, mais je ne résout pas vraiment mon problème car j'ai toujours le problème de définir le ShopKey partout?

Quelle est la solution?

+1

Ce n'est pas terrible, si vos contrôleurs dérivent du contrôleur de base, qui ajoute ViewData nécessaire. –

+0

Donnez-moi un exemple de comment? Je ne peux pas voir comment une base aiderait – Dan

Répondre

2

Vous pouvez créer un filtre personnalisé pour cela:

public class UserKeyAttribute : ActionFilterAttribute 
{ 
    public override void OnActionExecuting(ActionExecutingContext filterContext) 
    { 
     filterContext.Controller.ViewData["UserKey"] = UserKey; 
    } 
} 

et l'utiliser sur vos actions de contrôleur ou

[UserKey] 
public class YourController : Controller 
{ 

// or 

public class YourController : Controller 
{ 
    [UserKey] 
    public ActionResult Index() 
    { 

ou utilisez Controller.OnActionExecuting() (ou même créer contrôleur de base pour cette comme Arnis L. a dit):

public class BaseController : Controller 
{ 
    protected override void OnActionExecuting(ActionExecutingContext filterContext) 
    { 
     filterContext.Controller.ViewData["UserKey"] = UserKey; 
    } 
} 

// and then derive your controllers from BaseController 

public class YourController : BaseController 
{ 
+0

Donc dans cette ligne: filterContext.Controller.ViewData ["UserKey"] = UserKey; Qu'est-ce qui définit la valeur de UserKey? N'êtes-vous pas simplement en train de déplacer le problème plutôt que de le résoudre? – Dan

+0

Dan, ma réponse ne concernait que "la définition de ViewData dans chaque action de chaque contrôleur, ce qui est horrible". Pourriez-vous poster le code de votre question comment avez-vous mis Session ["UserKey"]. Qu'est-ce que http://www.example.com/manageprofile/123? S'agit-il d'un lien pour l'utilisateur actuel (dans ce cas, vous pouvez utiliser quelque chose de plus simple - par exemple http://www.example.com/profil de gestion)? Ou l'utilisateur actuel est Admin et il existe plusieurs liens pour gérer les profils des utilisateurs habituels sur la page maître? –

+0

Eugene Je mets simplement Session ["UserKey"] dans une de mes actions de contrôleur (C'est juste à un endroit, où il est logique de le définir, je ne pense pas qu'un extrait de code puisse illustrer quoi que ce soit). Mon exemple est conçu pour illustrer un point - mais j'ai besoin des clés à la fin. – Dan

Questions connexes