5

AsyncFileUploadコントロールをWebページに実装しました。このWebページでは、アップロードされたファイルをに表示する必要がありますGridViewには、「ファイル名」、「機密」チェックボックス、およびアップロードされたファイルを削除するための「削除」ボタン
GridView列が含まれています。

ポストバックはページ全体AsyncFileUploadポストバックを実行しないため、ファイルのアップロード後にグリッドビューをレンダリングするには、AsyncFileUploadコントロールのイベントでポストバックを「強制」する必要があります。 では、javascriptを使用してを呼び出します。このポストバックでは、GridViewをバインドしてファイル情報を表示するだけです(ファイルを再保存しません)。OnClientUploadComplete
OnClientUploadCompleteEvent__doPostBack

問題:AsyncFileUpload最初の「部分的な」ポストバックで、ファイルは期待どおりに正常にアップロードされます。で強制する2番目のポストバックで__doPostBack、ファイルが再アップロードされます。
これは、アップロードの進行状況を表示するGoogleChromeを使用して確認できます。動作は次のとおりです
。-ファイルを選択すると、進行状況が0%から100%に増加し、ファイルがアップロードされます。
-この後、が__doPostBack実行され、アップロードの進行状況が0%から100%に再び増加することがわかります。

Gridviewが適切に設定されているが、ファイルが2回アップロードされていないことを確認するにはどうすればよいですか?

問題を含むサンプルソリューションを添付しました:https: //www.yousendit.com/download/MzZFc2ZBNDRrYUN4dnc9PQ

4

6 に答える 6

3

より簡単な解決策があります

@@ t0x1n3彼自身uが与えた解決策は非常に単純ですが、機能しません

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();
}

ユーザーが選択したファイルは1回だけアップロードされます。
ここでのすべての変更は、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

問題を含むサンプルソリューションにアクセスできませんが、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 に答える
0

私はこれがよりエレガントな解決策であると思います: http://forums.asp.net/t/1951566.aspx? AsyncFileUpload + uploads + twoce)が、以下は私の変更された完全に機能するコードです:

<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に設定されている場合、a postbackが発生します。このプロパティは次のように確認できます。

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