2013-11-09 4 views
2

Мне нужно обработать действие щелчка кнопки пользователя, отправив ему двоичный файл, хранящийся в базе данных, а также обновив базу данных, а изменения отразятся в RadGrid с помощью ajax.Отправить двоичный файл и обновить сетку с помощью ajax

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

Мне было интересно, есть ли альтернатива для этого.

У меня есть аналогичные куски кода:

JavaScript:

<asp:ScriptManager ID="ScriptManager1" runat="server" /> 
    <script src="http://code.jquery.com/jquery-1.10.1.min.js"></script> 
     <script type="text/javascript"> 
      var pbControl = null; 
      var prm = Sys.WebForms.PageRequestManager.getInstance(); 
      prm.add_beginRequest(BeginRequestHandler); 

      Sys.WebForms.PageRequestManager.getInstance() 
             .add_endRequest(EndRequestHandler); 

      function BeginRequestHandler(sender, args) { 
       $(".loads").attr("disabled", true); 
      } 

      function EndRequestHandler(sender, args) { 
       if (args.get_error() != undefined) { 
        var errorMessage = args.get_error().message; 
         args.set_errorHandled(true); 
         errorMessage = errorMessage.replace(
          "Sys.WebForms.PageRequestManagerServerErrorException:", 
          ""); 
         alert(errorMessage); 
       } 
       $(".loads").attr("disabled", false); 
       } 
     </script> 
</asp:ScriptManager> 

asp.net:

<asp:UpdatePanel ID="UpdatePanel1" runat="server"> 
    <ContentTemplate> 
     <div class="loads"> 
      <telerik:RadGrid ID="Grid" runat="server" 
        OnItemCommand="Grid_ItemCommand"> 
       <MasterTableView TableLayout="Auto"> 
        <Columns> 
         <telerik:GridTemplateColumn> 
          <ItemTemplate> 
           <asp:ImageButton ID="Button" runat="server" 
            CommandName="Command" 
            CommandArgument='<%# Eval("Code") %>' /> 
          </ItemTemplate> 
         </telerik:GridTemplateColumn> 
        </Columns> 
       </MasterTableView> 
      </telerik:RadGrid> 
     </div> 
    </ContentTemplate> 
</asp:UpdatePanel> 

C#:

protected void Grid_ItemCommand(object sender, 
           Telerik.Web.UI.GridCommandEventArgs e) 
{ 
    if(e.CommandName == "Command") 
    { 
     // Update database 
     DatabaseUpdate(); 
     Grid.Rebind(); 

     // Send binary 
     HttpResponse response = this.Response; 
     byte[] bin = GetBinary(code); 

     MemoryStream memStream = null; 
     memStream = new MemoryStream(bin); 

     response.Clear(); 
     response.AddHeader("content-disposition", 
      string.Format("attachment; filename={0}", "file.pdf")); 
     response.ContentType = string.Format("application/{0}", "pdf"); 
     response.BufferOutput = false; 

     byte[] buffer = new byte[1024]; 
     int bytesRead = 0; 
     while ((bytesRead = memStream.Read(buffer, 0, buffer.Length)) > 0) 
     { 
      response.OutputStream.Write(buffer, 0, bytesRead); 
     } 

     response.Flush(); 
    } 
} 

ответ

0

Иногда несколько ответов от сервера делает чтобы они сражались друг с другом, в основном, когда вы используете класс HttpResponse. Нет, проблема в том, что вы можете сделать трюк. Добавить пустую страницу для нажатия файла, скажем download.aspx

В вашем мероприятии Grid_ItemCommand просто удалите код для отправки файла. Только обновление базы данных.

protected void Grid_ItemCommand(object sender, elerik.Web.UI.GridCommandEventArgs e) 
{ 
     if(e.CommandName == "Command") 
     { 
      // Update database 
      DatabaseUpdate(); 
      Grid.Rebind(); 
      ScriptManager.RegisterStartupScript(Page, this.GetType(), "download","pushFile();", true); 
     } 
} 

последняя строка в коде выше называет сценарий pushFile в aspx страницы и ниже сценарий для открытия нашей новой добавленной страницы download.aspx

Javascript:

function pushFile() 
{ 
    window.open("download.aspx"); 
} 

Тогда, наконец, в код позади download.aspx, введите ниже код в Page_Load

protected void Page_Load(object sender, EventArgs e) 
{ 
     HttpResponse response = this.Response; 
     byte[] bin = GetBinary(code); 

     MemoryStream memStream = null; 
     memStream = new MemoryStream(bin); 

     response.Clear(); 
     response.AddHeader("content-disposition", 
      string.Format("attachment; filename={0}", "file.pdf")); 
     response.ContentType = string.Format("application/{0}", "pdf"); 
     response.BufferOutput = false; 

     byte[] buffer = new byte[1024]; 
     int bytesRead = 0; 
     while ((bytesRead = memStream.Read(buffer, 0, buffer.Length)) > 0) 
     { 
      response.OutputStream.Write(buffer, 0, bytesRead); 
     } 

     response.Flush(); 
} 
+1

Я не пробовал этот подход, но я думаю, что он должен работать. – Eduardo

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