2013-05-22 2 views
2

Вот разметка:Кнопка в UpdatePanel вызывает событие, но страница не обновляется

<asp:UpdatePanel ID="UpdatePanel1" runat="server"> 
    <ContentTemplate> 
     <div class="well well-large"> 
      <form class="navbar-form pull-left"> 
       <asp:FileUpload ID="test" runat="server" CssClass="input-small" /> 
       <br /> 
       <asp:Button ID="btnUpload" runat="server" Text="Upload" CssClass="btn" OnClick="btnUpload_Click" /> 
      </form> 
     </div> 
    </ContentTemplate> 
    <Triggers> 
     <asp:AsyncPostBackTrigger ControlID="btnUpload" EventName="Click" /> 
    </Triggers> 
</asp:UpdatePanel> 

<asp:Panel runat="server" ID="panAlert" Visible="false"> 
    <div class="alert alert-success" id="divAlert" runat="server"> 
     <button id="Button1" runat="server" type="button" class="close" data-dismiss="alert">&times;</button> 
     You shouldn't see this message! 
    </div> 
    <asp:Panel runat="server" ID="panMarquee" Visible="true"> 
     <div id="Div1" runat="server" class="progress progress-success progress-striped"> 
      <div id="ProgressBar" runat="server" class="bar" style="width: 100%"></div> 
     </div> 
    </asp:Panel> 
</asp:Panel> 

Когда кнопка нажата btnUpload, код сервера должен определить, является ли элемент управления FileUpload имеет файл. Если это произойдет, это изменит видимость панели управления на значение true. Он отлично работает за пределами UpdatePanel.

Вот код сервера:

protected void btnUpload_Click(object sender, EventArgs e) 
    { 
     this.SetMessage(Message.Success); 
     try 
     { 
      if (this.test.HasFile) 
      { 
       string filename = Path.GetFileName(GetUB04Doc.FileName); 
       //test.SaveAs(Server.MapPath("~/") + filename); 
       this.SetMessage(Message.Success); 
      } 
     } 
     catch (Exception ex) 
     { 
      //TODO: Do something with th exception 
      this.SetMessage(Message.Fail); 
     } 
     finally 
     { 
      //this.GetUB04Doc.Dispose(); 
     } 
    } 
private enum Message { Success, Fail } 
    private void SetMessage(Message msg) 
    { 
     if (msg == Message.Success) 
     { 
      this.divAlert.InnerText = "Well done! The document appears to have uploaded successfully. Please wait..."; 
      this.divAlert.Attributes.Add("class", "alert alert-success"); 
     } 
     else 
     { 
      this.divAlert.InnerText = "Oh snap! Something broke. Please contact IT right away."; 
      this.divAlert.Attributes.Add("class", "alert alert-error"); 
     } 

     this.panAlert.Visible = true; 
    } 

Я попытался поставить панель в разделе ContentTemplate как хорошо, но результаты были одинаковыми.

Любые идеи о том, что я делаю неправильно здесь?

+2

Ненавижу говорить вам, но элементы управления FileUpload не работают должным образом в 'UpdatePanels'! Существуют работы, такие как использование «AsyncFileUpload» из MS Ajax Toolkit. – Belogix

+0

Зачем нужна панель обновления и почему Json и JQuery не могут отправлять данные? –

+0

@Belogix Спасибо. Я переключусь на элемент управления AJAX. – ernest

ответ

3

Вы должны окружать область, которую вы изменяющая от асинхронного постбэк в другом UpdatePanel с UpdateMode установлен в Conditional. Затем обновите другой вручную коде:

<asp:UpdatePanel ID="panAlertUpdatePanel" UpdateMode="Conditional" runat="server"> 
    <ContentTemplate> 
    <asp:Panel runat="server" ID="panAlert" Visible="false"> 
     <!-- .... 

отделенного кода:

// ... 
this.panAlert.Visible = true; 
panAlertUpdatePanel.Update() 

Побочное примечание: Как @Belogix уже комментировал, вы должны использовать AsyncFileUpload элемент управления, в UpdatePanel так регулярно FileUpload контролируют его не поддерживается асинхронной обратной обработкой.

MSDN:

Элементы управления, которые не совместимы с UpdatePanel управления:

  • ...
  • FileUpload и HtmlInputFile управления, когда они используются для загрузки файлов в качестве части асинхронный postback.
  • ...

Чтобы использовать элемент управления FileUpload или HtmlInputFile внутри элемента управления UpdatePanel , установите регулятор обратной передачи, который отправляет файл быть управления PostBackTrigger для панели. Элемент FileUpload и HtmlInputFile можно использовать только в сценариях обратной передачи.

+0

Отлично! Большое спасибо. – ernest

+0

Вы также должны проливать свет здесь http://stackoverflow.com/q/16697601/2333922 –

0

Вам необходимо поставить PostBackTrigger вместо AsyncPostBackTrigger вот так. <asp:PostBackTrigger ControlID="btnUpload" />

+0

Это не сработало. Но ответ Тима. Спасибо – ernest