У меня есть сайт, который использует мастер-страницы.Как загрузить 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!
Я добавил больше деталей к оригинальному сообщению, показывая, как я регистрировал событие щелчка внешней кнопки. Я также попытался использовать предложенный метод - удалив внешнюю кнопку, зарегистрировав кнопки View Attachment в gridview и вызвав процедуру ViewAttachment (которая извлекает pdf) непосредственно из RowCommand сетки вложений, но все еще не работает ... спасибо ! –
Благодарим вас за предложение ... однако единственный способ, которым я решил разрешить это, - это в основном удалить внешнюю панель обновления и использовать стандартную панель. Это уже третий раз, когда я столкнулся с этой проблемой, и я еще не решил ее каким-либо другим способом. Действительно странно! –