【问题标题】:Label message is not printing for empty data table未打印空数据表的标签消息
【发布时间】:2020-09-24 09:55:01
【问题描述】:

如果数据表为空但标签未打印文本,我想显示消息。 我试过ScriptManager.RegisterStartupScript(this, GetType(), "message", "alert('No data found');", true); 但它仍然没有打印任何消息。

我相信我正在从 ZIP 文件夹中的服务器下载文件,这可能是我无法打印消息的原因?

请指导我哪里做错了?

@Adyson 请检查我更新的代码 业务逻辑解释:

这里我们的要求是:单击一次按钮存储多个文件,这是不可能的因为对于一个 HTTP 请求,我们可以生成一个响应,所以我做的是:首先我创建 csv 文件并稍后存储在服务器上完成 csv 文件生成我将所有 csv 压缩到一个文件中并能够下载。并在页面加载时删除旧的 csv 文件以避免重复文件。

public partial class WebForm1 : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            
            string[] files = Directory.GetFiles(Server.MapPath("~/Order_Files/"));
            int iCnt = 0;
            foreach (string file in files)
            {
                FileInfo info = new FileInfo(file);
                info.Refresh();
                if (info.LastWriteTime <= DateTime.Now)
                {
                    info.Delete();
                    iCnt += 1;
                }
            }
            btnGenerate.Attributes.Add("onclick", "waitdownload();");

            if (!Page.IsPostBack)
            {
                BindRegion();
                //lblINQ.Text = "";
                //lblQUO.Text = "";
            }
        }
        public void BindRegion()
        {
         //Binding Code
        }
        protected void ddlregion_SelectedIndexChanged(object sender, EventArgs e)
        {
         //Select Index change code
        }
        protected void btnGenerate_Click(object sender, EventArgs e)
        {
            #region CSV Generation
            DateTime Order_Date = Convert.ToDateTime(deOrderDate.Text);
            var Order_Date_Datemodified = Order_Date.ToString("yyyyMMdd");

            foreach (ListItem listItem in ddlDepot.Items)
            {
                int OrderSum = 0;
                int LineSum = 0;

                if (listItem.Selected)
                {
                    #region for INQ
                    if (ddlInqfileType.SelectedItem.Text == "INQ" || ddlInqfileType.SelectedItem.Text == "QUO")
                    {
                        OracleCommand CmdB = new OracleCommand(String.Format(@"//Select Query"
                        , ddlInqfileType.SelectedItem.Text, listItem.Value,
                        (ddlInqfileType.SelectedItem.Text.Equals("ÏNQ") ? deInqDate.Text.ToString() : deQuoDate.Text.ToString()),
                        deOrderDate.Text.ToString()), con);
                        CmdB.CommandType = CommandType.Text;
                        OracleDataAdapter daBINQ = new OracleDataAdapter();
                        DataTable dtINQ = new DataTable();

                        dtINQ.Columns.Add("DEPOT_CODE", typeof(string));
                        dtINQ.Columns.Add("ROUTE_CODE", typeof(string));
                        dtINQ.Columns.Add("UPLOAD_DATE", typeof(string));
                        dtINQ.Columns.Add("SAP_REGION_CODE", typeof(string));
                        dtINQ.Columns.Add("SAP_SUB_REGION_CODE", typeof(string));
                        dtINQ.Columns.Add("SAP_CUSTOMER_CODE", typeof(string));
                        dtINQ.Columns.Add("SALES_DATE", typeof(string));
                        dtINQ.Columns.Add("PRODUCT_CODE", typeof(string));
                        dtINQ.Columns.Add("ORDER_QTY", typeof(string));
                        dtINQ.Columns.Add("UOM_CODE", typeof(string));
                        dtINQ.Columns.Add("LINE_TOTAL", typeof(string));

                        daBINQ.SelectCommand = CmdB;
                        daBINQ.Fill(dtINQ);

                        if (dtINQ.Rows.Count <= 0)
                        {
                            lblINQ.Text = "No data found for Selected Inquiry date, Please select other date";
                            lblINQ.ForeColor = System.Drawing.Color.Red;
                        }
                        else
                        {
                            foreach (DataRow dr in dtINQ.Rows)
                            {
                                OrderSum += Convert.ToInt32(dr["ORDER_QTY"]);
                            }
                            foreach (DataRow dr in dtINQ.Rows)
                            {
                                LineSum += Convert.ToInt32(dr["LINE_TOTAL"]);
                            }
                            DataRow row = dtINQ.NewRow();
                            row["DEPOT_CODE"] = "TOT";
                            row["ORDER_QTY"] = OrderSum;
                            row["LINE_TOTAL"] = LineSum;
                            dtINQ.Rows.Add(row);
                            string fileName = "INQ" + listItem.Value + Order_Date_Datemodified + ".CSV";
                            string filePath = HttpContext.Current.Server.MapPath("~/Order_Files/" + fileName);
                            Almarai.AlmTextReadWrite.GenerateCSV(filePath.Replace(fileName, ""), fileName, dtINQ, false, false);
                         }
                    }
                    #endregion FOR INQ

                    #region For QUO
                    if (ddlqoutatfileType.SelectedItem.Text == "INQ" || ddlqoutatfileType.SelectedItem.Text == "QUO")
                    {
                        OracleCommand CmdB = new OracleCommand(String.Format(@"//Select Query"
                        , ddlqoutatfileType.SelectedItem.Text, listItem.Value,
                        (ddlqoutatfileType.SelectedItem.Text.Equals("QUO") ? deInqDate.Text.ToString() : deQuoDate.Text.ToString()),
                        deOrderDate.Text.ToString()), con);
                        CmdB.CommandType = CommandType.Text;
                        OracleDataAdapter daQUO = new OracleDataAdapter();

                        DataTable dtQUO = new DataTable();

                        dtQUO.Columns.Add("DEPOT_CODE", typeof(string));
                        dtQUO.Columns.Add("ROUTE_CODE", typeof(string));
                        dtQUO.Columns.Add("UPLOAD_DATE", typeof(string));
                        dtQUO.Columns.Add("SAP_REGION_CODE", typeof(string));
                        dtQUO.Columns.Add("SAP_SUB_REGION_CODE", typeof(string));
                        dtQUO.Columns.Add("SAP_CUSTOMER_CODE", typeof(string));
                        dtQUO.Columns.Add("SALES_DATE", typeof(string));
                        dtQUO.Columns.Add("PRODUCT_CODE", typeof(string));
                        dtQUO.Columns.Add("ORDER_QTY", typeof(string));
                        dtQUO.Columns.Add("UOM_CODE", typeof(string));
                        dtQUO.Columns.Add("LINE_TOTAL", typeof(string));
                        daQUO.SelectCommand = CmdB;
                        daQUO.Fill(dtQUO);
                        if (dtQUO.Rows.Count <= 0)
                        {
                            lblQUO.Visible = true;
                        }
                        else
                        {
                            foreach (DataRow dr in dtQUO.Rows)
                            {
                                OrderSum += Convert.ToInt32(dr["ORDER_QTY"]);
                            }
                            foreach (DataRow dr in dtQUO.Rows)
                            {
                                LineSum += Convert.ToInt32(dr["LINE_TOTAL"]);
                            }
                            DataRow row = dtQUO.NewRow();
                            row["DEPOT_CODE"] = "TOT";
                            row["ORDER_QTY"] = OrderSum;
                            row["LINE_TOTAL"] = LineSum;
                            dtQUO.Rows.Add(row);
                            string fileName = "QUO" + listItem.Value + Order_Date_Datemodified + ".CSV";
                            string filePath = HttpContext.Current.Server.MapPath("~/Order_Files/" + fileName);
                            Almarai.AlmTextReadWrite.GenerateCSV(filePath.Replace(fileName, ""), fileName, dtQUO, false, false);
                        }
                    }
                    #endregion For QUO
                }
            }
            #endregion CSV Generation

            #region ZIP Generation
            using (ZipFile zip = new ZipFile())
            {
                //string fileName = ddlqoutatfileType.SelectedItem.Text + ".csv";
                string filePath = HttpContext.Current.Server.MapPath("~/Order_Files/");
                zip.AlternateEncodingUsage = ZipOption.AsNecessary;
                zip.AddDirectoryByName("Orders");
                string directoryName = Path.GetDirectoryName(filePath);
                foreach (String filename in Directory.GetFiles(directoryName, "*.csv"))
                {
                    zip.AddFile(filename, "Orders");
                }

                // cookies
                HttpCookie cookie = new HttpCookie("ExcelDownloadFlag");
                cookie.Value = "Flag";
                cookie.Expires = DateTime.Now.AddDays(1);
                Response.AppendCookie(cookie);
                //cookies
               
                HttpContext.Current.Response.Clear();
                HttpContext.Current.Response.BufferOutput = false;
                string zipName = String.Format("Zip_{0}.zip", DateTime.Now.ToString("yyyy-MMM-dd-HHmmss"));
                HttpContext.Current.Response.ContentType = "application/zip";
                HttpContext.Current.Response.AddHeader("content-disposition", "attachment; filename=" + zipName);
                zip.Save(HttpContext.Current.Response.OutputStream);
                HttpContext.Current.Response.End();

            }
            #endregion ZIP Generation
        }

ASPX:

<asp:Label ID="lblQUO" runat="server"></asp:Label>

【问题讨论】:

  • 这是一个可能的解释。如果请求返回要下载的文件,它也不能在同一响应中返回网页的内容。浏览器会将其视为要下载的文件或要显示的内容,而不是两者(它使用标题来决定)。 HTTP 响应只能有一种内容类型。
  • @ADyson 哦,还有其他方法可以达到同样的效果吗?
  • 这取决于精确的要求。如果没有数据,听起来您可能想返回错误消息?如果是这样,那么您应该安排代码,使其在这种情况下不会启动文件下载。
  • @ADyson 不,我不想返回错误消息,我只想显示此消息,让用户知道特定日期没有数据
  • 您是否将调试器置于条件中并检查哪些行正在执行?

标签: c# asp.net ado.net


【解决方案1】:

如果请求返回要下载的文件,则它不能在同一响应中也返回网页的内容。浏览器会将其视为要下载的文件或要显示的内容,而不是两者(它使用标题来决定)。 HTTP 响应只能有一种内容类型。

如果您想在没有数据下载时向用户返回消息,那么您应该安排代码以便在这种情况下它不会启动文件下载。

目前,您的代码正在创建一个 zip 文件并设置 HTTP 标头,告诉浏览器将响应视为附件。不管实际上是否有任何数据要下载,它都会这样做。

为了防止这种行为,只需将该代码移动到您的 else 块中,这样它只会在查询返回一些行时这样做:

foreach (ListItem listItem in ddlDepot.Items)
{
  if (listItem.Selected)
  {
    OracleCommand CmdB = new OracleCommand(String.Format(@"SELECT Query"
    OracleDataAdapter daBINQ = new OracleDataAdapter();
    DataTable dtINQ = new DataTable();
    //adding data table columns
    dtINQ.Columns.Add("DEPOT_CODE", typeof(string));
    dtINQ.Columns.Add("ROUTE_CODE", typeof(string));
    daBINQ.SelectCommand = CmdB;
    daBINQ.Fill(dtINQ);

    if (dtINQ.Rows.Count <= 0)
    {
      //ScriptManager.RegisterStartupScript(this, GetType(), "message", "alert('No data found for Selected Inquiry date, Please select other date');", true);
      lblQUO.Text = "No data found for Selected Inquiry date, Please select other date";
      lblQUO.ForeColor = System.Drawing.Color.Red;
    }
    else
    {
      //calculating SUM of column
      foreach (DataRow dr in dtINQ.Rows)
      {
        OrderSum += Convert.ToInt32(dr["ORDER_QTY"]);
      }

      DataRow row = dtINQ.NewRow();                     
      row["DEPOT_CODE"] = "TOT";
      row["ORDER_QTY"] = OrderSum;
      //Crating CSV and storing on server
      string fileName = "INQ" + listItem.Value + Order_Date_Datemodified + ".CSV";
      string filePath = HttpContext.Current.Server.MapPath("~/Order_Files/" + fileName);
         //using dll
      Almarai.AlmTextReadWrite.GenerateCSV(filePath.Replace(fileName, ""), fileName, dtINQ, false, false);
    
      using (ZipFile zip = new ZipFile())
      {
        fileName = ddlqoutatfileType.SelectedItem.Text + ".csv";
        filePath = HttpContext.Current.Server.MapPath("~/Order_Files/");
        zip.AlternateEncodingUsage = ZipOption.AsNecessary;
        zip.AddDirectoryByName("Orders");
        string directoryName = Path.GetDirectoryName(filePath);

        foreach (String filename in Directory.GetFiles(directoryName, "*.csv"))
        {
          zip.AddFile(filename, "Orders");
        }

        HttpContext.Current.Response.Clear();
        HttpContext.Current.Response.BufferOutput = false;
        string zipName = String.Format("Zip_{0}.zip", DateTime.Now.ToString("yyyy-MMM-dd-HHmmss"));
        HttpContext.Current.Response.ContentType = "application/zip";
        HttpContext.Current.Response.AddHeader("content-disposition", "attachment; filename=" + zipName);
        zip.Save(HttpContext.Current.Response.OutputStream);
        HttpContext.Current.Response.End();
      }
    }
  }

现在,在没有数据的情况下,服务器将返回一个“正常”响应,其中包含由 aspx 代码生成的 HTML,以及随之而来的标准标头。这应该意味着浏览器获取 HTML 并将其显示为网页,而不是尝试下载 zip 文件。

【讨论】:

  • 那么我建议您仍然没有提供足够的代码让我们重现真正的问题。您向我们展示的只是一个(不完整的)foreach 循环,没有上下文。我们不知道它触发了什么事件,或者页面生命周期中可能发生的其他事情(例如,可能重置标签值的事情,或其他问题)。 “不工作”并没有告诉我们任何有用的信息,所以我们只能推测。使用调试器缩小问题范围。
  • P.S.顺便说一句,无论如何都不需要循环遍历 ddl 的项目来找到选定的值。 ddlDepot.SelectedValue 应该会自动为您提供选定的值,而无需单独检查每个项目。
  • 我在唱多选下拉列表,所以我使用 Forehatch 循环
  • 是的,你是对的,我正在更新我的整个代码
  • “多项选择下拉列表”..ok,那就解释一下。很公平。不过,我没有看到您的代码有任何更新。
猜你喜欢
  • 2014-02-28
  • 1970-01-01
  • 1970-01-01
  • 2018-10-18
  • 2013-03-04
  • 1970-01-01
  • 2023-03-23
  • 1970-01-01
  • 2016-01-08
相关资源
最近更新 更多