Как я могу перенаправить к предыдущему действию в ASP.NET в MVC?
предположим, что у меня есть некоторые страницы
some.web/articles/details/5
some.web/users/info/bob
some.web/foo/bar/7
это может вызвать общий контроллер утилиты, как
locale/change/es
или authorization/login
как мне получить эти методы (change
,login
) для перенаправления на предыдущие действия (details
,info
,bar
) при передаче им предыдущих параметров (5
,bob
,7
)?
In short: как мне перенаправить на страницу, которую я только что посетил после выполнения действия в другом контроллере?
9 ответов:
попробуй:
public ActionResult MyNextAction() { return Redirect(Request.UrlReferrer.ToString()); }
в качестве альтернативы, касаясь того, что сказал Дарин, попробуйте это:
public ActionResult MyFirstAction() { return RedirectToAction("MyNextAction", new { r = Request.Url.ToString() }); }
затем:
public ActionResult MyNextAction() { return Redirect(Request.QueryString["r"]); }
Если вы хотите перенаправить с кнопки в представлении можно использовать:
@Html.ActionLink("Back to previous page", null, null, null, new { href = Request.UrlReferrer})
Если вы не заинтересованы в модульном тестировании, то вы можете просто написать:
return Redirect(ControllerContext.HttpContext.Request.UrlReferrer.ToString());
предложение о том, как это сделать так, что:
- возвращаемый url-адрес сохраняет запрос POST формы (и любые неудачные проверки)
- возвращаемый url-адрес определяется из исходного URL-адреса ссылки
- без использования TempData[] или другого состояния на стороне сервера
- обрабатывает прямую навигацию к действию (предоставляя перенаправление по умолчанию)
.
public ActionResult Create(string returnUrl) { // If no return url supplied, use referrer url. // Protect against endless loop by checking for empty referrer. if (String.IsNullOrEmpty(returnUrl) && Request.UrlReferrer != null && Request.UrlReferrer.ToString().Length > 0) { return RedirectToAction("Create", new { returnUrl = Request.UrlReferrer.ToString() }); } // Do stuff... MyEntity entity = GetNewEntity(); return View(entity); } [AcceptVerbs(HttpVerbs.Post)] public ActionResult Create(MyEntity entity, string returnUrl) { try { // TODO: add create logic here // If redirect supplied, then do it, otherwise use a default if (!String.IsNullOrEmpty(returnUrl)) return Redirect(returnUrl); else return RedirectToAction("Index"); } catch { return View(); // Reshow this view, with errors } }
вы можете использовать перенаправление в представлении, как это:
<% if (!String.IsNullOrEmpty(Request.QueryString["returnUrl"])) %> <% { %> <a href="<%= Request.QueryString["returnUrl"] %>">Return</a> <% } %>
передайте параметр returnUrl (закодированный url) в изменить и логин действия и внутри перенаправить на этот данный returnUrl. Ваше действие входа может выглядеть примерно так:
public ActionResult Login(string returnUrl) { // Do something... return Redirect(returnUrl); }
в Mvc с помощью простого html в разделе С Java script onclick
<input type="button" value="GO BACK" class="btn btn-primary" onclick="location.href='@Request.UrlReferrer'" />
Это прекрасно работает. Надежда кому-то помогает.
@JuanPieterse уже ответил с помощью
@Html.ActionLink
Так что если кто-то может прокомментировать или ответить с помощью@Url.Action
Я использую .Net Core 2 MVC , и это сработало для меня, при использовании контроллера
HttpContext.Request.Headers["Referer"];
чтобы динамически построить returnUrl в любом представлении, попробуйте следующее:
@{ var formCollection = new FormCollection { new FormCollection(Request.Form), new FormCollection(Request.QueryString) }; var parameters = new RouteValueDictionary(); formCollection.AllKeys .Select(k => new KeyValuePair<string, string>(k, formCollection[k])).ToList() .ForEach(p => parameters.Add(p.Key, p.Value)); } <!-- Option #1 --> @Html.ActionLink("Option #1", "Action", "Controller", parameters, null) <!-- Option #2 --> <a href="/Controller/Action/@object.ID?returnUrl=@Url.Action(ViewContext.RouteData.Values["action"].ToString(), ViewContext.RouteData.Values["controller"].ToString(), parameters)">Option #2</a> <!-- Option #3 --> <a href="@Url.Action("Action", "Controller", new { object.ID, returnUrl = Url.Action(ViewContext.RouteData.Values["action"].ToString(), ViewContext.RouteData.Values["controller"].ToString(), parameters) }, null)">Option #3</a>
Это также работает на страницах макета, частичных представлениях и HTML-помощниках
по теме: MVC3 динамический URL-адрес возврата (то же самое, но из любого контроллера/действия)