2009-05-02 11 views
95

Cho phép giả định rằng tôi có một số trangLàm cách nào để chuyển hướng đến hành động trước đó trong ASP.NET MVC?

  • 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 phổ biến như

locale/change/es hoặc 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 tác vụ trong bộ điều khiển khác?

Trả lời

121

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ử này:

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

thì:

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

Đóng. Tôi đã sử dụng Trả lại chuyển hướng (Request.UrlReferrer.ToString()); – adolfojp

+0

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

+0

Tôi khuyên bạn nên sử dụng 'Request.Url.AbsolutePath.ToString()' làm phương thức 'LogOn' của' AccountController' chứa các kiểm tra bắt đầu của URL bằng ''/'', v.v. – fuzz

6

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

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

Đề xuất về cách thực hiện việc này uch rằng:

  1. url trở lại sống sót theo yêu cầu của một hình thức POST (và quy trình kiểm soát thất bại)
  2. url trở lại được xác định từ url giới thiệu ban đầu
  3. mà không sử dụng TempData [] hoặc tiểu bang server-side 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 quan điểm như thế này:

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

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

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

Nếu bạn muốn chuyển hướng 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}) 
6

Trong MVC sử dụng đồng bằng html trong Xem trang với kịch bản java onclick

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

này hoạt động tuyệt vời. hy vọng giúp ai đó.

@JuanPieterse đã trả lời bằng các @Html.ActionLink vì vậy nếu có thể một người nào đó có thể bình luận hoặc trả lời bằng @Url.Action

1

Bạn có thể quay trở lại trang trước đó bằng cách sử dụng ViewBag.ReturnUrl tài sản.

1

Để động xây dựng ReturnURL trong bất kỳ View, thử điều 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/@[email protected](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> 

này cũng hoạt động trong Layout Pages, phần xem và Html Helpers

liên quan: MVC3 Dynamic Return URL (Tương tự nhưng từ trong bất kỳ Bộ điều khiển/Hành động nào)

1

Tôi đang sử dụng .Net Core 2 MVC và phiên bản này hoạt động với tôi, trong controlle r sử dụng HttpContext.Request.Headers["Referer"];