2009-07-11 2 views
2

Мне нужно иметь некоторые параметры навигации, для которых требуются ключи, относящиеся к текущему пользователю, которые находятся на главной странице. Мне нужен совет по лучшей практике.Как установить переменные навигации в MVC Masterpages

В имеют следующие ссылки в левой навигационной панели в MasterPage

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

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

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

Где '123' является магазин идентификатор, который в настоящее время пользователь является менеджером. Мне нужен какой-то способ прохождения этого к MasterPage

В настоящее время я собираюсь что-то по этому поводу:

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

Я думал, что это хорошая идея, так как я только установить ShopKey один раз в сессии и его сделано, нижняя сторона заключается в том, что iv заметил, что сеанс смешанный, если у вас открыт сайт, это две вкладки.

В качестве альтернативы я попытался это:

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

Но это означает, что вы должны держать установки ViewData в каждом действии в каждом контроллере. Это ужасно.

EDIT: У меня был подобный фильтр, например, eu-ge-ne, предложенный ниже, но я не решаю эту проблему, поскольку у меня все еще есть проблема установки ShopKey повсюду?

Какое решение?

+1

Это не ужасно, если ваши контроллеры происходят от базового контроллера, который добавляет необходимые ViewData. –

+0

Дайте мне пример того, как? Не могу видеть, как база поможет – Dan

ответ

2

Вы можете создать собственный фильтр для этого:

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

и использовать его на контроллере или контроллера действий

[UserKey] 
public class YourController : Controller 
{ 

// or 

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

или использовать Controller.OnActionExecuting() (или даже создать базовый контроллер для этого как сказал Арнис Л.):

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

Итак, в этой строке: filterContext.Controller.ViewData ["UserKey"] = UserKey; Что задает значение UserKey? Вы не просто переместите проблему, а решили ее? – Dan

+0

Дэн, я отвечал только о том, чтобы «настроить ViewData в каждом действии на каждом контроллере, что ужасно». Не могли бы вы вывести код из своего вопроса, как вы установили Session ["UserKey"]. Что такое http://www.example.com/manageprofile/123? Это ссылка для текущего пользователя (в этом случае вы можете использовать что-то более простое - например, http://www.example.com/manageprofile)? Или текущий пользователь Admin, и есть несколько ссылок для управления профилями обычных пользователей на главной странице? –

+0

Eugene Im просто устанавливает Session ["UserKey"] в одном из моих действий с контроллером (его как раз в одном месте, где его логический набор, я не думаю, что фрагмент кода иллюстрирует что-либо). Мой пример придумал, чтобы проиллюстрировать точку - но я вызывающе нуждаюсь в ключах в конце. – Dan

Смежные вопросы