2011-09-08 8 views
5

मेरे पास एक डैशबोर्ड है जो रिक्त/डिफ़ॉल्ट स्थिति में शुरू होता है। मैं उपयोगकर्ता को सहेजे गए राज्य को डैशबोर्ड में लोड करने की क्षमता दे रहा हूं। जब वे 'लागू करें' बटन पर क्लिक करें मैं निम्नलिखित कोड चलाएँ:पोस्टबैक के बाद रीफ्रेश पर फॉर्म पुनर्वितरण की पुष्टि के लिए संकेत दिया गया। मैं गलत तरीके से क्या कर रहा हूँ?

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 संपत्ति "AutoPostBack" गलत पर सेट है। मैंने ऑटोपोस्टबैक को गलत पर सेट किया है क्योंकि मैं क्लिक ईवेंट चलाने से पहले सत्यापन करना चाहता था। तो, अब, मैं क्लाइंट-साइड सत्यापन करता हूं और फिर बटन को चलाने के लिए क्लिक करता हूं।

रैडबटन 1 रैपिंग कोई अपडेट पैनल नहीं है। इस प्रकार, RadButton1_Click के बाद पूरे पृष्ठ पोस्ट। यह पृष्ठ की स्थिति को पार्स किए गए राज्य को 'लोड' करने का कारण बनता है।

इस बिंदु पर, यदि मैं पृष्ठ को रीफ्रेश करता हूं, तो Google क्रोम कहता है "कृपया फॉर्म पुनः सबमिट करने की पुष्टि करें।" मैंने इस बारे में पढ़ा है कि इसे कैसे घुमाया जाए, लेकिन मैं मूल कारण को ट्रैक करना चाहता हूं।

समाधान:

//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

किसी भी समय एक पृष्ठ पोस्ट फॉर्म द्वारा सबमिट किया जाता है, ब्राउज़र बटन (F5 या जो भी) के साथ पृष्ठ को रीफ्रेश करना आपको संकेत देगा। यह सामान्य व्यवहार है। आपको इसे छेड़छाड़ करना है क्योंकि मूल कारण सामान्य ब्राउज़र व्यवहार है जो कि प्रपत्रों को आकस्मिक पुन: जमा करने से रोकने के लिए है जो वास्तव में भुगतान जमा करने जैसे कुछ करते हैं। – Nikki9696

+0

मुझे लगता है कि अगर यह डेटा चुपचाप खराब हो जाता है तो चीजें घटित होती हैं। मुझे होने के बाद पोस्ट डेटा को साफ़ करने का एक तरीका ढूंढना होगा। मैं वर्तमान में पीआरजी के बारे में पढ़ रहा हूँ। –

उत्तर

10

जब आप ब्राउज़र को ताज़ा है, यह अंतिम अनुरोध तुमने फिर से भेजना होगा। यदि यह एक POST अनुरोध था (जैसे कि आप पोस्टबैक के मामले में करते हैं) तो यह जानकारी दोबारा पोस्ट करेगा लेकिन इसे करने से पहले आपको आपके द्वारा वर्णित चेतावनी संदेश दिखाई देगा।

इस समस्या से बचने का सबसे अच्छा तरीका पैटर्न लागू कर रहा है Post/Redirect/Get

पोस्ट/रीडायरेक्ट/प्राप्त करें (पीआरजी) वेब डेवलपर्स के लिए एक आम डिजाइन पैटर्न के लिए मदद करने के लिए कुछ डुप्लिकेट फ़ॉर्म सबमिशन से बचने और अनुमति देने के उपयोगकर्ता एजेंट है बुकमार्क और ताज़ा बटन के साथ अधिक सहजता से व्यवहार करें।

आम तौर पर लोग इसे लागू नहीं करते हैं (हालांकि हमें चाहिए) जब तक कि पुनः पोस्ट कुछ डेटा असंगतता न हो।

+0

अरे, इसलिए मैंने इसके बारे में कुछ पढ़ा, और मैं इसे लागू करने के तरीके पर उलझन में हूं। क्या आप इस के किसी भी एएसपी.NET AJAX उदाहरणों के बारे में जानते हैं? मैंने कुछ गुगलिंग किया, लेकिन अधिकांश बात वैचारिक है। मैं PageRequestManager के OnResponseEnd ईवेंट में जाने और पृष्ठ पर रीडायरेक्ट करने के बारे में सोच रहा था जब यह उचित स्थितियों का पता लगाता है। क्या यह उचित लगता है? –

+0

मैंने इसे आपके द्वारा प्रदत्त मूल्यवान जानकारी के उत्तर के रूप में चिह्नित किया है, लेकिन मैंने कुछ और जानकारी प्राप्त करने के प्रयास में चर्चा को एक नई पोस्ट में स्थानांतरित कर दिया है। धन्यवाद! –

+0

@ सेन एंडरसन: मैं थोड़ा उलझन में हूं। मुझे शायद आपका विचार बहुत अच्छा नहीं मिला। आपने कहा कि RadButton1 ने AJAX का उपयोग किए बिना पूरा पृष्ठ सबमिट किया है। इसलिए सुनिश्चित नहीं है कि अगर आप किसी भी AJAX बातचीत को शामिल नहीं कर रहे हैं तो आप PageRequestManager को शामिल करने का प्रयास क्यों करते हैं। –

0

जब आप ब्राउज़र को रीफ्रेश करते हैं, तो यह आपके द्वारा किए गए अंतिम अनुरोध को फिर से भेज देगा। यदि यह एक POST अनुरोध था (जैसे कि आप पोस्टबैक के मामले में करते हैं) तो यह जानकारी दोबारा पोस्ट करेगा लेकिन इसे करने से पहले आपको आपके द्वारा वर्णित चेतावनी संदेश दिखाई देगा।