Как указать url-адрес возврата для ссылки на форму входа в систему?

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

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

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


EDIT:

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

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

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

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

для того, чтобы отметить ответ, как the ответ, я хочу, чтобы метод перестроил маршрут к текущему показанному виду из usercontrol в masterpage.

4 ответов


решение заключается в использовании HttpContext.Текущий.Запрос.RawUrl вот так:

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

или с методом расширения из фьючерсы MVC (Microsoft.Сеть.В MVC.DLL-файла):

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

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


один из способов-создать ссылки, которые отправляют пользователя в форму входа, с 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)

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


можно использовать 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;
        }
    }

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

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

мы также решили сохранить переменные POST на странице, которая затем требовала входа just-in-time