2011-02-07 11 views
6

के बाद फ़ाइल डाउनलोड प्रारंभ करें मेरे आवेदन में मैं कुछ निर्यात डेटाबेस जानकारी के लिए उपयोगकर्ता को डाउनलोड करने के लिए एक ज़िप फ़ाइल बना रहा हूं। ज़िप फ़ाइल तब बनाई जाती है जब उपयोगकर्ता "डेटा उत्पन्न करें" बटन पर क्लिक करता है और मैं डेटाबेस में अनुरोध लॉग करता हूं।पोस्टबैक

मेरे पृष्ठ पर, मेरे पास एक ग्रिडव्यू है जो उपयोगकर्ता का डाउनलोड इतिहास दिखाता है और उन्हें एक निश्चित अवधि के लिए नवीनतम जेनरेट की गई फ़ाइल डाउनलोड करने की क्षमता भी प्रदान करता है।

जब मैं बटन पर क्लिक करता हूं तो समस्या यह है कि मैं पृष्ठ को रीफ्रेश करना चाहता हूं (इस प्रकार ग्रिडव्यू को रीफ्रेश करना और उनका नवीनतम अनुरोध दिखाना) और फिर उनके लिए फ़ाइल डाउनलोड शुरू करें (आईई, ऊपर लाएं संकेत दें और उन्हें तय करें कि इसे खोलना/सहेजना/रद्द करना है या नहीं)।

मैं एक पोस्ट बैक पर डाउनलोड शुरू करने में सक्षम हूं, लेकिन मेरा ग्रिडव्यू शुरू होने से पहले अपडेट नहीं हो रहा है, इसलिए यह सूची में नवीनतम अनुरोध नहीं दिखाता है। डाउनलोड प्रॉम्प्ट से पहले अपडेट करने के लिए ग्रिडव्यू कैसे प्राप्त किया जा सकता है?

मैं डाउनलोड शुरू करने के लिए निम्नलिखित का उपयोग कर रहा:

public void BeginDownload() 
    { 
     FileDownload download = InventoryService.GetLastThreeFileDownloads(this.EmployeeId).First(); 
     FileInfo fi = new FileInfo(Server.MapPath(SERVER_DOWNLOAD_PATH) + download.DownloadFileName); 

     Response.Clear(); 
     Response.ContentType = "application/zip"; 
     Response.AppendHeader("Content-Disposition", "attachment; filename=" + fi.Name); 
     Response.TransmitFile(fi.FullName); 
     Response.Flush(); 
    } 

विधि, अंतिम आइटम के रूप में Page_Load घटना में कहा जाता है एक छिपी हुई फ़ील्ड सच (जो मैं जब वे क्लिक करें स्थापित करने के लिए सेट किया गया है फाइल बनाने के लिए बटन)।

मैंने jQuery/AJAX कॉल के माध्यम से पृष्ठ को रीफ्रेश करने और कम सफलता के साथ डाउनलोड शुरू करने का भी प्रयास किया है। मैंने एक मोडल संवाद खोलने और डाउनलोड शुरू करने के लिए एक लिंक पर क्लिक करने के बारे में सोचा है और फिर मोडल बंद होने पर पृष्ठ को रीफ्रेश करें, लेकिन अगर मुझे कोई अन्य समाधान नहीं मिल रहा है तो यह अंतिम उपाय है।

किसी भी मदद की बहुत सराहना की जाती है!

उत्तर

2

बात यह है कि आप पृष्ठ को उपयोगकर्ता को वापस नहीं भेजते हैं। उपयोगकर्ता उस बटन पर क्लिक करता है, जो HTTP अनुरोध भेजता है, जिसके लिए आप फ़ाइल को डाउनलोड करने के लिए एक HTTP प्रतिक्रिया उत्पन्न करते हैं। अगर आप पृष्ठ को रीफ्रेश करना चाहते हैं और उसके बाद ही उसे फ़ाइल को डॉव nloaded, आपको एक सामान्य पोस्टबैक परिणाम भेजने की आवश्यकता है (BeginDownload विधि को कॉल नहीं करना), और फिर किसी भी तरह उसे अन्य अनुरोध करने के लिए मजबूर करें, जिस पर आप फ़ाइल के साथ जवाब देते हैं।

वहाँ विभिन्न विकल्प यहाँ हैं: के रूप में आप ने कहा

  • , पेज
  • पर meta refresh टैग शामिल एक ऑनलोड जावास्क्रिप्ट
  • का उपयोग एक iframe
  • का उपयोग करें ... या उपयोगकर्ता एक लिंक पर क्लिक करें ।

सभी तरीकों उनकी कमियां (विशेष रूप से IE के "अवांछित डाउनलोड" सुरक्षा है, जो, कुछ परिस्थितियों में, कष्टप्रद हो सकता है के बारे में सावधान रहना होगा), तो आप शायद कम से कम एक डाउनलोड लिंक डाउनलोड नहीं करता है के साथ "को शामिल करना चाहिए है स्वचालित रूप से प्रारंभ करें, यहां क्लिक करें "।)

+0

मैंने ग्रिडव्यू में एक डाउनलोड लिंक बनाया है, इसलिए यदि यह स्वयं शुरू नहीं होता है या वे गलती से रद्द करते हैं तो वे सर्वर पर संग्रहीत होने के बाद भी फ़ाइल डाउनलोड कर सकते हैं। सुझावों के लिए धन्यवाद, मैं निश्चित रूप से उनको देखता हूं और देखता हूं कि कौन सा सबसे अच्छा काम करता है। – Delebrin

1

ऐसा लगता है कि आप एक बार में बहुत अधिक करने की कोशिश कर रहे हैं। मैं फ़ाइल डाउनलोड करने के लिए एक नए, समर्पित पृष्ठ (या एशक्स हैंडलर) पर रीडायरेक्ट का उपयोग करके ग्रिडव्यू को अपडेट करने के लिए वापस पोस्ट करने का सुझाव देता हूं। जब आप डाउनलोड पेज/एएसएक्स हैंडलर में सामग्री-स्वभाव शीर्षलेख का उपयोग करते हैं तो ग्रिडव्यू पृष्ठ दृश्यमान रहना चाहिए।

+0

मैं सहमत हूं कि मैं शायद एक बार में बहुत अधिक कर रहा हूं। सुझाव के लिए धन्यवाद, मैं देखूंगा कि मैं क्या कर सकता हूं और फिर सबसे अच्छा काम करने के लिए यहां एक समाधान चुनें! – Delebrin

3

यहाँ कैसे मैं इसी तरह की कुछ समय पहले कुछ किया है:

  1. पोस्टबैक पर (डेटा उत्पन्न), gridview में नए डेटा से अद्यतन पेज वापस भेज देते हैं।
  2. जब पेज पूरा लोड हो रहा है और जो उत्पन्न फ़ाइल (window.location='fileurl'; की तरह कुछ का अनुरोध करता है एक छोटा सा जावास्क्रिप्ट समारोह जो कार्यान्वित जोड़ें। बेशक केवल पोस्टबैक पर इस जावास्क्रिप्ट समारोह भेजें।

दिखाया गया पृष्ठ की सामग्री नहीं है फ़ाइल का अनुरोध करते समय बदलें, यह आपके ब्राउज़र के सहेजने वाले संवाद को आसानी से पॉप अप करेगा।

+0

मैंने पहले एक टाइमर के साथ जावास्क्रिप्ट दृष्टिकोण देखा था, लेकिन जब आवश्यक हो तो मैंने केवल फ़ंक्शन को सीधे भेजने की कोशिश नहीं की थी। मैं इस विकल्प में जांच करूंगा। सलाह के लिये धन्यवाद! – Delebrin