2011-09-08 6 views
5

Tôi có trang tổng quan bắt đầu ở trạng thái trống/mặc định. Tôi cho người dùng khả năng tải trạng thái đã lưu vào trang tổng quan. Khi họ nhấp vào nút 'Áp dụng', tôi chạy mã sau:Đã nhắc gửi lại biểu mẫu xác nhận khi làm mới sau khi đăng lại. Tôi đang làm gì sai?

function CloseAndSave() { 
    var radUpload = $find(radUpload1ID); 
    var inputs = radUpload.getFileInputs(); 

    if (inputs[0].value.length == 0) { 
     alert('Please select a dashboard to upload.'); 
     return; 
    } 

    if(!radUpload.isExtensionValid(inputs[0].value)) { 
     alert('Please select an XML file.'); 
     radUpload.clearFileInputAt(0); 
     return; 
    } 

    oWindow = null; 
    __doPostBack(radButton1ID); 
} 

protected void RadButton1_Click(object sender, EventArgs e) 
{ 
    if (RadUpload1.UploadedFiles.Count > 0) 
    { 
     UploadedFile dashboardXMLFile = RadUpload1.UploadedFiles[0]; 

     SerializableDictionary<string, string> dataToLoad = new SerializableDictionary<string, string>(); 
     XmlSerializer xmlSerializer = new XmlSerializer(dataToLoad.GetType()); 

     using (StreamReader reader = new StreamReader(dashboardXMLFile.InputStream)) 
     { 
      dataToLoad = (SerializableDictionary<string, string>)xmlSerializer.Deserialize(reader); 
     } 

     foreach (var entry in dataToLoad) 
     { 
      string sessionKey = entry.Key; 

      if (!string.IsNullOrEmpty(entry.Value)) 
      { 
       Type type = StateManager.GetTypeFromStateName(sessionKey); 

       byte[] data = Convert.FromBase64String(entry.Value); 
       using (MemoryStream memoryStream = new MemoryStream(data)) 
       { 
        xmlSerializer = new XmlSerializer(type); 
        SessionRepository.Instance.SetSession(sessionKey, xmlSerializer.Deserialize(memoryStream)); 
       } 
      } 
     } 
    } 
} 

RadButton1 có thuộc tính "Tự động khôi phục" được đặt thành sai. Tôi đã đặt AutoPostBack thành false vì tôi muốn thực hiện xác thực trước khi chạy sự kiện nhấp chuột. Vì vậy, bây giờ, tôi thực hiện xác nhận phía máy khách và sau đó cho phép bấm nút để chạy.

Không có bảng cập nhật gói RadButton1. Như vậy, toàn bộ trang đăng bài sau RadButton1_Click. Điều này làm cho trạng thái của trang 'tải lên' trạng thái được phân tích cú pháp.

Tại thời điểm này, nếu tôi làm mới trang, Google Chrome sẽ nói "Vui lòng xác nhận gửi lại biểu mẫu". Tôi đã đọc về làm thế nào để squelch này, nhưng tôi muốn theo dõi nguyên nhân gốc rễ.

Giải pháp:

//This changes the response to a GET instead of a POST. Prevents the 'Form Resubmission' dialog. 
Page.Response.Redirect(Page.Request.Url.ToString(), true); 
+0

Bất kỳ lúc nào một trang được gửi bằng biểu mẫu POST, làm mới trang bằng nút trình duyệt (F5 hoặc bất kỳ thứ gì) sẽ (nhắc) nhắc bạn. Đó là hành vi bình thường. Bạn phải ép nó bởi vì nguyên nhân gốc rễ là hành vi trình duyệt thông thường có nghĩa là để ngăn chặn việc gửi lại các biểu mẫu ngẫu nhiên mà thực sự LÀM một cái gì đó chẳng hạn như gửi một khoản thanh toán. – Nikki9696

+0

Tôi nghĩ rằng nếu dữ liệu này gửi lại âm thầm những điều xấu sẽ xảy ra. Tôi cần tìm cách xóa dữ liệu POST sau khi nó xảy ra. Tôi đang đọc về PRG hiện tại. –

Trả lời

10

Khi bạn làm mới trình duyệt, nó sẽ gửi lại yêu cầu cuối cùng bạn đã làm. Nếu đó là một yêu cầu POST (như bạn làm trong trường hợp postback) thì nó sẽ đăng lại thông tin nhưng trước khi thực hiện nó, bạn sẽ thấy thông báo cảnh báo mà bạn mô tả.

Cách tốt nhất để tránh vấn đề này đang triển khai mô hình Post/Redirect/Get

Post/Redirect/Nhận (PRG) là một mẫu thiết kế chung cho các nhà phát triển web để giúp tránh một số hình thức đệ trình trùng lặp và cho phép các đại lý người dùng cư xử trực quan hơn với dấu trang và nút làm mới.

Thông thường mọi người không thực hiện điều này (mặc dù chúng tôi nên) trừ khi bài đăng lại có thể gây ra một số dữ liệu không thống nhất.

+0

Hey, vì vậy tôi đã làm một số đọc về điều này, và tôi đang bối rối về cách thực hiện nó. Bạn có biết về bất kỳ ví dụ ASP.NET AJAX nào về điều này không? Tôi đã làm một chút của Googling, nhưng hầu hết các cuộc nói chuyện là khái niệm. Tôi đã nghĩ đến việc tham gia sự kiện OnResponseEnd của PageRequestManager và chuyển hướng đến trang khi nó phát hiện các điều kiện thích hợp. Điều này có hợp lý không? –

+0

Tôi đã đánh dấu đây là câu trả lời cho thông tin có giá trị mà bạn đã cung cấp, nhưng tôi đã chuyển cuộc thảo luận sang bài đăng mới trong một nỗ lực để nhận thêm một số thông tin. Cảm ơn bạn! –

+0

@Sean Anderson: Tôi hơi bối rối. Tôi có lẽ đã không nhận được rất tốt ý tưởng của bạn. Bạn nói rằng RadButton1 đã gửi toàn bộ trang mà không cần sử dụng AJAX. Vì vậy, không chắc chắn lý do tại sao bạn cố gắng liên quan đến PageRequestManager nếu yêu cầu không liên quan đến bất kỳ tương tác ajax nào. –

0

Khi bạn làm mới trình duyệt, trình duyệt sẽ gửi lại yêu cầu cuối cùng bạn đã thực hiện. Nếu đó là một yêu cầu POST (như bạn làm trong trường hợp postback) thì nó sẽ đăng lại thông tin nhưng trước khi thực hiện nó, bạn sẽ thấy thông báo cảnh báo mà bạn mô tả.