Постбэк AsyncFileUpload вызывает двойную загрузку

Я реализовал элемент управления AsyncFileUpload на веб-странице. Для этой веб-страницы загруженные файлы должны отображаться в GridView.
GridView содержит следующие столбцы: "Имя файла", "Конфиденциально" и " Удалить", чтобы удалить загруженный файл.

Так как AsyncFileUpload обратная передача не выполняет обратную передачу полной страницы, мне нужно "форсировать" обратную передачу для события OnClientUploadComplete элемента управления AsyncFileUpload, чтобы отобразить представление сетки после загрузки файла.
В OnClientUploadCompleteEvent, я использую javascript для вызова __doPostBack. В этой обратной передаче я только привязываю свой GridView и отображаю информацию о файле (я не сохраняю файл повторно).

Проблема: При первой «частичной» обратной передаче AsyncFileUpload файл успешно загружен, как и ожидалось. При второй обратной передаче, которую я вызываю с помощью __doPostBack, файл загружается повторно.
Вы можете проверить это с помощью Google Chrome, который отображает ход загрузки. Поведение следующее:
 – После выбора файла прогресс увеличивается с 0 % до 100 %, и файл загружается.
 – После этого выполняется __doPostBack, и вы снова видите приращение процесса загрузки. от 0% до 100%.

Как я могу убедиться, что Gridview заполнен правильно, но файл не загружается дважды?

Я прикрепил пример решения проблемы: https://www.yousendit.com/download/MzZFc2ZBNDRrYUN4dnc9PQ


person user619814    schedule 16.02.2011    source источник
comment
Пожалуйста, помогите мне @user619814: stackoverflow.com/questions/18682909/   -  person Ali Ahmadi    schedule 08.09.2013


Ответы (6)


Может некрасиво, но работает:


1) Добавьте css-hidden asp:Button ниже элемента управления asp:AsyncFileUpload AsyncFileUpload1.

<asp:Button runat="server" ID="btnClick" Text="Update grid" style="display:none"/>

2) На методе Page_Load удалить if (Request.Params.Get("__EVENTTARGET") == "UploadPostback") и поставить его блок в простой else к предыдущему if.

3) На функции AsyncFileUpload1_UploadedComplete также удалить строку if (Request.Params.Get("__EVENTTARGET") != "UploadPostback"), но оставить нетронутым все, что было внутри нее.

4) Вернуться к aspx. Поместите asp:UpdatePanel вне сетки GridView1.

<asp:UpdatePanel runat="server" UpdateMode="Conditional">
     <Triggers>
         <asp:AsyncPostBackTrigger ControlID="btnClick" EventName="Click" />
     </Triggers>
     <ContentTemplate>

     <asp:GridView ID="GridView1" ...
     YOUR GRID CODE REMAINS THE SAME
     </asp:GridView>

    </ContentTemplate>
</asp:UpdatePanel>

5) Последний шаг — изменить функцию JavaScript на стороне клиента AjaxUploadComplete, чтобы она запускала обратную передачу. Замените его следующим:

function AjaxUploadComplete() {
    var btnClick = document.getElementById("btnClick");
    btnClick.click();
}

Любой файл, выбранный пользователем, загружается только один раз.
Все изменения здесь предназначены для внесения в файлы AjaxUpload.aspx и AjaxUpload.aspx.cs вашего файла AjaxUpload.zip.

person tiago2014    schedule 16.02.2011
comment
Это было бы не совсем то, что я бы написал для реализации такого поведения, но я сделал меньше возможных изменений, чтобы ваши цели были достигнуты. - person tiago2014; 17.02.2011
comment
Спасибо tiagoinu, ваше решение работает. Ты жжешь! - person user619814; 18.02.2011
comment
Пожалуйста, помогите мне @tiagoinu: stackoverflow.com/questions/18682909/ - person Ali Ahmadi; 08.09.2013

Есть более простое решение

@@t0x1n3Сам решение, которое ты дал, очень простое, но не работает

окружите AsyncFileUpload панелью обновления, назовите ее UpdatePanelAFU, затем в UpdatePanelAFU сделайте следующее:

 protected void AsyncFileUpload_UpdatePanelAFU(object sender,AjaxControlToolkit.AsyncFileUploadEventArgs e)
{

    if (Request.Params.Get("__EVENTTARGET") != "UpdatePanelAFU")
        return;
..... rest of the code 
}

Наслаждайтесь!

person Shomaail    schedule 10.02.2014

Я считаю, что @Veera была права. UploadComplete вызывался несколько раз во время загрузки файла. Следующее сработало для меня.

void AsyncFileUpload1_UploadedComplete(object sender, AsyncFileUploadEventArgs e) {
    if (AsyncFileUpload1.IsUploading) return;
    // rest of your upload code
}

person Thomas Johnson    schedule 11.04.2015
comment
Немного поздно, но у меня та же проблема, и я попытался использовать IsUploading, но я получаю неопределенное значение для AsyncFileUpload1.IsUploading (при условии, что идентификатор элемента управления был AsyncFileUpload1, завернутый в UpdatePanel) - person NoBullMan; 15.12.2016
comment
Убедитесь, что у вас есть элемент управления AsyncFileUpload. Скорее всего, вы не получили ссылку на элемент управления, и он равен NULL (ничего). - person Thomas Johnson; 16.12.2016

У меня нет доступа к вашему образцу решения, которое содержит проблему, но я также сталкиваюсь с двойной обратной передачей в моем проекте с компонентом AsyncFileUpload. Я нашел очень простой обходной путь:

Просто добавь:

private bool justUploaded = false;

Потом:

void AsyncFileUpload1_UploadedComplete(object sender, AsyncFileUploadEventArgs e)
{
    if (justUploaded) return;
    justUploaded = true;
    // rest of your upload code
}
person ToXinE    schedule 16.05.2013

Я считаю это более элегантным решением, найденным здесь: http://forums.asp.net/t/1951566.aspx?AsyncFileUpload+uploads+twice), но ниже приведен мой измененный полностью рабочий код:

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title>AsyncFileUpload Example</title>
    <script type = "text/javascript">
        function uploadComplete(sender) {
            $get("<%=lblMesg.ClientID%>").innerHTML = "File Uploaded Successfully";
            clearContents();
        }


        function uploadError(sender) {
            $get("<%=lblMesg.ClientID%>").innerHTML = "File upload failed.";
            clearContents();
        }


    function clearContents() {
            var span = $get("<%=AsyncFileUpload1.ClientID%>");
            var txts = span.getElementsByTagName("input");
            for (var i = 0; i < txts.length; i++) {
                if (txts[i].type == "text") {
                    txts[i].value = "";
                }
                if (txts[i].type == "file") {
                    txts[i].value = "";
                }
            }
        }
    </script>
</head>
<body>
    <form id="form1" runat="server">
        <asp:ScriptManager ID="ScriptManager1" runat="server">
        </asp:ScriptManager>
        <cc1:AsyncFileUpload OnClientUploadError="uploadError"
            OnClientUploadComplete="uploadComplete" runat="server"
            ID="AsyncFileUpload1" Width="400px" UploaderStyle="Modern" EnableViewState = "false"
            UploadingBackColor="#CCFFFF"  ThrobberID="imgLoader" OnUploadedComplete = "FileUploadComplete"
          />
        <asp:Image ID="imgLoader" runat="server" ImageUrl = "~/images/loader.gif" />
        <br />
       <asp:Label ID="lblMesg" runat="server" Text=""></asp:Label>






    </form>
</body>
</html>
person Flo    schedule 27.05.2014

AsyncFileUpload имеет свойство с именем IsUploading. когда для этого свойства установлено значение false, произойдет postback. вы можете проверить это свойство следующим образом:

if(AsyncFileUpload1.IsUploading)
 {
  ..... upload codes
 }
person zahra ghanbari    schedule 19.11.2014