2012-01-05 34 views
7

Khi tôi bắt đầu đăng lại bằng __doPostBack, một tệp được tạo và quay lại người dùng để tải xuống trong HttpContext.Current.Response.Làm thế nào tôi có thể ngừng đăng lại từ làm mới trang tại máy khách

Bởi vì tôi thay đổi Response, trang bao gồm cả giá trị javascript của nó không được sửa đổi

Nhưng khi tôi không có tập tin đến đầu ra, trang web được làm mới (vì postback) và sửa đổi javascript trên trang là mất đi.

Làm cách nào để 'dừng' quá trình đăng lại tiếp tục và duy trì trang hiện tại của tôi? Tôi không thể sử dụng postback không đồng bộ, vì tôi cần đăng lại để cho phép người dùng tải xuống tệp.

EDIT: biết thêm sau khi một số câu hỏi trong các ý kiến:

  • Các tập tin được yêu cầu trong một yêu cầu webservice. Webservice cần để thực hiện truy vấn nặng để xác định xem tệp có được tạo hay không. Tôi thích điều này chỉ xảy ra một lần.
  • Người dùng có thể kéo/thả một số bộ lọc sẽ được sử dụng trong tệp yêu cầu. Nếu không có tệp nào, người dùng sẽ có thể thay đổi bộ lọc của mình, vì vậy đó là lý do tại sao trang không được thay đổi.
+1

Đầu tiên mà nói đến cái tâm của tôi là (không kiểm tra): sử dụng một nút ẩn như [PostbackTrigger] (http://msdn.microsoft .com/vi-us/library/system.web.ui.postbacktrigger.aspx) cho UpdatePanel của bạn. Trong trình xử lý serverside của bạn, nơi bạn đã tạo tệp (hoặc không) cho đến thời điểm này, hãy đăng ký javascript mà 'nhấp vào' nút này nếu bạn có tệp. Xử lý sự kiện này và phân phối tệp. Nếu không có tệp, không đăng ký tập lệnh. –

+0

Nó sẽ hoạt động, nhưng vấn đề của tôi là tập tin được yêu cầu từ một webservice. Tôi không biết nếu tôi sẽ có một tập tin cho đến khi yêu cầu được thực hiện. Với giải pháp của bạn, tệp sẽ được tạo hai lần. Một yêu cầu nặng nề của nó có thể mất một thời gian, vì vậy tôi không muốn làm điều đó hai lần. –

+1

Tại sao bạn cần tạo tệp để biết tệp đó có tồn tại không? Nghe có vẻ kỳ lạ. Tôi sẽ thêm một phương thức vào dịch vụ web của bạn để kiểm tra điều này mà không cần tạo. –

Trả lời

7

Từ các tiêu chuẩn W3 và RFC 2616:

10.2.5 204 Không có nội dung Các máy chủ đã hoàn thành các yêu cầu nhưng không cần phải trả lại một thực thể cơ thể, và có thể muốn quay trở lại cập nhật metainformation. Câu trả lời CÓ THỂ bao gồm mới hoặc cập nhật metainformation dưới dạng thực thể-tiêu đề, trong đó nếu hiện tại NÊN được liên kết với các biến thể yêu cầu.
Nếu ứng dụng khách là tác nhân người dùng, KHÔNG NÊN thay đổi chế độ xem tài liệu của tài liệu đó khiến cho yêu cầu được gửi đi. Phản hồi này là chủ yếu nhằm cho phép đầu vào cho các hành động diễn ra mà không cần gây ra thay đổi đối với chế độ xem tài liệu hoạt động của tác nhân người dùng, mặc dù bất kỳ thông tin mới hoặc được cập nhật nào được áp dụng cho tài liệu hiện tại trong chế độ xem đang kích hoạt của tác nhân người dùng. Phản hồi 204 PHẢI KHÔNG bao gồm nội dung thư và do đó luôn bị chấm dứt bởi dòng trống đầu tiên sau các trường tiêu đề.

Lưu ý dòng in đậm tại đây. Tôi đã không thử bản thân mình; tuy nhiên, thiết lập trạng thái HTTP là 204 và gửi lại tài liệu trống, thay vì cố gắng dừng hoàn toàn postback, chắc chắn là đáng để quay.

Chúc may mắn, tôi hy vọng điều này sẽ hữu ích.

EDIT: đây là mã mà hiện các trick:
System.Web.HttpContext.Current.Response.StatusCode = 204;

+0

Tuyệt vời .. hoạt động tuyệt vời! Chính xác câu trả lời cho câu hỏi của tôi mà không có bất kỳ giải pháp nào –

+0

Mã trạng thái HTTP để giải cứu! Tốt đẹp! –

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