我AsyncFileUpload在网页上实现了控件。此网页要求上载的文件显示在中GridView。 其中GridView包含以下列:“ 文件名 ”,“ 机密 ”复选框和“ 删除 ”按钮,用于删除上载的文件。
AsyncFileUpload
GridView
由于AsyncFileUpload回发不执行 整页 回发,因此我需要OnClientUploadComplete在AsyncFileUpload控件的事件中“强制”回发,以便在上传文件后呈现gridview。 在中OnClientUploadCompleteEvent,我使用javascript进行调用__doPostBack。在此回发中,我仅绑定GridView并显示文件信息(我不重新保存文件)。
OnClientUploadComplete
OnClientUploadCompleteEvent
__doPostBack
问题: 在AsyncFileUpload第一次“部分”回发中,文件已按预期成功上传。在我强制执行的第二次回发中__doPostBack,该文件被重新上传。 您可以使用显示加载进度的Google Chrome进行验证。行为如下: -选择文件后,进度从0%递增到100%,并上传了文件。 -之后,__doPostBack执行,您可以再次看到上传进度从0%递增到100%。
如何确保Gridview正确填充,但是文件没有上传两次?
我附上了包含该问题的示例解决方案:https : //www.yousendit.com/download/MzZFc2ZBNDRrYUN4dnc9PQ
可能很难看,但可以:
1)在asp:AsyncFileUpload AsyncFileUpload1控件下方添加一个css隐藏的asp:Button 。
AsyncFileUpload1
<asp:Button runat="server" ID="btnClick" Text="Update grid" style="display:none"/>
2)在Page_Load方法,删除if (Request.Params.Get("__EVENTTARGET") == "UploadPostback")并把其块以简单的else到先前if。
Page_Load
if (Request.Params.Get("__EVENTTARGET") == "UploadPostback")
else
if
3)在AsyncFileUpload1_UploadedComplete函数上,也删除该if (Request.Params.Get("__EVENTTARGET") != "UploadPostback")行,但保留其中的所有内容。
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函数以使其触发回发。将其替换为以下内容:
AjaxUploadComplete
function AjaxUploadComplete() { var btnClick = document.getElementById("btnClick"); btnClick.click(); }
用户选择的任何文件仅上传一次。 此处的所有更改都应在AjaxUpload.zip的AjaxUpload.aspx和AjaxUpload.aspx.cs中进行。