2013-08-19 2 views
1

вот что у меня есть. Я загружаю изображения через FileUpload Control .. Но когда я даю триггер для обновления панели управления Fileupload показывает, что он пуст. знаю, почему ..Asp.NET Updatepanel работает не так, как ожидалось

и вот что мне нужно ..

мне нужно обновить UpdatePanel только тогда, когда я кнопку загрузки и другие нажмите то, что я не хочу, чтобы обновить его содержимое. . Какие изменения мне необходимо сделать в моем кодировании

Вот код ASPX ..

<form id="form1" runat="server"> 
     <asp:ScriptManager ID="ScriptManager1" runat="server" EnablePartialRendering="true"/> 
    <div> 


      <fieldset style="width:50%; margin-left:300px"> 
      <legend>Upload Files</legend> 
       <asp:FileUpload runat="server" ID="UploadImages" style="background-color:white; position:relative; font-family:'Palatino Linotype'; font-size:medium" Width="500px" AllowMultiple="true"/> 
       <asp:Button runat="server" ID="uploadedFile" style="position:relative; font-family:'Palatino Linotype'; font-size:medium; width: 112px; height: 29px;" Text="Upload" OnClick="uploadFile_Click" /> 
      </fieldset> 


    <div id="back" runat="server" class="transbox" style="width:100%;height:100%;left:0px;top:0px;position:absolute" Visible="false"> 
    <asp:UpdatePanel ID="updtpanel" runat="server" UpdateMode="Conditional" style="width:100%;height:100%;left:0px;top:0px;position:absolute"> 
      <ContentTemplate> 
       <asp:Button ID="btnsave" runat="server" UseSubmitBehavior="true" Text="Find Images" OnClick="btnsave_Click" Font-Bold="true" style="position:absolute" BackColor="Yellow"></asp:Button>--%> 
      </ContentTemplate> 
      <Triggers> 
       <asp:AsyncPostBackTrigger ControlID="uploadedFile" EventName="Click"/> 
      </Triggers> 
     </asp:UpdatePanel> 

    </div> 

    </div> 
    </form> 

и здесь является .cs код для FileUpload ..

protected void uploadFile_Click(object sender, EventArgs e) 
    { 

     if (UploadImages.HasFiles) 
     { 

      string fileExt = Path.GetExtension(UploadImages.FileName).ToLower(); 
      if (fileExt == ".jpeg" || fileExt == ".png" || fileExt == ".jpg" || fileExt == ".bmp") 
      { 
       foreach (HttpPostedFile uploadedFile in UploadImages.PostedFiles) 
       { 
        count1 += 1; 
       } 

       foreach(HttpPostedFile uploadedFile in UploadImages.PostedFiles) 
       { 
        count += 1; 

        filepath = Server.MapPath("~/Images/" + uploadedFile.FileName); 
        uploadedFile.SaveAs(filepath); 
        newpath = "../Images/" + uploadedFile.FileName; 
        try 
        { 
         createImgPanel(); 
         Image nimg = Page.FindControl("img" + count) as Image; 
         nimg.ImageUrl = newpath.ToString(); 

         Page.ClientScript.RegisterStartupScript(GetType(), "msgbox", "alert('Files Uploaded!!');", true); 

        } 

        catch (Exception ex) 
        { 
         Response.Write(ex.Message); 
        } 

       } 
      } 
      else 

      { 
       Page.ClientScript.RegisterStartupScript(GetType(), "msgbox", "alert('Please Select only Image Files!!');", true); 
      } 

     } 
     else 
     { 
      Page.ClientScript.RegisterStartupScript(GetType(), "msgbox", "alert('Please Select a File First!!');", true); 
     } 
    } 

Если я комментирую Триггеры в UpdatePanel uploadFile.HasImages будет работать .. Но если я раскоментировать Он будет напрямую приземлиться на Пожалуйста, выберите файл первый Сообще ошибки .. Что ошибку я совершающую в коде ..

ответ

3

Вашего updatepanel является запуск постбэка сразу после UploadFile, так что происходит то, что выбранный файл немедленно отправляется обратно с этим самым первым запросом. Когда вы отправите второй запрос, нажав на кнопку, управление UploadFile снова будет пустым. Элемент управления UploadFile (или любой элемент input:file, если на то пошло) не сохранит выбранное значение после обратной передачи. То, что вы видите, по дизайну.

Проще всего сделать, это избежать первоначальной обратной передачи и полностью выполнить проверку на стороне клиента. Другими словами, удалите раздел triggers из панели обновления, поскольку вы уже обнаружили, что это работает. Очевидно, что вы все равно будете выполнять проверку на стороне сервера при нажатии кнопки «Загрузить файлы».

Есть и другие альтернативы этому, но нижняя строка состоит в том, что вы не можете сделать полную обратную передачу (это то, что UpdaPanels делает за кулисами), когда у вас есть элемент управления UploadFile, потому что это приведет к тому, что выбранные файлы будут Отправлено. Чтобы доказать, что я говорю, поставьте точку останова на Page_Load и добавьте часы к Request.Files, когда обновленная панель запускает обновление.

+0

@Icarus .. Но, по моим сведениям, триггеры разрешают только исправления на моей целевой панели обновления? если я хочу настроить таргетинг на мою обновленную панель, которая будет обновляться только один раз, какой метод мне нужно использовать. –

+1

@ Kaushik UpdatePanels будет ** обновлять свой контент **, но выполняется * полный postback *. Вы можете легко это увидеть, если поставить точку останова на 'Page_Load' и посмотреть, что произойдет. Убедитесь, что вы добавили часы в 'Request.Files' – Icarus

+0

@Icarus .. Спасибо за это .. Это действительно просвело меня .. Хорошо постарается решить мою проблему на основе знаний, предоставленных u ... Спасибо ..:) –