Как указать обратный URL для ссылки на форму входа? - PullRequest
8 голосов
/ 03 февраля 2009

Казалось бы, достаточно просто, но, оказывается, это не так - в основном из-за того, что View не может знать, каким путем через Model и Controller вы туда попали. В любом случае, это проблема, требующая решения:

У меня есть ссылка для входа, которая переводит пользователя в форму для ввода имени пользователя и пароля. Когда пользователь нажимает «отправить», я хочу перенаправить на страницу, которую он просматривал. Самый простой способ сделать это - указать URL-адрес текущей страницы в виде строки запроса (...?returnUrl=...), а все остальное уже построено.

Но где я могу найти этот URL с моей точки зрения при отображении ссылки? Естественно, я не могу использовать RedirectToActionResult, поскольку я не хочу на самом деле передавать пользователя - только отображать URL в ссылке. Как?


EDIT:

Теперь я назначил награду за этот вопрос, и поэтому считаю нужным уточнить и мои потребности.

У меня есть пользовательский элемент управления с именем Login.ascx в моей общей папке. В нем я отображаю ActionLink для формы входа в систему, и она включена в нижний колонтитул на моей главной странице. Что я хочу сделать, это следующее:

Когда визуализируется ActionLink, к строке запроса returnUrl добавляется маршрут к представлению, которое в данный момент отображается . Если это будет выполнено, пользователь вернется на страницу, которую он просматривал, после успешного входа в систему с функциональностью, уже встроенной в ASP.NET MVC Framework.

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

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

Ответы [ 4 ]

20 голосов
/ 10 февраля 2009

Решение состоит в том, чтобы использовать HttpContext.Current.Request.RawUrl следующим образом:

<%= Html.ActionLink("log on", "LogIn", new { controller = "User", returnUrl = HttpContext.Current.Request.RawUrl }) %>

Или с методом расширения из MVC-фьючерсов (Microsoft.Web.Mvc.dll):

<%= Html.ActionLink<AccountController>(c => c.LogOn("name", "password", false, HttpContext.Current.Request.RawUrl), "login here")%>

ActionController по умолчанию используется в mvc, но просто добавьте returnUrl к своему собственному.

3 голосов
/ 03 февраля 2009

Одним из способов будет создание ссылок, которые отправляют пользователя в форму входа, с помощью returnUrl = / PageToReturnTo (<a href="/Account/Login/?returnUrl=/Product/10">Login</a>, например). Вы хотели бы написать его так, чтобы обратный URL был создан из ваших маршрутов, хотя ручная запись этих ссылок на каждой странице может быть громоздкой.

Действие входа по умолчанию в MVC уже имеет встроенную функциональность returnUrl. Просто нужно передать ему значение, и он сделает все остальное. Вот копия и вставка подписи метода из нового проекта.

public ActionResult Login(string username, string password, bool rememberMe, string returnUrl)

Надеюсь, это поможет тебе!

1 голос
/ 14 февраля 2009

Вы можете использовать Page.Request.Url, чтобы получить маршрут, который привел к текущему представлению.

Хотя это скорее косметическая деталь, вы можете объединить запросы, поступившие по маршрутам '/' и '/default.aspx', и всегда возвращаться к маршруту '/'. У меня есть вспомогательное свойство на главной странице, которое делает именно это.

    protected Uri RouteUrl
    {
        get
        {
            if (Page.Request.Url.AbsolutePath.StartsWith("/default.aspx", StringComparison.OrdinalIgnoreCase))
            {
                return new Uri(Request.Url, new Uri(Response.ApplyAppPathModifier("~/")));
            }

            return Page.Request.Url;
        }
    }
0 голосов
/ 13 февраля 2009

Я не знаю насчет ASPX, но есть несколько проблем, с которыми мы столкнулись при создании этого:

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

Мы также решили сохранить переменные POST на странице, которая затем требовала своевременного входа в систему

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