2009-01-26 8 views
6

Tôi có một ứng dụng web (ASP.Net 3.5) với thiết kế 3 lớp thông thường. Nếu người dùng nhấp vào một nút một postback xảy ra, một số mã lớp trung và dữ liệu chạy, và màn hình được làm mới. Nếu người dùng nhấp vào nút nhiều lần trước khi postback đầu tiên được hoàn thành logic của tôi bị nhầm lẫn và ứng dụng có thể kết thúc ở trạng thái không hợp lệ. Cách tốt nhất để ngăn chặn điều này là gì?Làm cách nào để ngăn việc đăng lại lặp lại gây khó hiểu cho lớp kinh doanh của tôi

Tôi có thể sử dụng javascript để tắt nút nhưng điều này chỉ ẩn vấn đề. Làm cách nào để xây dựng các lớp dữ liệu và doanh nghiệp của tôi để xử lý vấn đề này?

+0

Tôi đã hỏi một số điều tương tự trong khi quay lại ... http://stackoverflow.com/questions/305684/how-can-i-prevent-database-being-written-to-again-when-the-browser -oes-a-reload – Marty

Trả lời

2

Ba phương pháp phổ biến nhất (mà thường được sử dụng song song) là:

  1. Disable submit buttons một lần nhấp/ép;
  2. Sử dụng POST+REDIRECT+GET để tránh các sự cố về nút quay lại; và
  3. Replace history in the browser để bạn không thể quay lại (nhưng điều này nên được sử dụng một cách tiết kiệm và có lý do chính đáng).
1

Nếu tôi trung thực thành thật, tôi sẽ nói rằng bạn có vẻ như bạn là người bối rối về đăng lại trên web chứ không phải ứng dụng của bạn (đó là nếu bạn là người viết). ;-)

Điều đó nói rằng, ngoài các đề xuất khác, điều tôi sẽ làm trong trường hợp này là đặt "mã thông báo" vào trường ẩn trong biểu mẫu - như GUID - được đăng lại. Sử dụng điều này để theo dõi công việc đang được thực hiện và chỉ cho phép nó được sử dụng một lần. Ví dụ. khi đăng lại, hãy đặt nó trong bộ nhớ phiên. Mỗi lần đăng lại được thực hiện kiểm tra phiên đầu tiên cho mã thông báo này, và nếu nó ở đó thì không làm gì cả. Nếu nó KHÔNG ở đó, hãy cất giữ nó trong phiên làm việc. Khi phiên kết thúc, mã thông báo được bỏ đi tự động. Dễ dàng. Tốt hơn nhiều so với một số mã thông báo cơ sở dữ liệu phức tạp.

  • Oisin
+0

Tôi đang làm một cái gì đó rất giống với memcached cho các mã thông báo. Bao gồm GUID như một trường ẩn trên biểu mẫu, sau đó khi nó được đăng, hãy thử thêm nó vào memcached. Nếu việc thêm không thành công, nó đã được thêm vào, do đó, không làm gì cả. Các phím hết hạn sau một thời gian ngắn, và memcached không đáng tin cậy, nhưng tôi đã thực hiện chuyển hướng sau khi đăng bài và chỉ cần một cái gì đó để xử lý thỉnh thoảng nhấp đúp vào buttun gửi (thường là do các ông chủ lớn ...) –

0
  1. Do vô hiệu hóa nút gửi một lần nhấp. Điều này sẽ ngăn tình cờ nhấp đúp hoặc nhiều hơn
  2. Tôi thường chuyển hướng đến URL khác sau khi đăng lại để tránh làm mới trang ngẫu nhiên/cố ý.
  3. Cuối cùng trong phương thức chèn DB, kiểm tra dữ liệu giống hệt được chèn trong khung thời gian nhất định (có thể là vài giây) trước khi thực hiện chèn. Nếu dữ liệu trùng lặp được tìm thấy được chèn vào chỉ trong vài giây (hoặc phút. Bất kỳ điều gì có ý nghĩa nhất trong tình huống của bạn), hãy hiển thị thông báo cảnh báo và yêu cầu người dùng nhấn lại nếu người dùng cảm thấy đó không phải là lỗi. (Phương pháp này có ý nghĩa nhất khi bạn có tài khoản người dùng và người dùng đang gửi dữ liệu khi đăng nhập, do đó, kiểm tra dữ liệu trùng lặp được thực hiện cho người dùng.)
0

tôi đã giải quyết được vấn đề viết một javascript vô hiệu hóa các nút chức năng nhấp chuột:

MyButton.Attributes.Add("onclick", 
    "javascript:this.onclick=function(){return false;};"); 
0

Chúng tôi đã nhìn thấy tất cả các trang web mà vô hiệu hóa "submit" nút khi bạn bấm vào chúng. Điều này thường được thực hiện để ngăn người dùng nhấp vào nút nhiều lần. Thông thường, điều này được thực hiện bằng cách sử dụng sự kiện JavaScript 'onclick' để tắt nút. Trong ASP.NET, mỗi mục phía máy chủ đã có một trình xử lý sự kiện onclick gọi máy chủ trở lại để xử lý sự kiện. Để thực hiện điều tương tự trong ASP.NET, bạn có thể dễ dàng làm:

btnSubmit.Attributes.Add("onclick", "this.disabled=true;" + GetPostBackEventReference(btnSubmit).ToString()); 

đâu btnSubmit 'là tên của nút trong câu hỏi. Điều gì xảy ra ở đây là chúng ta tạo ra một sự kiện onclick thực hiện hai điều. Thứ nhất, nó vô hiệu hóa nút trong trình duyệt của người dùng. Điều thứ hai nó làm là gửi sự kiện postback bình thường đến máy chủ.

0

Thậm chí tôi có cùng một vấn đề mà tôi đã giải quyết như dưới đây.

Sau khi tải lên tệp Nếu bạn chuyển hướng đến same page hoặc some other page in your project thì vấn đề này sẽ tránh được.

Ví dụ:

Trong ASPX My

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="WebForm.aspx.cs" Inherits="WebApplication.WebForm" %> 

<!DOCTYPE html> 
<html xmlns="http://www.w3.org/1999/xhtml"> 
<head runat="server"> 
    <title></title> 
</head> 

<body> 
    <form id="form1" runat="server"> 
     <div> 
      <asp:FileUpload ID="FileUpload1" runat="server" /> 
      <asp:Button ID="Button1" runat="server" OnClick="Button1_Click" Text="Button" /> 
     </div> 
    </form> 
</body> 
</html> 

Thậm chí tôi đã nhận cùng một vấn đề tôi đã giải quyết như dưới đây.

Sau khi tải tệp lên Nếu bạn chuyển hướng đến cùng một trang hoặc một số trang khác trong dự án của bạn. Sau khi phản hồi chuyển hướng sẽ không có ở đó khi bạn đã chuyển hướng.

Trong ASPX My

Trong C của tôi thơ ca ngợi Đằng sau

public partial class WebForm : System.Web.UI.Page 
    { 
     protected void Page_Load(object sender, EventArgs e) 
     { 

     } 

     protected void Button1_Click(object sender, EventArgs e) 
     { 
      string path = Server.MapPath("~"); 
      path = path + FileUpload1.FileName; 
      FileUpload1.SaveAs(path); 
      Response.Redirect("WebForm.aspx"); // Responce will be cleared. This Redirection will do the Trick 
      //Put the debugger and check it will work 
     } 
    } 

Ở đây, để hiển thị sự thành công và thông báo lỗi cố gắng sử dụng phiên.