Как указать 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