Обратный вызов никогда не заканчивается из-за этого кода -> Response .Перенаправление(«~/ Handler.ashx?path=» {Path});

#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, но я думаю, что вы в значительной степени ответили на это сами, когда сказали, что «обратный вызов никогда не заканчивается, и когда появляется диалоговое окно сохранения как, область повторителя переходит в режим мышления и отключается».

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

Два варианта, которые вы могли бы рассмотреть::

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

Комментарии:

1. спасибо за ответ / ошибка варианта № 1 -> таким же образом / последним способом является вариант № 2 / но есть ли какой-либо другой способ исправить эту проблему?

2. К сожалению, я не слишком хорошо знаком с панелями обновления, поэтому не уверен, почему опция не работает. Пока нет перенаправлений, я бы подумал, что ответ должен был просто вернуться, как и ожидалось. Если у меня будет время, я продолжу расследование, но, надеюсь, кто-то еще может появиться с объяснением.

3. Проверьте это, возможно, проблема с повторителями в панелях обновления: forums.asp.net/p/1029795/1410614.aspx

4. дорогой Энди Роуз, прошу прощения -> Вариант № 1 работает идеально — это была моя ошибка — я изменил другое в своем коде — так что извините и спасибо за помощь… я отметил ваш ответ как свой ответ