[英]AsyncFileUpload postback causes double upload
我在網頁上實現了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
有一個更簡單的解決方案
@@ t0x1n3Himself您提供的解決方案非常簡單,但不起作用
在AsyncFileUpload周圍放置一個名為UpdatePanelAFU的更新面板,然后在UpdatePanelAFU中執行以下操作:
protected void AsyncFileUpload_UpdatePanelAFU(object sender,AjaxControlToolkit.AsyncFileUploadEventArgs e)
{
if (Request.Params.Get("__EVENTTARGET") != "UpdatePanelAFU")
return;
..... rest of the code
}
請享用!
也許很難看,但是可以工作:
1)在asp:AsyncFileUpload AsyncFileUpload1
控件下面添加一個css隱藏的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中進行。
我相信@Veera正確。 文件上傳時,多次調用UploadComplete。 以下對我有用。
void AsyncFileUpload1_UploadedComplete(object sender, AsyncFileUploadEventArgs e) { if (AsyncFileUpload1.IsUploading) return; // rest of your upload code }
我無權訪問包含該問題的示例解決方案,但在我的帶有AsyncFileUpload組件的項目中,我也遇到了兩次回發。 我發現了一個非常簡單的解決方法:
只需添加:
private bool justUploaded = false;
然后:
void AsyncFileUpload1_UploadedComplete(object sender, AsyncFileUploadEventArgs e)
{
if (justUploaded) return;
justUploaded = true;
// rest of your upload code
}
我發現這是一個更優雅的解決方案,可以在這里找到: 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>
AsyncFileUpload
具有一個名為IsUploading
的屬性。 當此屬性設置為false時,將發生postback
。 您可以像這樣檢查此屬性:
if(AsyncFileUpload1.IsUploading)
{
..... upload codes
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.