2015-12-11 2 views
18

आवश्यकताओंएक अद्यतन पैनल के अंदर सर्वर पर स्वचालित फ़ाइल अपलोड करने के लिए पहली बार काम नहीं करता है

मैं एक फ़ाइल अपलोड करने की कोशिश कर रहा हूँ के रूप में जल्द ही एक उपयोगकर्ता यह चयन करता है के रूप में। मुझे निम्नलिखित आवश्यकताओं को पूरा करना होगा:

  1. बटन एप्लिकेशन में अन्य बटनों की तरह दिखता है।
  2. जैसे ही उपयोगकर्ता इसे चुनता है फ़ाइल अपलोड हो जाती है।
  3. मुझे इसे अपडेटपेनल में होना चाहिए क्योंकि मुझे पृष्ठ पर सशर्त अपडेट करना है। I चयनित फ़ाइल पर एक पूर्ण पोस्टबैक करें (a.k.a onchange) ईवेंट।

वर्तमान कोड

के बाद कैसे मेरे विचार फ़ाइल लग रहा है:

<asp:UpdatePanel ID="upData" UpdateMode="Conditional" runat="server"> 
    <ContentTemplate> 

    <div style="width: auto; float: right;"> 

    <asp:Button ID="btnFileImportSkin" CssClass="ButtonSkin AddButton" Text="Import" Style="position: absolute; z-index: 2;" runat="server" OnClientClick="Javascript:onImport(); return false;" /> 
    <asp:FileUpload ID="fileImport" Visible="false" Style="position:relative; opacity:0;" runat="server" onchange="Javascript:onFileSelected();" /> 
      <%-- onchange="Javascript:this.form.submit();" /> --%> 
      <%-- <asp:Button ID="btnUpload" runat="server" OnClientClick="Javascript:alert('Uploading...'); __doPostBack('<%= btnUpload.ID %>', ''); return false;" /> --%> 
    <asp:Button ID="btnUpload" OnClick="btnUpload_Click" runat="server" /> 
    </div> 

    </ContentTemplate> 
    <Triggers> 
     <asp:PostBackTrigger ControlID="btnUpload" /> 
    </Triggers> 
</asp:UpdatePanel> 

प्रासंगिक जावास्क्रिप्ट:

<script type="text/javascript"> 
    function onImport() { 
     var fileImportClientId = '<%= fileImport.ClientID %>'; 
     document.getElementById(fileImportClientId).click(); 
    } 

    function onFileSelected() { 
     alert("File Selected"); 
     // I have tried calling the function directly and with a timeout 
     setTimeout(onUpload, 20); 
    } 

    function onUpload() { 
     var btnUploadClientId = '<%= btnUpload.ClientID %>'; 
     document.getElementById(btnUploadClientId).click(); 
    } 
</script> 

कोड के पीछे:

protected void btnUpload_Click(object sender, EventArgs e) 
{ 
    // PostedFile is null first time code gets here on user selecting a file 
    if (fileImport.PostedFile != null) 
    { 
     if (fileImport.PostedFile.FileName.Length > 0) 
     { 
      ImportFromFile(); 
     } 
    } 
} 

स्पष्टीकरण/फ्लो

  1. उपयोगकर्ता btnFileImportSkin बटन पर क्लिक करता है।
  2. फ़ंक्शन onImport कहा जाता है, जो fileimport बटन पर प्रोग्रामेटिक रूप से क्लिक करता है।
  3. उपयोगकर्ता एक फ़ाइल का चयन करता है, और ओपन दबाता है।
  4. onFileSelected कहा जाता है।
  5. onUpload सफलतापूर्वक कहा जाता है।
  6. btnUpload_Click सफलतापूर्वक हर बार बुलाया जाता है।

हालांकिसमस्या कि

fileImport.PostedFile अशक्त पहली बार उपयोगकर्ता एक फ़ाइल का चयन करता है। सब कुछ दूसरी बार और वहां से ठीक काम करता है।

संबंधित

This question बारीकी से मेरी समस्या से संबंधित है, लेकिन ओ पी शायद Gmail में के रूप में एक Async अपलोड समाधान चाहता था। की btnUpload

  • this.form.submit OnClientClick घटना() मेरी FileUpload नियंत्रण के onchange घटना में

    1. __doPostBack(): मैं पहले से ही इस सवाल का जवाब में के रूप में निम्न कार्य कोशिश की है।
    2. Page_PreRender
    3. में

    अतिरिक्त नोट्स

    1. यह बात पूरी तरह से काम किया FileUpload नियंत्रण के onchange विशेषता स्थापना मैं अद्यतन पैनल नहीं था जब। मैं यह कर रहा था .form.submit() सीधे FileUpload नियंत्रण के चालू आयोजन में।
    2. लक्ष्य ढांचे नेट 4,0

    नोट है: जोड़ा गया एक दर्शनीय = "false" ऊपर FileUpload नियंत्रण में। यह समस्या थी लेकिन प्रश्न पूछते समय मैंने इसे अनदेखा कर दिया था।

  • उत्तर

    0
    BeeTee's answer से एक संकेत के साथ

    , एक और SO post और this thread on another forum, मुझे पता चला है कि FileUpload नियंत्रण प्रीरेंडरिंग दौरान दिखाई देना चाहिए। यह शायद UpdatePanels में इस पर नियंत्रण झूठ किसी भी माता-पिता के लिए सच है तो, मूल रूप से मैं नीचे मेरे नियंत्रण परिभाषा से Visible=false हटाया:।

    <asp:FileUpload ID="fileImport" Visible="false" Style="position:relative; opacity:0;" runat="server" onchange="Javascript:onFileSelected();" /> 
    

    मेरे मामले में मैं इसे करने के लिए सीएसएसopacity संपत्ति की स्थापना द्वारा छुपा सकते

    1. सेट सीएसएस संपत्ति display:none
    2. मेक: 0. हालांकि, इसके चारों ओर दो अन्य तरीके हैं एएसपी नियंत्रण की दृश्यमान संपत्ति अस्थायी रूप से प्रीरेंडरिंग के दौरान सच है। यह एक अन्य मंच से ऊपर जुड़े धागे में विस्तृत है।

    कृपया ध्यान दें कि अन्य एसओ थ्रेड में उल्लिखित इस फ़ाइल अपलोड नियंत्रण के माता-पिता के लिए दृश्यमान भी सच होना चाहिए।

    3

    यह कोड मेरे लिए काम करता है, जबकि नेट 4.5 और 4.0 फ्रेमवर्क संस्करण दोनों को लक्षित करते हैं। मैंने आपके कोड को एक नए वेब फॉर्म एप्लिकेशन में कॉपी/पेस्ट किया है, और दोनों मामलों में fileImport.PostedFile शून्य नहीं था, लेकिन मैंने चुनी गई छवि का स्ट्रीम निहित किया था।

    क्या आपके पृष्ठ पर किसी भी अन्य मार्कअप में कोई समस्या है? या शायद आपका पृष्ठ जीवन चक्र? क्या आप एचटीएमएल/जावास्क्रिप्ट को उपयोगकर्ता नियंत्रण या वेब फॉर्म पेज पर पोस्ट करते हैं?

    +0

    दोनों एचटीएमएल और जावास्क्रिप्ट उपयोगकर्ता नियंत्रण में हैं। –

    +0

    क्या आप वाकई पहली बार काम करते हैं? यह मेरे लिए भी काम करता है जब मैं दूसरी बार 'btnFileImportSkin' पर क्लिक करता हूं। –

    +0

    हां, मैं 110% हूं। :) मैं केवल एक बार बटन पर क्लिक करता हूं और कोड हर बार ब्रेकपॉइंट को पहली बार हिट करता है। – BeeTee2

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