Как узнать, куда было перенаправлено действие в ASP.NET MVC? - PullRequest
2 голосов
/ 18 февраля 2010

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

У меня есть элемент контроллера с действием EditItem. EditItem направляется из многих мест, таких как

/Item/Browse/ByCategory
/Item/Browse/ByType
/Item/Browse/ByWhatever

Что я действительно хотел бы, так это вернуть пользователя на страницу, с которой он нажимал кнопку Изменить на элементе.

Я знаю, что могу сделать это, передав параметр? ReturnUrl для действия EditItem, но я продолжаю задаваться вопросом, возможно ли выяснить, откуда пришел пользователь, что-то вроде referer ...

Ответы [ 3 ]

1 голос
/ 18 февраля 2010

Ах, но, конечно, все возможно. В вашем контроллере (или предпочтительно базовом контроллере) переопределите OnActionExecuted и OnActionExecuting и поместите ваш предыдущий URL в сеанс. Используйте переменную сеанса в любом контроллере, который наследует от контроллера с этой реализацией (или только от этого контроллера, если вы не наследуете от пользовательской базы).

 protected string NextBackUrl {get; set;}
 protected override void OnActionExecuted(ActionExecutedContext filterContext)
        {

            HttpContext.Current.Session["PreviousURL"] = NextBackUrl;
            base.OnActionExecuted(filterContext);
        }

 protected override void OnActionExecuting(ActionExecutingContext filterContext)
        {

                if (Request.Url != null && Request.UrlReferrer != null && Request.Url != Request.UrlReferrer)
                {
                    NextBackUrl = Request.UrlReferrer.AbsoluteUri;
                }

            base.OnActionExecuting(filterContext);
        }
1 голос
/ 18 февраля 2010

Только что создал тестовое решение, так что я уверен, что это сработает. 1) Создайте новый маршрут до маршрута по умолчанию:

routes.MapRoute("EditItem",
   "EditItem/{referrer}/{id}",
   new {controller = "Item", action = "EditItem",id = "",referrer = "ByCategory"}
);

2) Используйте эту ссылку для редактирования элемента в любом из 3 представлений:

<%= Html.RouteLink("Edit Item 1", "EditItem", 
    new {referrer = ViewContext.RouteData.Values["action"], id = 1}) %>

3) Используйте эту кнопку Назад в представлении EditItem:

<%= Html.RouteLink("Back", "Default", 
    new { action = ViewContext.RouteData.Values["referrer"]})%>

Работа с маршрутами делает URL более красивыми и удобными для пользователя.

1 голос
/ 18 февраля 2010

Нет другого способа, кроме передачи returnUrl или проверки свойства HttpContext.Current.Request.Referer. Но Referer дает вам строковое значение, которое необходимо проанализировать, чтобы извлечь Action.

...