ASP.NET MVC Routing - автоматически передавать значение входящего маршрута на исходящие URL-адреса? - PullRequest
2 голосов
/ 08 июля 2010

У меня есть приложение ASP.NET MVC с областью администратора, которая занимается администрированием компаний и их дочерних объектов, таких как пользователи и продукты.Маршрут по умолчанию, связанный с дочерней сущностью, определяется следующим образом:

"Admin/Company/{companyID}/{controller}/{id}/{action}"

Я хотел бы убедиться, что везде в области администратора, когда входящий маршрут включает в себя companyID, это значение автоматически включается в каждыйсгенерированный URL.Например, если на моей странице редактирования пользователя есть ссылка, определенная с помощью Html.ActionLink("back to list", "Index"), система маршрутизации автоматически извлечет companyID из данных входящего маршрута и включит его в исходящий маршрут, без необходимости явно указывать его в вызове ActionLink.

Я думаю, что есть несколько способов добиться этого, но есть ли предпочтительный / лучший способ?Это кричит для пользовательского обработчика маршрута?Что-то еще?

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

Заранее спасибо!

1 Ответ

0 голосов
/ 21 мая 2011

Тодд,

Я использую атрибут ActionFilterAttribute в своем приложении MVC 2, чтобы это произошло.Там могут быть лучшие способы сделать это:

[AttributeUsage(AttributeTargets.Class|AttributeTargets.Method, Inherited = true, AllowMultiple = true)]
sealed class MyContextProviderAttribute : ActionFilterAttribute
{
    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        // See if the context is provided so that you can cache it.
        string myContextParam = filterContext.HttpContext.Request["myContextParam"] ;
        if (!string.IsNullOrEmpty(myContextParam))
            filterContext.Controller.TempData["myContextParam"] = myContextParam;
        else
            // Manipulate the action parameters and use the cached value.
            if (filterContext.ActionParameters.Keys.Contains("myContextParam"))
                filterContext.ActionParameters["myContextParam"] = filterContext.Controller.TempData["myContextParam"];
            else
                filterContext.ActionParameters.Add("myContextParam", filterContext.Controller.TempData["myContextParam"]);

        base.OnActionExecuting(filterContext);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...