【问题标题】:linkbutton of an asp.net gridview control within an ajax update panel throwing errorajax更新面板中的asp.net gridview控件的链接按钮抛出错误
【发布时间】:2013-06-14 16:47:57
【问题描述】:

我收到以下错误。

    JavaScript runtime error: Sys.WebForms.PageRequestManagerParserErrorException: The message received 
from the server could not be parsed.

我尝试调试它,包括在线寻求帮助,但我无法解决问题。 这是我所拥有的:

我在更新面板中有一个网格视图。网格视图的每一行都有一个链接按钮“btnRequest”。 单击链接按钮时,需要在用户桌面上下载一个文本文件。

这是我的代码:

aspx:

<div class="ModalPopup" id="ViewModalPopupDiv1">
        <asp:UpdatePanel ID="UpdatePanel2" runat="server">
            <ContentTemplate>
                <table>
                    <tr>
                        <td>
                            <div class="modalHeader">
                                <table width="100%">
                                    <tr>
                                        <td class="title">
                                            <asp:Label ID="Label2" runat="server" Text="WebServiceCall Details" Font-Bold="true" ></asp:Label>
                                        </td>
                                        <td>
                                            <a href="javascript:void(0);" onclick="javascript:CloseModelPopup1();" class="CloseModal">
                                                X</a>
                                        </td>
                                    </tr>
                                </table>
                            </div>
                        </td>
                    </tr>
                    <tr>
                        <td>
                            <div id="Div1" class="InsertBar">
                                <asp:Panel ID="Panel1" runat="server" HorizontalAlign="left" ScrollBars="Auto">
                                    <asp:GridView ID="gvDetails" OnRowDataBound="gvDetails_RowDataBound"
                                        OnRowCommand="gvDetails_RowCommand" DataKeyNames="Name"
                                        runat="server" CellPadding="5" AutoGenerateColumns="false">
                                        <Columns>
                                            <asp:TemplateField>
                                                <ItemTemplate>
                                                    <asp:Image Width="32px" ID="statusImage" runat="server" Height="32px"></asp:Image>
                                                </ItemTemplate>
                                            </asp:TemplateField>
                                            <asp:TemplateField HeaderText="LogId">
                                                <ItemTemplate>
                                                                                                            <asp:LinkButton CommandName="DownloadTextFile" Text='<%# Bind("LogId") %>'
                                    CommandArgument='<%# Container.DataItemIndex %>' runat="server" ID="btnRequest"></asp:LinkButton>
                                                </ItemTemplate>
                                            </asp:TemplateField>
                                        </Columns>
                                    </asp:GridView>
                                </asp:Panel>
                            </div>
                        </td>
                    </tr>
                </table>
            </ContentTemplate>
        </asp:UpdatePanel>
    </div> 

aspx.cs

protected void gvDetails_RowCommand(object sender, GridViewCommandEventArgs e)
        {


            if (e.CommandName.ToLower() == "DownloadTextFile")
            {
                int index;
                index = Convert.ToInt32(e.CommandArgument);

                object objTemp = gvDetails.DataKeys[index].Values[1].ToString();

                string Request;

                string fileName = string.Empty;

                if (objTemp != null)
                {
                    Request = XMLHelper.IndentXmlString(GetLogRequestByName((objTemp.ToString())));


                    StringBuilder sb = new StringBuilder();
                    sb.AppendLine(Request + "\r\n");
                    fileName = "log" + "_" + objTemp.ToString();

                    Response.Clear();
                    Response.Buffer = true;
                    Response.AddHeader("content-disposition", "attachment;filename=" + fileName + ".txt");
                    Response.Charset = "";
                    Response.ContentType = "text/plain";
                    Response.Output.Write(sb.ToString());
                    Response.Flush();
                    Response.End();
                }
            }
        }

从我的研究中,我发现 Response 对象使用了 HttpHandler 并且在 更新面板导致错误。但我不知道如何解决这个问题。 如果您有任何可以帮助我解决问题的要点,请告诉我

【问题讨论】:

    标签: c# asp.net ajax visual-studio-2010


    【解决方案1】:

    您的问题是,当您流回文本文件时,UpdatePanel 认为恶意内容被注入其中。我一直使用的解决方法是在代码隐藏中构建一个 HTML 锚 () 标记并将其注入到标记中,并使其 href 属性指向文件流逻辑(HttpHandler、页面逻辑等)。这样可以绕过 UpdatePanel 认为其内容被黑客入侵的情况。

    这是一个硬编码锚标记示例,您可以将其放入 UpdatePanel 中,该标记将调用客户端可访问地址,在本例中为 HttpHandler。

    <a href='RelativePathTo/Handlers/DownloadText.ashx?id=7'>Download Text</a>
    

    【讨论】:

    • 嘿,卡尔!谢谢 !我有点明白你在说什么。如果有办法让您向我展示一些示例代码,那就太好了,让我明白。谢谢!
    • 我已经更新了我的原始答案以包含锚标记语法。要在 GridView 场景中使用它,您需要使用 StringBuilder 将锚标记组件的集合放入 RowDataBound 事件中,然后将其注入到 TemplateColumn 中。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-25
    相关资源
    最近更新 更多