2 Stimmen

Wie man Navigationsvariablen in MVC Masterpages setzt

Ich muss einige Navigationsoptionen haben, die Tasten erfordern, die für den aktuellen Benutzer spezifisch sind, die in einer Masterseite liegen. Ich benötige einige Ratschläge zur besten Praxis.

Ich habe die folgenden Links in einer linken Navigationsleiste auf einer Masterseite

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

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

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

Dabei ist '123' die Shop-ID, deren Manager der aktuelle Benutzer ist. Ich brauche eine Möglichkeit, dies an die Masterseite zu übergeben

Zurzeit mache ich etwas in dieser Richtung:

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

Ich dachte, dass dies eine gute Idee war, da ich den ShopKey nur einmal in der Sitzung einstellen muss und fertig. Der Nachteil ist, dass ich bemerkt habe, dass die Sitzung gemischt wird, wenn man die Seite in zwei Tabs geöffnet hat.

Alternativ dazu habe ich dies versucht:

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

Das bedeutet aber, dass Sie die ViewData in jeder Aktion in jedem Controller neu setzen müssen. Das ist furchtbar.

EDIT : Ich habe alook auf Filter wie eu-ge-ne unten vorgeschlagen, aber ich dont dies wirklich mein Problem löst, da ich immer noch das Problem der Einstellung der ShopKey überall?

Was ist die Lösung?

2voto

eu-ge-ne Punkte 27673

Sie können dafür einen eigenen Filter erstellen:

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

und verwenden Sie es für Ihren Controller oder Ihre Controller-Aktionen

[UserKey]
public class YourController : Controller
{

// or

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

oder verwenden Sie Controller.OnActionExecuting() (oder erstellen Sie sogar Basis-Controller für diese 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
{

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X