#c# #asp.net #updatepanel #handler
#c# #asp.net #updatepanel #обработчик
Вопрос:
в моем проекте есть Handler.ashx для отображения диалогового окна сохранения как моим пользователям.
также у меня есть повторитель со ссылочными кнопками внутри для щелчка и, наконец, отображения верхнего диалогового окна сохранения как.
я поместил свой повторитель в панель обновления!
коды ItemCommand этого повторителя выглядят следующим образом :
protected void Repeater1_ItemCommand(object source, RepeaterCommandEventArgs e)
{
if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
{
//The Below Line Does Not Work - Always Is Null
//NewAddedFiles currentItem = (NewAddedFiles)e.Item.DataItem;
HiddenField hfFilePath = (HiddenField)e.Item.FindControl("hfFilePath");
HiddenField hfFileName = (HiddenField)e.Item.FindControl("hfFileName");
HiddenField hfFileSize = (HiddenField)e.Item.FindControl("hfFileSize");
HiddenField hfFileCreationDate = (HiddenField)e.Item.FindControl("hfFileCreationDate");
switch (e.CommandName)
{
case "lbFile_Click":
{
if (Session["User_ID"] != null)
{
DataSet dsDownload = DataLayer.Download.Size_By_UserID_Today(int.Parse(HttpContext.Current.Session["User_ID"].ToString()), DateTime.Now);
if (dsDownload.Tables["Download"].Rows.Count > 0)
{
DataRow drDownload = dsDownload.Tables["Download"].Rows[0];
int SumOfFileSize4Today = int.Parse(drDownload["FileSizSum"].ToString());
if (SumOfFileSize4Today int.Parse(hfFileSize.Value) <= 1073741824)//1 GB = 1024*1024*1024 bytes = 1073741824 bytes
//if (SumOfFileSize4Today int.Parse(hfFileSize.Value) <= 100000)
{
DataLayer.Download.InsertRow(
int.Parse(HttpContext.Current.Session["User_ID"].ToString()),
DateTime.Now,
hfFilePath.Value,
hfFileName.Value,
hfFileSize.Value,
DateTime.Parse(hfFileCreationDate.Value)
);
Response.Redirect("~/HandlerForRepeater.ashx?path=" hfFilePath.Value);
}
else
{
ScriptManager.RegisterStartupScript(this.Page, typeof(Page), "YouCanNotDownloadAnyMore_SizeOverload", "YouCanNotDownloadAnyMore_SizeOverload();", true);
}
}
else
{
if (int.Parse(hfFileSize.Value) <= 1073741824)
//if (int.Parse(hfFileSize.Value) <= 100000)
{
DataLayer.Download.InsertRow(
int.Parse(HttpContext.Current.Session["User_ID"].ToString()),
DateTime.Now,
hfFilePath.Value,
hfFileName.Value,
hfFileSize.Value,
DateTime.Parse(hfFileCreationDate.Value)
);
Response.Redirect("~/HandlerForRepeater.ashx?path=" hfFilePath.Value);
}
else
{
ScriptManager.RegisterStartupScript(this.Page, typeof(Page), "YouCanNotDownloadAnyMore_SizeOverload", "YouCanNotDownloadAnyMore_SizeOverload();", true);
}
}
}
else
{
ScriptManager.RegisterStartupScript(this.Page, typeof(Page), "plzLoginFirst_ForDownload", "plzLoginFirst_ForDownload();", true);
}
break;
}
default:
{
break;
}
}
}
}
важной частью этого кода является :
Response.Redirect("~/HandlerForRepeater.ashx?path=" hfFilePath.Value);
из-за этой строки обратный вызов никогда не заканчивается, и когда появляется диалоговое окно сохранить как, область повторителя переходит в режим обдумывания и отключается!
как я могу исправить эту проблему?
Ответ №1:
Я не совсем знаком с UpdatePanels, но я думаю, что вы в значительной степени ответили на это сами, когда сказали, что «обратный вызов никогда не заканчивается, и когда появляется диалоговое окно сохранения как, область повторителя переходит в режим мышления и отключается».
Происходит то, что вы не возвращаете ответ страницы на свой запрос, а вместо этого отправляете запрос на сервер со своей страницы, который перенаправляет на ваш обработчик, который, как я предполагаю, отвечает загрузкой файла. Страница, с которой вы запросили, теперь устарела, если вы хотите продолжать использовать эту страницу, вам нужно вернуть ее в качестве ответа.
Два варианта, которые вы могли бы рассмотреть::
- Вместо перенаправления на ваш обработчик позвольте ответу продолжаться в обычном режиме и вместо этого зарегистрируйте скрипт для выполнения запроса к вашему обработчику, асинхронно передавая ему путь к файлу.
- Используя jQuery, асинхронно вызывайте веб-метод для обработки этого с помощью метода ajax.
Комментарии:
1. спасибо за ответ / ошибка варианта № 1 -> таким же образом / последним способом является вариант № 2 / но есть ли какой-либо другой способ исправить эту проблему?
2. К сожалению, я не слишком хорошо знаком с панелями обновления, поэтому не уверен, почему опция не работает. Пока нет перенаправлений, я бы подумал, что ответ должен был просто вернуться, как и ожидалось. Если у меня будет время, я продолжу расследование, но, надеюсь, кто-то еще может появиться с объяснением.
3. Проверьте это, возможно, проблема с повторителями в панелях обновления: forums.asp.net/p/1029795/1410614.aspx
4. дорогой Энди Роуз, прошу прощения -> Вариант № 1 работает идеально — это была моя ошибка — я изменил другое в своем коде — так что извините и спасибо за помощь… я отметил ваш ответ как свой ответ