Как установить переменные навигации в главных страницах MVC - PullRequest
2 голосов
/ 11 июля 2009

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

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

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

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

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

Где «123» - это идентификатор магазина, менеджером которого является текущий пользователь. Мне нужен способ передать это на главную страницу

Сейчас я собираюсь кое-что на этот счет:

<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 в каждом действии на каждом контроллере. Что ужасно.

РЕДАКТИРОВАТЬ : Я смотрел на фильтры, подобные eu-ge-ne, предложенным ниже, но я не думаю, что это действительно решает мою проблему, так как у меня все еще есть проблема установки ShopKey везде?

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

1 Ответ

2 голосов
/ 11 июля 2009

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

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
{
...