csv文件没有从asp.net的铬浏览器下载c#app

问题描述:

即时通讯使用下面的代码通过http请求发送一个csv文件。代码运行良好,但文件不下载客户端机器上,不保存为菜单,什么都没有出现。我用于另一个报告的相同代码,它工作正常,文件也被下载。我在本地主机上运行项目。但不是按钮btnGenerateReport。csv文件没有从asp.net的铬浏览器下载c#app

protected void btnGenerateReport_Click(object sender, EventArgs e) 
    { 
     DataTable dt = new DataTable(); 
     MHSProgressNotesBL oMHSProgressNote = new MHSProgressNotesBL(); 
     int ClientId = Convert.ToInt32(ddlClients.SelectedValue); 
     int LocationId = Convert.ToInt32(ddlLocations.SelectedValue); 
     int PractitionerId = Convert.ToInt32(ddlPractitioner.SelectedValue); 

     dt = oMHSProgressNote.FetchBillingReport(LocationId, ClientId, PractitionerId, Convert.ToDateTime(txtNoteStartDate.Text), Convert.ToDateTime(txtNoteEndDate.Text)); 
     WriteToCSV(dt); 

    } 

    private void WriteToCSV(DataTable dt) 
    { 
     try 
     { 
      string attachment = "attachment; filename=ClientRoster.csv"; 
      HttpContext.Current.Response.Clear(); 
      HttpContext.Current.Response.ClearHeaders(); 
      HttpContext.Current.Response.ClearContent(); 
      HttpContext.Current.Response.AddHeader("content-disposition", attachment); 
      HttpContext.Current.Response.ContentType = "text/csv"; 
      //HttpContext.Current.Response.AddHeader("Pragma", "public"); 
      WriteColumnName(dt); 
      foreach (DataRow clientdata in dt.Rows) 
      { 
       WriteUserInfo(clientdata); 
      } 
      HttpContext.Current.Response.End(); 
      //HttpContext.Current.ApplicationInstance.CompleteRequest(); 
     } 
     catch (Exception e) 
     { } 

    } 

    private void WriteColumnName(DataTable dt) 
    { 
     string columnNames = ""; 
     // Write Header row 
     foreach (DataColumn item in dt.Columns) 
     { 
      if (item.ColumnName.Contains(',')) 
      { 
       columnNames += "\"" + item.ColumnName + "\""; 
      } 
      else 
      { 
       columnNames += item.ColumnName + ","; 
      } 
     } 
     columnNames = columnNames.TrimEnd(','); 

     HttpContext.Current.Response.Write(columnNames); 
     HttpContext.Current.Response.Write(Environment.NewLine); 
    } 

    private void WriteUserInfo(DataRow clientDataRow) 
    { 
     StringBuilder stringBuilder = new StringBuilder(); 

     foreach (var item in clientDataRow.ItemArray) 
     { 
      AddComma((string)(item == System.DBNull.Value ? "" : item.ToString()), stringBuilder); 
     } 
     HttpContext.Current.Response.Write(stringBuilder.ToString().TrimEnd(',')); 
     HttpContext.Current.Response.Write(Environment.NewLine); 

    } 

    private void AddComma(string value, StringBuilder stringBuilder) 
    { 
     if (value.Contains('"')) 
     { 
      value = value.Replace(@"""", @""""""); 
      value = "\"" + value + "\""; 
     } 
     else if (value.Contains(',')) 
     { 
      value = "\"" + value + "\""; 
     } 
     stringBuilder.Append(value); 
     stringBuilder.Append(","); 
    } 
+0

你确实需要重构代码。它的可维护性差,并且可能会导致问题 - 您应该有一个生成CSV输出或文件的函数,然后让调用者写入响应,因此所有内容都易于管理,而不是写入响应流的不同方法。这也将使您更容易针对您遇到和遇到的问题。 – 2015-02-24 09:53:07

的代码是确定.........的主要问题是该按钮btnGenerateReport是一个更新面板。由于其误差在上升的内:从所述服务器接收的消息无法被解析。此错误的常见原因是,通过调用Response.Write(),响应筛选器,HttpModules或服务器跟踪已启用来修改响应时。 详细信息:在“客户,医师”附近解析错误。 将按钮放置在更新面板之外后,代码正常工作。

+0

是的,确切地说。你不能写入你有更新面板的区域。 – 2015-02-24 09:54:14