2012-10-19 42 views
9

Tôi đang sử dụng Razor trên ASP.NET MVC với C#.Ngăn chặn nút quay lại

Tôi đang gọi một trang web bên ngoài để xử lý thẻ tín dụng và thẻ trả lại cho tôi. Sau đó tôi hiển thị một biên lai.

Tôi muốn ngăn họ quay trở lại màn hình trước đó.

Tôi không có trang cs cơ bản, như asp vì đây là các tệp .cshtml, để lấy sự kiện.

Trang biên nhận này là Chế độ xem nên tôi không thể đặt JavaScript trong tiêu đề vì nó sẽ ảnh hưởng đến mọi trang sử dụng nó.

Bất kỳ ai biết cách tôi ngăn nút quay lại trong trường hợp này?

+0

Đây sẽ là một đoạn mã javascript để thực hiện việc này. C# sẽ không có bất cứ điều gì để làm với nó, như C# là tất cả các phía máy chủ. Tôi chắc rằng bạn có thể tìm kiếm Stackoverflow cho câu trả lời cho điều này, mặc dù. [Edit: Tôi đã tìm kiếm cho bạn.] (Http://stackoverflow.com/search?q = ngăn chặn + back + nút + trình duyệt) – Gromer

+0

Ngoài ra, nếu bạn sử dụng các phần trong tệp Razor của mình, bạn có thể tiêm javascript vào trang từ một tệp xem một phần cụ thể của tệp Razor. Kiểm tra blog này để biết thêm thông tin: http://weblogs.asp.net/scottgu/archive/2010/12/30/asp-net-mvc-3-layouts-and-sections-with-razor.aspx – Gromer

+0

Có thể ' t scripting được vô hiệu hóa trên trình duyệt mà sẽ bỏ qua điều này? – ErocM

Trả lời

14

Một khả năng là loại trừ trang bạn không muốn quay lại từ bộ nhớ đệm trên máy khách. Điều này có thể được thực hiện bằng cách thiết lập các tiêu đề phản ứng thích hợp. Dưới đây là một ví dụ với bộ lọc hành động tùy chỉnh [NoCache] mà bạn có thể sử dụng để trang trí cho hành động điều khiển tương ứng.

+0

Hoàn hảo !! Cảm ơn nhiều! – ErocM

6

Thứ nhất, nếu trang trước đăng dữ liệu lên máy chủ, tốt nhất là Redirect(...) đến một hành động khác sau khi xử lý thành công, để tránh dữ liệu được gửi lại trên "Làm mới".

Sau đó, cũng thiết lập các trang hết hạn, vì vậy các nút quay lại không hoạt động:

https://stackoverflow.com/a/5352953/864763

+0

cảm ơn bạn, tôi cũng đã xem câu trả lời này! – ErocM

3

Bạn đang đặt ra câu hỏi sai. Đừng cố tắt "back" trên máy khách. Điều này sẽ được cam chịu thất bại; bạn có thể làm cho nó khó hơn, nhưng bạn sẽ không bao giờ thắng cuộc chiến đó. Thay vào đó, bạn nên viết lại trang cụ thể mà bạn có để nó sẽ chỉ xử lý thẻ tín dụng một lần. Bạn nên (trên máy chủ) "nhớ" rằng bạn đã xử lý thẻ tín dụng để nếu người dùng quay lại trang để gửi lại, bạn chỉ có thể cung cấp cho họ thông báo lỗi cho biết "bạn đã gửi thông tin này, bạn không thể gửi yêu cầu này hai lần ".

Bây giờ, có một số cách để hoàn thành mục tiêu chung này và một số cách tốt hơn các mục tiêu khác, nhưng đó là mục tiêu bạn cần phải phấn đấu.

Một cách để thực hiện việc này là chuyển đến mọi trang sẽ chuyển hướng người dùng đến biểu mẫu thẻ tín dụng này; ngay trước khi gửi yêu cầu, hãy thêm nội dung nào đó vào phiên của người dùng đó (ví dụ: "pendingCreditCardSubmission" = true) Sau khi họ gửi yêu cầu đó, bạn hãy kiểm tra biến phiên đó. Nếu đó là sự thật, hãy gửi yêu cầu và đặt nó thành false, nếu nó sai hoặc không có thì gửi thông báo lỗi cho người dùng.

+0

Ở đây; có một uppie trên một câu trả lời thực sự cũ! –

1

Đây là cách chúng tôi đã làm điều đó:

public class NoBackFilterAttribute : ActionFilterAttribute 
{ 
    public override void OnActionExecuting(ActionExecutingContext filterContext) 
    { 
     filterContext.HttpContext.Response.ExpiresAbsolute = DateTime.Now; 
     filterContext.HttpContext.Response.Expires = 0; 
     filterContext.HttpContext.Response.CacheControl = "no-cache"; 
     filterContext.HttpContext.Response.Buffer = true; 
     filterContext.HttpContext.Response.Cache.SetCacheability(HttpCacheability.NoCache); 
     filterContext.HttpContext.Response.Cache.SetExpires(DateTime.UtcNow); 
     filterContext.HttpContext.Response.Cache.SetNoStore(); 
     filterContext.HttpContext.Response.Cache.SetRevalidation(HttpCacheRevalidation.AllCaches); 
     if (!filterContext.HttpContext.Request.IsAjaxRequest() && filterContext.HttpContext.Request.HttpMethod != "POST" && !filterContext.Controller.ControllerContext.IsChildAction) 
     { 
      var after = filterContext.HttpContext.Request.RawUrl; 
      var session = GetSession(filterContext); 
      if (session["Current"] != null) 
      { 


       if (session["Before"] != null && session["Before"].ToString() == after) 
        filterContext.HttpContext.Response.Redirect(session["Current"].ToString()); 
       else 
       { 
        session["Before"] = session["Current"]; 
        session["Current"] = after; 
       } 
      } 
      else 
      { 
       session["Current"] = after; 
      } 
     } 
     base.OnActionExecuting(filterContext); 

    } 

    private HttpSessionStateBase GetSession(ActionExecutingContext context) 
    { 
     return context.HttpContext.Session; 
    } 

} 

Sau này bạn có thể thực hiện nó hoặc trong phạm vi tổng quát hoặc trong phạm vi điều khiển.

1

Đã lâu rồi kể từ khi được hỏi, nhưng bản sửa lỗi của tôi đã thêm [NoCache] phía trên lớp WebPageController.

[NoCache] 
public class WebPageController : Controller 
{ 
    public JsonResult JsonError(Exception exception) 
    { 
     if (exception == null) throw new ArgumentNullException("exception"); 

     Response.StatusCode = 500; 

     return new JsonResult 
     { 
      JsonRequestBehavior = JsonRequestBehavior.AllowGet, 
      Data = new 
      { 
       error = true, 
       success = false, 
       message = exception.Message, 
       detail = exception.ToString() 
      } 
     }; 
    } 
Các vấn đề liên quan