5

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

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

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

如何确保正确填充了 Gridview,但文件没有上传两次?

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

4

6 回答 6

3

有一个更简单的解决方案

@@t0x1n3Himself 你给出的解决方案很简单,但不起作用

在 AsyncFileUpload 周围加上一个更新面板名称UpdatePanelAFU 然后在 UpdatePanelAFU 中执行以下操作:

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

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

请享用!

于 2014-02-10T07:34:56.817 回答
2

也许丑陋,但有效:


1) 在 asp:AsyncFileUploadAsyncFileUpload1控件下方添加一个 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。在网格 GridView1 之外放置一个 asp:UpdatePanel。

<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.zip 的 AjaxUpload.aspx 和 AjaxUpload.aspx.cs 中进行。

于 2011-02-16T21:29:34.523 回答
1

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

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

于 2015-04-11T00:48:29.153 回答
0

I find this a more elegant solution, found here: http://forums.asp.net/t/1951566.aspx?AsyncFileUpload+uploads+twice) but below is my altered fully working code:

<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>
于 2014-05-27T02:27:36.570 回答
0

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

if(AsyncFileUpload1.IsUploading)
 {
  ..... upload codes
 }
于 2014-11-19T10:14:45.910 回答
0

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

只需添加:

private bool justUploaded = false;

然后:

void AsyncFileUpload1_UploadedComplete(object sender, AsyncFileUploadEventArgs e)
{
    if (justUploaded) return;
    justUploaded = true;
    // rest of your upload code
}
于 2013-05-16T07:48:23.077 回答