2010-02-25 9 views
42

में प्रतिक्रिया के लिए फ़ाइलों को लिखने के बाद काम नहीं करता है मेरे पास क्या है?पोस्ट बैक एएसपी.NET

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

मुझे क्या चाहिए?

मैं चाहता हूं कि उपयोगकर्ता आवश्यक रेडियो बटन का चयन करके और बटन पर क्लिक करके एक से अधिक फाइलें डाउनलोड कर सके।

मुझे किस समस्या का सामना करना पड़ रहा है?

मैं पहली बार फ़ाइल को ठीक से डाउनलोड कर सकता हूं। लेकिन, डाउनलोड करने के बाद, अगर मैं कुछ अन्य फ़ाइल चुनता हूं और इसे डाउनलोड करने के लिए बटन पर क्लिक करता हूं, तो बटन की घटना पर क्लिक न करें और दूसरी फ़ाइल डाउनलोड नहीं की जाएगी।

protected void btnDownload_Click(object sender, EventArgs e) 
{ 
    string viewXml = exporter.Export(); 
    Response.Clear(); 
    Response.AddHeader("Content-Disposition", "attachment; filename=views.cov"); 
    Response.AddHeader("Content-Length", viewXml.Length.ToString()); 
    Response.ContentType = "text/plain"; 
    Response.Write(viewXml); 
    Response.End(); 
} 

मैं गलत यहाँ कुछ कर रहा हूँ:

मैं बटन क्लिक करें घटना पर निम्नलिखित कोड का उपयोग करें?

आईई 6, आईई 7 और क्रोम में एक ही समस्या को दोहराया जा सकता है। मुझे लगता है कि यह समस्या ब्राउज़र स्वतंत्र है।

+0

यदि आप अजाक्स सक्षम फॉर्म (या नियंत्रण) पर हैं तो यह हो सकता है कि अजाक्स जावास्क्रिप्ट मिश्रित हो या अवरुद्ध हो क्योंकि आपने जावास्क्रिप्ट की अपेक्षा करने के बजाय एक अलग दस्तावेज़ लौटाया है (कुछ व्यूस्टेट जानकारी और अद्यतन एचटीएमएल जो अंदर जाता है अद्यतन पैनेल)। यह भी देखें http://social.msdn.microsoft.com/Forums/en-US/sharepointdevelopment/thread/55136e4e-e1f7-4a79-9b75-be09cd5594c2/ –

उत्तर

55

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

वेबपर्ट में आपके बटन पर ऑनक्लिएंट पृष्ठ पर अपने जावास्क्रिप्ट में एक फ़ंक्शन पर क्लिक करें।

<asp:Button ID="generateExcel" runat="server" Text="Export Excel" 
OnClick="generateExcel_Click" CssClass="rptSubmitButton" 
OnClientClick="javascript:setFormSubmitToFalse()" /> 

फिर जावास्क्रिप्ट में मेरे पास यह कार्य है।

function setFormSubmitToFalse() { 
    setTimeout(function() { _spFormOnSubmitCalled = false; }, 3000); 
    return true; 
} 

मुझे मिला 3 सेकंड पॉज़ आवश्यक था क्योंकि अन्यथा मैं शेयरपॉइंट सेट करने से पहले चर सेट कर रहा था। इस तरह मैंने शेयरपॉइंट को सामान्य रूप से सेट करने दिया, फिर मैंने इसे बाद में गलत पर सेट कर दिया।

+0

मुझे अतीत में जानकारी की इस जानकारी को पता था, लेकिन मैं पूरी तरह से भूल गया। मुझे याद दिलाने के लिए मुझे घंटे बचाने के लिए धन्यवाद। – DaleyKD

+0

मेरे शेयरपॉइंट दस्तावेज़ लाइब्रेरी> दस्तावेज़ डाउनलोड समस्या के लिए एक आकर्षण की तरह काम किया। शाबास!!! – shoab

4

ऑफहैंड, आप जो कर रहे हैं वह काम करना चाहिए। मैंने अतीत में सफलतापूर्वक ऐसा ही किया है, हालांकि मैंने दोहराना और लिंकबटन का उपयोग किया था।

केवल एक चीज मुझे लगता है कि अलग है देख सकते हैं कि आप Response.Write() उपयोग कर रहे हैं बल्कि Response.OutputStream.Write() से, और आप बल्कि द्विआधारी से पाठ लिख रहे हैं कि, लेकिन दिया ContentType आपके द्वारा निर्दिष्ट, यह एक समस्या नहीं होनी चाहिए है। इसके अतिरिक्त, मैं जानकारी भेजने से पहले Response.ClearHeaders() पर कॉल करता हूं, और Response.Flush() बाद में (Response.End() पर कॉल करने से पहले)।

यदि यह मदद मिलेगी, यहाँ क्या मेरे लिए अच्छी तरह से काम का एक स्वच्छ संस्करण है:

// called by click handler after obtaining the correct MyFileInfo class. 
private void DownloadFile(MyFileInfo file) 
{ 
    Response.Clear(); 
    Response.ClearHeaders(); 
    Response.ContentType = "application/file"; 
    Response.AddHeader("Content-Disposition", "attachment; filename=\"" + file.FileName + "\""); 
    Response.AddHeader("Content-Length", file.FileSize.ToString()); 
    Response.OutputStream.Write(file.Bytes, 0, file.Bytes.Length); 
    Response.Flush(); 
    Response.End();   
} 

आप एक द्विआधारी तरह से फ़ाइल स्थानांतरित, शायद System.Text.Encoding.ASCII.GetBytes(viewXml); बुला और उस के परिणाम में उत्तीर्ण होकर विचार कर सकते हैं Response.OutputStream.Write() पर।

थोड़ा अपने कोड संशोधित:

protected void btnDownload_Click(object sender, EventArgs e) 
{ 
    string viewXml = exporter.Export(); 
    byte [] bytes = System.Text.Encoding.ASCII.GetBytes(viewXml); 
    // NOTE: you should use whatever encoding your XML file is set for. 
    // Alternatives: 
    // byte [] bytes = System.Text.Encoding.UTF7.GetBytes(viewXml); 
    // byte [] bytes = System.Text.Encoding.UTF8.GetBytes(viewXml); 

    Response.Clear(); 
    Response.ClearHeaders(); 
    Response.AddHeader("Content-Disposition", "attachment; filename=views.cov"); 
    Response.AddHeader("Content-Length", bytes.Length.ToString()); 
    Response.ContentType = "application/file"; 
    Response.OutputStream.Write(bytes, 0, bytes.Length); 
    Response.Flush(); 
    Response.End(); 
} 
+0

धन्यवाद, रैंडोल्फो। बदले गए कोड के साथ कोई भाग्य भी नहीं। यह वही व्यवहार कर रहा है :( – Vijay

+0

हम्म ... अच्छा, मैं स्टंप हो गया हूं। जैसे मैंने कहा, मैंने क्या ठीक काम किया है। क्या यह संभव है कि आप क्लिक हैंडलर कहने से पहले अपने कोड में ऐसा कुछ करते हैं? यदि आप कर सकते हैं, पूरे पृष्ठ और कोड-पीछे पोस्ट करने का प्रयास करें। – Randolpho

+0

'Response.ClearHeaders()' मेरे मामले में महत्वपूर्ण लग रहा था। धन्यवाद रैंडोल्फो –

3

निकालें Response.End() और प्रतिक्रिया ASP.NET पारिस्थितिकी तंत्र के भीतर स्वाभाविक रूप से खत्म करते हैं।

यदि यह काम नहीं करता है, तो मैं बटन को अलग <form> में डालने की सलाह दूंगा और आवश्यक डेटा को एक अलग HTTP हैंडलर पर पोस्ट करूंगा। एक वेब पेज के बजाय एक्सएमएल निर्यात करने के लिए HTTP हैंडलर सेटअप करें।

+0

प्रारंभ में मैंने 'Response.End() 'शामिल नहीं किया था। यह तब काम नहीं कर रहा था ठीक है! – Vijay

+1

हम्म। ठीक है, हो सकता है कि आप बटन को अलग '

' में डालने का प्रयास कर सकें और आवश्यक डेटा को एक अलग HTTP हैंडलर पर पोस्ट कर सकें जो एक्सएमएल निर्यात करने के लिए सेटअप है? –

+0

इसके अलावा, आपको एक प्रतिक्रिया एन्कोडिंग निर्दिष्ट करना चाहिए जैसे 'प्रतिक्रिया .ContentEncoding = Encoding.UTF8' –

4

Response.End को हटाए बिना ऐसा करने का एक आसान तरीका पृष्ठ रीफ्रेश करने के लिए क्लाइंट-साइड जेएस जोड़ना है। अपने बटन की onclientclick संपत्ति में जेएस जोड़ें।

उदा।

onclientclick="timedRefresh(2000)" 

then in your html.. 

    <script type="text/JavaScript"> 
    <!-- 
    function timedRefresh(timeoutPeriod) { 
     setTimeout("location.reload(true);",timeoutPeriod); 
    } 
    // --> 

3

मुझे एक ही समस्या थी। बटन पर सरल Response.Writer ("") करने के लिए फ़ंक्शन एएसपीएक्स पेज पर क्लिक करें कभी भी फायरिंग नहीं था। कक्षा में

विधि:

public test_class() 
{ 
    public test_class() { } 

    public static void test_response_write(string test_string) 
    { 
     HttpContext context = HttpContext.Current; 
     context.Response.Clear(); 
     context.Response.Write(test_string); 
     context.Response.End();     
    } 
} 

ASPX पृष्ठ:

protected void btn_test_Click(object sender, EventArgs e) 
{ 
    test_class.test_response_write("testing...."); 
} 

जब मैं कारण खोजने की कोशिश कर रहा था, मैं सिर्फ Page_Load घटना यह काम किया पर एक ही समारोह कहा जाता है।

protected void Page_Load(object sender, EventArgs e) 
{ 
    if (!IsPostBack) 
    { 
     test_class.test_response_write("testing...."); 
    } 
} 

मुद्दा मुझे पता चला कि कि aspx पेज के शरीर के मास्टर पृष्ठ <asp:UpdatePanel> के तहत किया गया जांच।

मैंने इसे हटा दिया, और यह Button_Click ईवेंट पर काम किया। मैं आपको यह भी जांचने की सलाह दूंगा।

संबंधित मुद्दे