#c# #asp.net #ado.net
#c# #asp.net #ado.net
Вопрос:
Я хочу отобразить сообщение, если таблица данных пуста, но метка не печатает текст. Я пытался 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>
Комментарии:
1. Это вероятное объяснение. Если запрос возвращает файл для загрузки, он также не может вернуть содержимое для веб-страницы в том же ответе. Браузер будет рассматривать его либо как файл для загрузки, либо как что-то для отображения, а не как то и другое (для принятия решения он использует заголовки). HTTP-ответ может иметь только один тип содержимого.
2. @ADyson О, есть ли какой-либо другой подход для достижения того же?
3. Ну, это зависит от точного требования. Похоже, может быть, вы хотите вернуть сообщение об ошибке, если данных нет? Если это так, то вам следует упорядочить код так, чтобы он не инициировал загрузку файла в этой ситуации.
4. @ADyson нет, я не хочу возвращать сообщение об ошибке, я просто хочу отобразить это сообщение, чтобы пользователь знал, что данные на определенную дату отсутствуют
5. вы ввели отладчик в условие и проверили, какие строки выполняются?
Ответ №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();
}
}
}
Теперь в случае, когда данных нет, сервер вернет «обычный» ответ, содержащий HTML, сгенерированный aspx-кодом, и стандартные заголовки для него. Это должно означать, что браузер принимает HTML и отображает его как веб-страницу, вместо того, чтобы пытаться загрузить zip-файл.
Комментарии:
1. Тогда я бы предположил, что вы все еще не предоставили достаточно кода, чтобы мы могли воспроизвести реальную проблему. Все, что вы нам показали, это (неполный) цикл foreach без контекста. Мы не знаем, какое событие оно вызвало, или что еще может происходить в жизненном цикле страницы (например, что-то, что может сбросить значение метки или другую проблему). «Не работает» не говорит нам ничего полезного, поэтому мы можем только строить догадки. Используйте свой отладчик, чтобы сузить проблему.
2. PS Кроме того, в любом случае не должно быть необходимости перебирать элементы ddl, чтобы найти выбранное значение.
ddlDepot.SelectedValue
должно автоматически указывать выбранное значение без необходимости проверять каждый элемент по отдельности.3. Я пою выпадающий список с несколькими вариантами выбора, поэтому я использую цикл обработки
4. Да, вы правы, я обновляю весь свой код
5. «Выпадающий список с несколькими вариантами выбора» .. хорошо, тогда это объясняет. Достаточно справедливо. Однако я не вижу никаких обновлений в вашем коде.