AsyncFileUpload回发导致双重上传

时间:2011-02-16 15:01:45

标签: c# asp.net ajax gridview asyncfileupload

我在网页上实现了AsyncFileUpload控件。此网页要求上传的文件显示在GridView GridView包含以下列:“文件名”,“机密”复选框以及“删除”按钮删除上传的文件。

由于AsyncFileUpload回发没有执行整页回发,我需要在AsyncFileUpload控件的OnClientUploadComplete事件上“强制”回发以便呈现上传文件后的gridview 在OnClientUploadCompleteEvent中,我使用javascript来调用__doPostBack。在这个回发中,我只绑定我的GridView并显示文件信息(我不重新保存文件)。

问题:AsyncFileUpload的第一个“部分”回发上,文件已按预期成功上传。在我使用__doPostBack强制进行的第二次回发中,文件会重新上传。
您可以使用显示上传进度的Google Chrome来验证这一点。行为如下:
  - 选择文件后,进度从0%增加到100%并上传文件   - 在此之后,执行__doPostBack,您可以再次看到上传进度从0%增加到100%。

如何确保Gridview已正确填充,但文件未上载两次?

我附上了一个包含问题的示例解决方案:https://www.yousendit.com/download/MzZFc2ZBNDRrYUN4dnc9PQ

6 个答案:

答案 0 :(得分:3)

有一个更简单的解决方案

  

@@ t0x1n3我自己给出的解决方案非常简单但不起作用

使用更新面板名称围绕AsyncFileUpload UpdatePanelAFU 然后在UpdatePanelAFU中执行以下操作:

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

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

享受!

答案 1 :(得分:2)

也许很丑,但有效:


1) 在asp:AsyncFileUpload AsyncFileUpload1控件下面添加一个css-hidden asp:Button。

<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) 最后一步是更改AjaxUploadComplete客户端javascript函数,使其触发回发。 将其替换为以下内容:

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

用户选择的任何文件只上传一次 这里的所有更改都是在AjaxUpload.aspx&amp; AjaxUpload.zip的AjaxUpload.aspx.cs。

答案 2 :(得分:1)

我相信@Veera是对的。在文件上传时,多次调用UploadComplete。以下对我有用。

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

答案 3 :(得分:0)

我无法访问包含该问题的示例解决方案,但在我的项目中也遇到了使用AsyncFileUpload组件的双重回发。 我找到了一个非常简单的解决方法:

只需添加:

private bool justUploaded = false;

然后:

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

答案 4 :(得分:0)

我发现这是一个更优雅的解决方案,可以在这里找到: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>

答案 5 :(得分:0)

AsyncFileUpload有一个名为IsUploading的属性。 当此属性设置为false时,将发生postback。 你可以这样检查这个属性:

if(AsyncFileUpload1.IsUploading)
 {
  ..... upload codes
 }