Làm cách nào để chuyển hướng đến hành động trước đó trong ASP.NET MVC?


122

Giả sử rằng tôi có một số trang

  • some.web/articles/details/5
  • some.web/users/info/bob
  • some.web/foo/bar/7

có thể gọi một bộ điều khiển tiện ích chung như

locale/change/es hoặc là authorization/login

Làm thế nào để có được những phương pháp ( change, login) để chuyển hướng đến các hành động trước đó ( details, info, bar) trong khi đi qua các thông số trước với họ ( 5, bob, 7)?

Tóm lại: Làm cách nào để chuyển hướng đến trang mà tôi vừa truy cập sau khi thực hiện một hành động trong bộ điều khiển khác?

Câu trả lời:


156

thử:

public ActionResult MyNextAction()
{
    return Redirect(Request.UrlReferrer.ToString());
}

cách khác, chạm vào những gì darin đã nói, hãy thử điều này:

public ActionResult MyFirstAction()
{
    return RedirectToAction("MyNextAction",
        new { r = Request.Url.ToString() });
}

sau đó:

public ActionResult MyNextAction()
{
    return Redirect(Request.QueryString["r"]);
}

Chỉ là một gợi ý: bạn có thể sử dụng "Chuyển hướng" rõ ràng khó hơn để kiểm tra đơn vị bộ điều khiển của bạn. Thay vào đó, bạn nên sử dụng "RedirectToAction".
Syd

Tôi khuyên bạn nên sử dụng Request.Url.AbsolutePath.ToString()như AccountControllerLogOnphương pháp kiểm tra chứa cho đầu URL với '/'vv
Fulvio

1
@gotnull Request.Url.AbsolutePath sẽ chuyển hướng đến cùng một hành động. Mà không phải là đầu ra mong muốn. Chúng ta phải quay lại hành động cuối cùng thứ hai. Đối với điều đó chúng ta có thể viết: return Redirect (ControllerContext.HttpContext.Request.UrlReferrer.ToString ());
Rahatur

22
@nathanridley: Điều này không hoạt động đối với các yêu cầu ĐĂNG. Giả sử người dùng đang bật GET Indexsau đó GET Edit. URL giới thiệu sau đó là Indexnhưng khi người dùng thực hiện POST Editthì liên kết giới thiệu bây giờ là Edittừ yêu cầu GET trước đó. Làm cách nào để đảm bảo rằng tôi POST Editbiết URL đã giới thiệu người dùng đến GET Edit?
one.beat.consumer

UrlReferrer là NULL khi tôi đang ở trang nào đó và muốn xem, tôi biết là đã gặp lỗi chỉ bằng cách nhập URL vào thanh địa chỉ. Tại sao khi tôi nhập URL vào Thanh địa chỉ, nó không thể xác định UrlReferrer?
QMaster

46

Nếu bạn muốn chuyển hướng từ một nút trong Chế độ xem, bạn có thể sử dụng:

@Html.ActionLink("Back to previous page", null, null, null, new { href = Request.UrlReferrer})

28

Nếu bạn không quan tâm đến kiểm thử đơn vị thì bạn có thể chỉ cần viết:

return Redirect(ControllerContext.HttpContext.Request.UrlReferrer.ToString());

9

Một gợi ý cho cách làm điều này như vậy:

  1. url trả về vẫn tồn tại yêu cầu POST của biểu mẫu (và bất kỳ xác thực không thành công nào)
  2. url trả về được xác định từ url giới thiệu ban đầu
  3. mà không sử dụng TempData [] hoặc trạng thái phía máy chủ khác
  4. xử lý điều hướng trực tiếp đến hành động (bằng cách cung cấp chuyển hướng mặc định)

.

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
    }
}

Bạn có thể sử dụng chuyển hướng trong chế độ xem như sau:

<% if (!String.IsNullOrEmpty(Request.QueryString["returnUrl"])) %>
<% { %>
    <a href="<%= Request.QueryString["returnUrl"] %>">Return</a>
<% } %>

9

Trong Mvc sử dụng html thuần túy trong Xem trang với java script onclick

<input type="button" value="GO BACK" class="btn btn-primary" 
onclick="location.href='@Request.UrlReferrer'" />

Điều này hoạt động tốt. hy vọng sẽ giúp ai đó.

@JuanPieterse đã trả lời bằng cách sử dụng @Html.ActionLinknên nếu có thể ai đó có thể nhận xét hoặc trả lời bằng cách sử dụng@Url.Action


6

Chuyển một tham số returnUrl (được mã hóa url) cho các hành động thay đổiđăng nhập và chuyển hướng bên trong đến returnUrl đã cho này. Hành động đăng nhập của bạn có thể trông giống như sau:

public ActionResult Login(string returnUrl) 
{
    // Do something...
    return Redirect(returnUrl);
}

5

Tôi đang sử dụng .Net Core 2 MVC và cái này phù hợp với tôi, trong việc sử dụng bộ điều khiển HttpContext.Request.Headers["Referer"];


1

Bạn có thể quay lại trang trước bằng cách sử dụng thuộc ViewBag.ReturnUrltính.


1

Để tạo động returnUrl trong bất kỳ Chế độ xem nào, hãy thử cách này:

@{
    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>

Điều này cũng hoạt động trong Trang bố cục, Chế độ xem một phần và Trình trợ giúp Html

Liên quan: URL trả về động MVC3 (Giống nhau nhưng từ bên trong bất kỳ Bộ điều khiển / Hành động nào)


0

Đối với ASP.NET Core Bạn có thể sử dụng thuộc tính asp-route- *:

<form asp-action="Login" asp-route-previous="@Model.ReturnUrl">

Ví dụ chi tiết khác: Hãy tưởng tượng rằng bạn có một Bộ điều khiển phương tiện với các hành động

Mục lục

Chi tiết

Biên tập

và bạn có thể chỉnh sửa bất kỳ phương tiện nào từ Chỉ mục hoặc từ Chi tiết, vì vậy nếu bạn nhấp vào chỉnh sửa từ chỉ mục, bạn phải quay lại chỉ mục sau khi chỉnh sửa và nếu bạn nhấp vào chỉnh sửa từ chi tiết, bạn phải quay lại chi tiết sau khi chỉnh sửa.

//In your viewmodel add the ReturnUrl Property
public class VehicleViewModel
{
     ..............
     ..............
     public string ReturnUrl {get;set;}
}



Details.cshtml
<a asp-action="Edit" asp-route-previous="Details" asp-route-id="@Model.CarId">Edit</a>

Index.cshtml
<a asp-action="Edit" asp-route-previous="Index" asp-route-id="@item.CarId">Edit</a>

Edit.cshtml
<form asp-action="Edit" asp-route-previous="@Model.ReturnUrl" class="form-horizontal">
        <div class="box-footer">
            <a asp-action="@Model.ReturnUrl" class="btn btn-default">Back to List</a>
            <button type="submit" value="Save" class="btn btn-warning pull-right">Save</button>
        </div>
    </form>

Trong bộ điều khiển của bạn:

// GET: Vehicle/Edit/5
    public ActionResult Edit(int id,string previous)
    {
            var model = this.UnitOfWork.CarsRepository.GetAllByCarId(id).FirstOrDefault();
            var viewModel = this.Mapper.Map<VehicleViewModel>(model);//if you using automapper
    //or by this code if you are not use automapper
    var viewModel = new VehicleViewModel();

    if (!string.IsNullOrWhiteSpace(previous)
                viewModel.ReturnUrl = previous;
            else
                viewModel.ReturnUrl = "Index";
            return View(viewModel);
        }



[HttpPost]
    public IActionResult Edit(VehicleViewModel model, string previous)
    {
            if (!string.IsNullOrWhiteSpace(previous))
                model.ReturnUrl = previous;
            else
                model.ReturnUrl = "Index";
            ............. 
            .............
            return RedirectToAction(model.ReturnUrl);
    }
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.