2015-05-12 1 views
0

У меня есть сайт, который использует мастер-страницы.Как загрузить pdf-файл с панели в панели обновления

Одна из моих страниц содержания - это в основном большая UpdatePanel. Внутри этой UpdatePanel есть регулярная панель. Внутри обычной панели находится Gridview. Внутри Gridview есть ссылка, которая указывает на PDF, хранящийся в моей базе данных.

Когда я нажимаю кнопку Linkbutton для извлечения pdf-файла, ничего не происходит.

У меня это работает на другой странице, у которой нет UpdatePanel.

Я уже пытался запустить «внешнюю» кнопку из кнопки Linkbutton и зарегистрировать эту кнопку в качестве события PostBack. Страница отправляется обратно, когда я нажимаю ссылку, но PDF не отправляется пользователю.

Вот некоторые примеры кода:

<asp:UpdatePanel ID="UpdatePanelClaims" runat="server"> 
<ContentTemplate> 

<asp:Panel ID="upClaimAttachment" runat="server" Visible="false" > 

     <table id="gridClaimAttachmentTable" runat="server" class="table" > 
      <tr> 
       <td > 
        <asp:GridView ID="grdClaimAttachment" runat="server" AllowPaging="True" AllowSorting="True" 
         AutoGenerateColumns="False" CssClass="table table-striped table-bordered table-condensed table-hover" EmptyDataText="No Attachments for this Claim." 
         EnableTheming="False" onpageindexchanging="grdClaimAttachment_PageIndexChanging" PageSize="15" OnRowCommand="grdClaimAttachment_RowCommand" 
         OnRowDataBound="grdClaimAttachment_RowDataBound" > 
         <PagerStyle CssClass="bs-pagination" /> 
         <AlternatingRowStyle CssClass="alternateColor" /> 
         <RowStyle CssClass="rowsStyle" /> 
         <Columns> 
          <asp:BoundField DataField="ID" HeaderText="ID" ItemStyle-CssClass="hideColumn" HeaderStyle-CssClass="hideColumn" > 
           <HeaderStyle HorizontalAlign="Left" /> 
           <ItemStyle HorizontalAlign="Right" /> 
          </asp:BoundField> 
          <asp:TemplateField HeaderText="File Name"> 
           <ItemTemplate> 
            <asp:LinkButton ID="btnViewAttachment" Text='<%#Eval("FileName") %>' CommandName="ViewAttachment" 
             CommandArgument="<%# Container.DataItemIndex %>" runat="server"></asp:LinkButton></ItemTemplate> 
          </asp:TemplateField> 

          <asp:ButtonField ButtonType="Button" CommandName="btnDelete" Text="Delete"> 
           <ControlStyle CssClass="btn btn-info btn-xs " /> 
          </asp:ButtonField> 
         </Columns> 
         <SelectedRowStyle BackColor="#E2DED6" Font-Bold="True" ForeColor="#333333" /> 
         <SortedAscendingCellStyle BackColor="#E9E7E2" /> 
         <SortedAscendingHeaderStyle BackColor="#506C8C" /> 
         <SortedDescendingCellStyle BackColor="#FFFDF8" /> 
         <SortedDescendingHeaderStyle BackColor="#6F8DAE" /> 
        </asp:GridView> 
       </td> 
      </tr> 
      <tr > 
       <td> 
        <div class="container"> 
         <div class="form-group form-group-sm form-groupNoSpace"> 
          <div class="row"> 
           <div class=" col-xs-4 col-xs-offset-4 text-right"> 
            <asp:Button ID="btnClaimAttachmentAdd" runat="server" CssClass="btn btn-primary btn-sm btn-block" Text="Add Attachment" OnClick="btnClaimAttachmentAdd_Click"/> 
           </div> 
          </div> 
         </div> 
         </div> 

       </td> 
      </tr> 
     </table> 

</asp:Panel> <%-- Attachment Update Panel --%> 

<asp:Button ID="btnClickMe" runat="server" OnClick="btnClickMe_Click" Visible="false" /> 

</ContentTemplate> 
    <Triggers> 
     <asp:PostBackTrigger ControlID="btnClickMe" /> 
    </Triggers> 
</asp:UpdatePanel> <%-- UpdatePanelClaims --%> 

В коде позади меня есть это:

protected void btnClickMe_Click(object sender, EventArgs e, ClaimAttachment objAttachment) 
    { 
     ViewAttachment(objAttachment); 
    } 

    private void ViewAttachment(ClaimAttachment objAttachment) 
    { 
     Response.Clear(); 
     Response.Buffer = true; 
     Response.ContentType = "application/pdf"; 
     Response.AppendHeader("content-disposition", "attachment;filename=" + objAttachment.FileName); 
     Response.Charset = ""; 
     Response.Cache.SetCacheability(HttpCacheability.NoCache); 
     Response.BinaryWrite(objAttachment.Attachment); 
     Response.Flush(); 
     Response.End(); 
    } 

UPDATE: Забыли некоторый критический код!

protected void grdClaimAttachment_RowCommand(object sender, GridViewCommandEventArgs e) 
    { 
     try 
     { 
      int index = Convert.ToInt32(e.CommandArgument); 

      if (index >= grdClaimAttachment.Rows.Count) 
       return; 

      int IDkey = Convert.ToInt32(grdClaimAttachment.Rows[index].Cells[0].Text); 
      ClaimAttachment objClaimAttachment = ClaimAttachment.RetrieveById((string)Session["Username"], IDkey); 

      if (e.CommandName == "btnDelete") 
      { 
       ltlDeleteID.Text = IDkey.ToString(); 
       ltlRecordType.Text = "attachment"; 
       confirmDialog(string.Format("DELETE Attachment: {0} ?", objClaimAttachment.FileName)); 
      } 
      else if (e.CommandName == "ViewAttachment") 
      { 
       //btnClickMe.CommandArgument = IDkey.ToString(); 
       //btnClickMe_Click(sender, e); 
       btnClickMe.Click += new EventHandler((s1, e1) => btnClickMe_Click(s1, e1, objClaimAttachment)); 
       btnClickMe_Click(sender, e, objClaimAttachment); 
      } 
     } 
     catch (BLException be) 
     { 
      errDialog(be.Message); 
     } 
    } 

LinkButton в сетке фактически вызывающий Нажмите на событие внешней кнопки для выполнения PDF Скачать ...

Что мне не хватает ?? Как я уже сказал, это работает, если я удаляю все UpdatePanels, но мне они нужны для других вещей ...

thx!

ответ

1

Класс PostBackTrigger является ключом к вашему решению, так как он может использоваться для запуска полной перезагрузки страницы, необходимой для работы ответа на загрузку. Загрузки просто не будут работать с частичной обратной передачи.

Однако, как кнопки, которые должны привести к постбэк являются внутри сетки, используя один PostBackTrigger в разметке не хватает, вам нужен конкретный триггер для каждой кнопки/строки.

использовать что-то вроде этого (назовем его из Page_Load)

private void RegisterPostBackControls() 
{ 
    foreach (GridViewRow row in grdClaimAttachment.Rows) 
    { 
     LinkButton button = row.FindControl("btnViewAttachment") as LinkButton; 
     ScriptManager.GetCurrent(this).RegisterPostBackControl(button); 
    } 
} 
+0

Я добавил больше деталей к оригинальному сообщению, показывая, как я регистрировал событие щелчка внешней кнопки. Я также попытался использовать предложенный метод - удалив внешнюю кнопку, зарегистрировав кнопки View Attachment в gridview и вызвав процедуру ViewAttachment (которая извлекает pdf) непосредственно из RowCommand сетки вложений, но все еще не работает ... спасибо ! –

+0

Благодарим вас за предложение ... однако единственный способ, которым я решил разрешить это, - это в основном удалить внешнюю панель обновления и использовать стандартную панель. Это уже третий раз, когда я столкнулся с этой проблемой, и я еще не решил ее каким-либо другим способом. Действительно странно! –