2009-07-11 12 views
2

Ich brauche einige Navigationsoptionen, die für den aktuellen Benutzer spezifische Schlüssel erfordern, die sich auf einer Masterpage befinden. Ich brauche einen Ratschlag zu Best Practice.So legen Sie Navigationsvariablen in MVC Masterpages fest

In die folgenden Links in einem linken Navigations in einem Masterpage

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

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

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

Wo '123' ist die Laden-ID, die die aktuelle Benutzer ist der Manager von. Ich brauche eine Möglichkeit, dies zu der Masterpage der Weitergabe

Derzeit ich etwas in diesem Sinne werde:

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

Ich dachte, das war eine gute Idee, da ich nur die ShopKey einmal in der Sitzung festgelegt haben und es ist getan, die nach unten ist, dass iv bemerkt, dass die Sitzung gemischt wird, wenn Sie die Website geöffnet haben zwei Registerkarten.

Alternativ habe ich versucht, dieses:

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

Aber das bedeutet, dass Sie die Viewdata Einstellung in jeder Aktion in jedem Controller zu halten haben. Was furchtbar ist.

BEARBEITEN: Ich habe schon an Filtern wie eu-ge-ne unten vorgeschlagen, aber ich das nicht wirklich löst mein Problem, wie ich immer noch das Problem der Einstellung der ShopKey überall?

Was ist die Lösung?

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

und verwenden Sie es auf dem Controller oder Controller-Aktionen

[UserKey] 
public class YourController : Controller 
{ 

// or 

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

oder verwenden Controller.OnActionExecuting() (oder sogar schaffen Basis-Controller für diese:

+1

Es ist nicht schrecklich, wenn Ihre Controller von Basis-Controller abgeleitet ist, die fügt notwendige ViewData hinzu. –

+0

Gib mir ein Beispiel wie? Kann nicht sehen, wie eine Basis helfen würde – Dan

Antwort

2

Sie können benutzerdefinierte Filter für diese erstellen wie Arnis L. sagte):

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

Also in dieser Zeile: filterContext.Controller.ViewData ["UserKey"] = UserKey; Was setzt den Wert von UserKey? Bewegen Sie nicht einfach das Problem, anstatt es zu lösen? – Dan

+0

Dan, meine Antwort war nur über "Festlegen der ViewData in jeder Aktion in jedem Controller. Was ist schrecklich". Könntest du den Code aus deiner Frage posten, wie hast du Session ["UserKey"] gesetzt? Was ist http://www.example.com/manageprofile/123? Ist es Link für den aktuellen Benutzer (in diesem Fall können Sie etwas einfacheres verwenden - zum Beispiel http://www.example.com/manageprofile)? Oder der aktuelle Benutzer ist Admin und es gibt mehrere Links, um Profile von normalen Benutzern auf der Masterseite zu verwalten. –

+0

Eugene Ich setze nur Sitzung ["UserKey"] in einer meiner Controller-Aktionen (Es ist nur an einer Stelle, wo sein logisch zu setzen, ich glaube nicht, ein Code-Snippet würde nichts veranschaulichen). Mein Beispiel ist entworfen, um einen Punkt zu illustrieren - aber ich brauche trotzig die Schlüssel am Ende. – Dan

Verwandte Themen