2013-06-14 2 views
0

Я получаю следующую ошибку.linkbutton элемента управления gridview asp.net в пределах ошибки обновления панели обновления ajax

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 и имеющий это на панели обновления вызывает ошибку. Но я не мог понять, как решить проблему. Пожалуйста, дайте мне знать, если у вас есть вопросы, которые могут помочь мне решить проблему.

ответ

0

Ваша проблема в том, что UpdatePanel считает, что вредоносный контент вставляется в него при потоковой передаче текстового файла. Обходной путь, который я всегда использовал, заключается в создании тега HTML anchor(), в кодировке и введении его в разметку, и сделать его атрибутом href указывать на логику потоковой передачи файлов (HttpHandler, логика страницы и т. Д.). Это обходит UpdatePanel, думая, что его содержимое взломано.

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

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

Hey Karl! Спасибо ! Я понимаю, что вы говорите. Если это способ, которым вы могли бы показать мне пример кода, это будет здорово и даст мне понять. Спасибо! – CodeNinja

+0

Я обновил свой первоначальный ответ, включив синтаксис тега привязки. Чтобы использовать это в сценарии GridView, вам нужно будет поместить сборку компонентов привязывающего тега внутри события RowDataBound с помощью StringBuilder, а затем ввести его в TemplateColumn. –

Смежные вопросы