2009-08-20 20 views
6

Tôi tương đối mới trên web & phát triển ASP.Net, vì vậy hãy chịu đựng tôi. Trong quá trình thử nghiệm các trang web của chúng tôi, tôi nhận thấy rằng nếu người dùng nhấp vào "Làm mới/Tải lại" và nhấp vào "Thử lại" khi được nhắc trên hộp thoại "Gửi lại thông tin", bất kỳ sự kiện nào đã được kích hoạt trước khi người dùng chọn để "Làm mới", sau đó sẽ được kích hoạt lại.
Ví dụ, chúng tôi có nút Nav "Trước" và "Tiếp theo" cho phép người dùng điều hướng qua một loạt câu hỏi. Nhà điều hành có nên nhấn "Refresh/Reload", nút Nav nào mà người dùng đã nhấn cuối cùng sẽ kích hoạt lại. Điều này thực sự làm cho một số ý nghĩa, nhưng hiệu ứng ròng là người dùng kết thúc trên trang tiếp theo hoặc trước đó mà từ đó ông đã được xem trước đây. Có một công việc xung quanh cho loại điều này?Làm mới/Nạp lại hiệu ứng phụ với ASP.net?

+0

Xem: http://stackoverflow.com/questions/743580/page-refresh-causes-duplicate-post-in-asp-net-applications – Shog9

Trả lời

4

Điều này là do cách bạn đang xử lý PostBacks.

Một nền chút là cần thiết:

Web là "quốc tịch", có nghĩa là mỗi yêu cầu từ một khách hàng đến một máy chủ độc lập với yêu cầu trước khi nó hoặc các yêu cầu sau khi nó. Không có "trạng thái" được duy trì. Nếu bạn nhìn vào cấp độ HTTP, nó chỉ đơn giản là một văn bản blob gửi đến máy chủ mà nói "gửi cho tôi thông tin này" và máy chủ gửi nó trở lại. Không có "Tôi là cùng một người dùng đã ở đây 3 phút trước và tôi muốn chuyển sang trang tiếp theo từ trang tôi đã đọc vào lần trước chúng tôi nói".

Cách ASP.NET giải quyết vấn đề này bằng cách sử dụng ViewState và postbacks. Mỗi khi bạn nhấp vào một nút ASP.NET, nó thực sự là gửi một biểu mẫu có một lĩnh vực ẩn với một loạt các dữ liệu được mã hóa. Dữ liệu đó chứa tất cả thông tin mà máy chủ cần "xây dựng lại" trạng thái của trang vì đây là lần cuối cùng. Sau đó, nó có thể thực hiện "di chuyển đến trang tiếp theo" và lệnh đó có ý nghĩa. Khi ASP.NET gửi HTML trở lại máy khách, nó sẽ cập nhật trường ẩn đó với dữ liệu mới, một lần nữa biểu diễn trạng thái của trang, vì nó là ngay bây giờ. Và lần sau khi bạn nhấp vào nút bất kỳ, dữ liệu sẽ được gửi lại, trang sẽ được xây dựng lại và chu kỳ lặp lại.

Khi người dùng nhấn "làm mới", trình duyệt sẽ hỏi họ xem họ có muốn gửi lại biểu mẫu không. Họ đang gửi lại cùng một dữ liệu mà họ đã làm trong thời gian qua.

Những gợi ý dành cho bạn:

Nếu bạn cố gắng để theo dõi bất kỳ dữ liệu về người dùng hoặc những gì họ đang làm một cách độc lập của ASP.NET ViewState, bạn sẽ cần phải chắc chắn rằng bạn đồng bộ hóa mà mỗi khi trang web quy trình.

Bạn có thể muốn giữ "trang hiện" trong ViewState:

ViewState.Add("CurrentPage", intCurrentPage); 

Vì vậy, khi bạn gọi handler MoveNext sự kiện, bạn có thể chắc chắn bạn đang di chuyển tương đối so với các trang như đây là lần cuối cùng nó đã được gửi cho khách hàng.

+0

Cảm ơn nhiều, rất hữu ích. –

1

Bạn có thể xem xét mẫu Đăng-Nhận-Chuyển hướng thường được sử dụng trong asp.net mvc.

Xem here để biết thêm chi tiết.

+0

Đó là một kỹ thuật tốt để giảm nhẹ việc gửi lại biểu mẫu thực tế, nhưng tôi không chắc liệu bạn nên sử dụng nó cho những gì cơ bản là mọi yêu cầu trong một ứng dụng WebForms có trạng thái cao. Điều đó làm tăng gấp đôi số lượng yêu cầu trong toàn bộ ứng dụng. –

+0

OP không đề cập gì về "rất nhà nước", nó chỉ là giả định của bạn và trừ khi anh ta có> 200 yêu cầu mỗi giây cơ sở hạ tầng của anh ta sẽ khó nhận thấy chuyến đi vòng thêm. Để thoát khỏi những hộp thoại và nguy hiểm của gửi lại nó cũng có giá trị công việc phụ. – redsquare

+0

Nếu bạn nhận thấy SO sử dụng kỹ thuật rất giống nhau. Tôi không thấy nhiều vấn đề về sự hoàn hảo ở đây và nó được tìm kiếm nhiều hơn một vài lần mỗi giây! – redsquare

Các vấn đề liên quan