我在网页上实现了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
答案 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
}