2012-03-19 36 views
6

Tôi gặp sự cố với ứng dụng ASP.NET đơn giản và nút quay lại sau khi đăng lại.Trình duyệt ASP.NET hiển thị "trang web đã hết hạn" cho nút quay lại (sau khi đăng lại)

Trang được đề cập có biểu mẫu đơn giản trên đó, một số trường văn bản v.v. và một menu thả xuống thực hiện đăng lại (tự động khởi động lại).

Luồng "bình thường" là người dùng điền vào biểu mẫu và có thể thay đổi menu thả xuống. Dựa trên giá trị thả xuống, nội dung trang có thể thay đổi.

Sự cố tôi gặp phải là sau khi người dùng đã thay đổi menu thả xuống và đăng lại đã hoàn tất thì người dùng nhấp vào nút quay lại. Họ thấy thông báo "trang web đã hết hạn" từ IE.

tôi đã thiết lập như sau:

Response.Cache.SetExpires(DateTime.Now.AddMinutes(-1)); 
Response.Cache.SetCacheability(HttpCacheability.Private); 

Nhưng điều đó dường như không có đóng đinh vấn đề.

Tiêu đề phản ứng Cache-Control thực tế đọc như: private, no-cache: "Set-Cookie"

Trong một ứng dụng ASP cổ điển với một tiêu đề phản ứng Cache-Control chỉ nút quay lại "tin" hoạt động như mong đợi sau khi "đăng lại".

Có cách nào để buộc ASP.NET đặt bộ nhớ cache kiểm soát rõ ràng thành chính xác "riêng tư" không? Hoặc bất kỳ giải pháp nào khác dẫn đến nút quay lại và đăng lại hoạt động tốt cùng nhau?

Cảm ơn!

Trả lời

1

Những gì bạn đang xử lý thực sự là một vấn đề cũ. Về bản chất, lý do bạn thấy thông báo "trang web đã hết hạn" là một trong các kỹ thuật vô hiệu hóa nút "quay lại" đã được sử dụng. Kỹ thuật này đặt bộ nhớ cache thành một ngày trong quá khứ, do đó khiến trình duyệt hiển thị lỗi này nếu người dùng nhấp vào nút "quay lại".

Đó sẽ là dòng mã này:

Response.Cache.SetExpires(DateTime.Now.AddMinutes(-1)); 

Đây là một vấn đề, đặc biệt là với WebForms ASP.NET vì cách postback hoạt động, so với các khuôn khổ khác.

Để được giải thích kỹ lưỡng về tất cả các vấn đề liên quan, tôi khuyên bạn nên đọc bài viết được liên kết bên dưới. Nó không trả lời trực tiếp câu hỏi của bạn, nhưng tôi nghĩ bạn sẽ nhận được nhiều thông tin hơn câu trả lời đơn giản và sẽ giúp bạn suy nghĩ thông qua các lựa chọn của mình, được trang bị một sự hiểu biết tốt hơn về vấn đề này. Hãy chắc chắn để đọc phần 1 AND 2.

http://www.4guysfromrolla.com/webtech/111500-1.shtml

tôi có một ý tưởng về cách làm cho nút "trở lại" cư xử như một nút "trở lại" một lần nữa, để đăng lại không được đối xử như một Điều hướng trang:

Cá nhân, tôi đã áp dụng cách tiếp cận (được cho là đáng tin cậy/cẩu thả) chỉ cần đặt mọi thứ vào UpdatePanel khi tôi không muốn xung đột nút postbacl/back, vì tôi sử dụng Ajax trong hầu hết các ứng dụng của mình dù sao. Điều này buộc nút "quay lại" thực sự quay trở lại trang trước, thay vì staing trên cùng một trang, nhưng quay trở lại các giá trị điều khiển như trước khi postback.

+0

Nó làm cho ít ý nghĩa với tôi rằng một ứng dụng ASP cổ điển mà bộ hết -1 phút, bộ nhớ cache kiểm soát tin cho phép phía sau nút làm việc "như mong đợi", nhưng một ứng dụng ASP.NET với thời hạn thiết lập để -1 phút và bộ nhớ cache kiểm soát thiết lập để "tư nhân, no-cache: thiết lập cookie" không. Điều này với tôi dường như chỉ đến "no-cache: set cookie" là vấn đề. – user505765

+0

Tôi hiểu. Điểm khác biệt là ASP cổ điển không có hậu cảnh để tranh luận. Việc nhấp vào nút sẽ kích hoạt "Hành động" của biểu mẫu và mỗi lần tải trang hoàn toàn mới. Với ASP.NET, nếu bạn thay đổi một danh sách thả xuống, và danh sách thả xuống đó có "autopostback" được đặt thành true, thì trình duyệt thực sự xem đây là một điều hướng đến một trang mới. Đó là tất cả trong cách postbacks được thực hiện, đó là một nguồn liên tục của irtritation trong trường hợp như thế này. Về mặt kỹ thuật thay đổi một thả xuống đặt ra cho autompostback không kích hoạt "bài" tùy chọn về hình thức, nhưng WebForms mô hình làm mờ nó ... – David

+0

Có lẽ đây là một lời giải thích tốt hơn - Để trình duyệt, mỗi postback thực sự là một chuyến viếng thăm trang mới, và nó được lưu trữ trong lịch sử, mặc dù mô hình WebForms đã cố gắng để làm cho nó có vẻ như nó không phải là như vậy để các nhà phát triển. – David

2

Tùy thuộc vào một tình huống bạn có thể nhận được ngay với hack này/workaround:

private void Page_PreRender(object sender, System.EventArgs e) 
    { 
     if (IsPostBack && !IsCallback) 
     { 

      Response.Write("<html><head><script>location.replace('" + Request.Path + "');\n" + "</script></head><body></body></html>\n"); 

      Response.End(); 

     } 

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