3

同じページに2つのajaxtoolkitファイルulopadがあります。

 <ajaxToolkit:AjaxFileUpload
        id="AjaxFileUpload1"
        AllowedFileTypes="jpg,jpeg,gif,png"
        OnUploadComplete="ajaxUpload2_OnUploadComplete"
        runat="server"  />
         <ajaxToolkit:AjaxFileUpload
        id="ajaxUpload1"
        AllowedFileTypes="jpg,jpeg,gif,png"
        OnUploadComplete="ajaxUpload1_OnUploadComplete"
        runat="server"  />

とコードビハインド

protected void ajaxUpload2_OnUploadComplete(object sender, AjaxControlToolkit.AjaxFileUploadEventArgs e)
    {

        string filePath = "~/Images/" + e.FileName;
        filePath = filePath.Split('\\').Last();
        Session["img2"] = filePath.ToString();
        AjaxFileUpload1.SaveAs(MapPath(filePath));

    }

    protected void ajaxUpload1_OnUploadComplete(object sender, AjaxControlToolkit.AjaxFileUploadEventArgs e)
    {

        string filePath = "~/Images/" + e.FileName;
        filePath = filePath.Split('\\').Last();
        Session["img1"] = filePath.ToString();
        ajaxUpload1.SaveAs(MapPath(filePath));

    }

問題は、upload AjaxFileUpload1を使用すると、それが機能してvoid ajaxUpload2_OnUploadCompleteメソッドを呼び出すことですが、ajaxUpload1を使用すると、メソッドajaxUpload2_OnUploadCompleteが再度呼び出されますが、メソッドajaxUpload1は呼び出されません。

なぜ??

ありがとう。

4

3 に答える 3

4

昨日同じ問題が発生し、同じページにAjaxFileUploadのインスタンスを複数持つことはできないことがわかりました。

ソースコードを見ると、このコントロール一定のGUIDを使用してイベントを識別していることがわかります。GUIDは定数であるため、AjaxFileUploadのすべてのインスタンスが同じGUIDを使用します。..

結果 :

最初のインスタンスはすべてのイベントを飲み込みます...

動作中のGUIDは次のとおりです。

private const string ContextKey = "{DA8BEDC8-B952-4d5d-8CC2-59FE922E2923}";

(...)

if (this.Page.Request.QueryString["contextkey"] == ContextKey && this.Page.Request.Files.Count > 0)
于 2012-05-31T08:37:25.937 に答える
2

2012年9月のツールキットを次のようにカスタマイズしました。これが一時的な回避策であり、将来のリリースで修正されることを願っています。

private const string ContextKey = "{DA8BEDC8-B952-4d5d-8CC2-59FE922E2923}";

新着

private string ContextKey = "";

public AjaxFileUpload()
            : base(true, HtmlTextWriterTag.Div)
        {
        }

新着

public AjaxFileUpload()
            : base(true, HtmlTextWriterTag.Div)
        {
            if (HttpContext.Current.Items["lastAjaxFileUploadContextKey"] == null)
            {
                HttpContext.Current.Items["lastAjaxFileUploadContextKey"] = 1;
            }
            else
            {
                HttpContext.Current.Items["lastAjaxFileUploadContextKey"] = (int)HttpContext.Current.Items["lastAjaxFileUploadContextKey"] + 1;
            }

            ContextKey = HttpContext.Current.Items["lastAjaxFileUploadContextKey"].ToString();
        }
于 2012-12-11T17:18:20.527 に答える
1

実際には、1つのページで複数のAjaxFileUploadコントロールを使用する方法があり、各コントロールは独自のイベントを発生させます。解決策は非常に簡単です。これには、AjaxFileUploadコントロールのMicrosoftのクライアント側関数の1つをオーバーライドして、アップロード完了イベントを実際に引き起こしたコントロールに関する情報を挿入し、すべてのAjaxFileUploadコントロールの単一のイベントハンドラーを「スイッチボード」として使用することが含まれます。イベントサーバー側を作成したコントロールの正しいイベントハンドラー。

方法は次のとおりです。

このスクリプトブロックをページのhead要素の後のどこかに追加します。マスターページを使用している場合は、これをHTMLコンテンツのプレースホルダーに入れます。

<script type="text/javascript">
    Sys.Extended.UI.AjaxFileUpload.Control.prototype.doneAndUploadNextFile = function (c) {
        var a = new XMLHttpRequest, b = this;
        a.open("POST", "?contextKey=" + this._contextKey + "&done=1&guid=" + c._id + "&uplCtrlID=" + b.get_id(), true);
        a.onreadystatechange = function () {
            if (a.readyState == 4) if (a.status == 200) {
                b.raiseUploadComplete(Sys.Serialization.JavaScriptSerializer.deserialize(a.responseText));
                b._processor.startUpload()
            }
            else {
                b.setFileStatus(c, "error", Sys.Extended.UI.Resources.AjaxFileUpload_error);
                b.raiseUploadError(a);
                throw "error raising upload complete event and start new upload";
            }
        };
        a.send(null);
    }
</script>

このコードは、ページを呼び出してUploadCompleteイベントをトリガーするために使用されるのと同じ関数ですが、実際にイベントを引き起こしたコントロールのIDを含む追加のパラメーターuplCtrlIDを追加するように変更されています。

サーバー側のコードを次のように設定します。

//set the OnUploadComplete property on all of your AjaxFileUpload controls to this method
protected void anyUploader_UploadComplete(object sender, AjaxFileUploadEventArgs e)
    {
        //call the correct upload complete handler if possible
        if (Request.QueryString["uplCtrlID"] != null)
        {
            //uplCtrlID (the query string param we injected with the overriden JS function)
            //contains the ID of the uploader.
            //We'll use that to fire the appropriate event handler...
            if (Request.QueryString["uplCtrlID"] == FileUploaderA.ClientID)
                FileUploaderA_UploadComplete(FileUploaderA, e);
            else if (Request.QueryString["uplCtrlID"] == FileUploaderB.ClientID)
                FileUploaderB_UploadComplete(FileUploaderB, e);
            //etc (or use a switch block - whatever suits you)
        }
    }
    protected void FileUploaderA_UploadComplete(AjaxFileUpload sender, AjaxFileUploadEventArgs e)
    {
        //logic here
    }
    protected void FileUploaderB_UploadComplete(AjaxFileUpload sender, AjaxFileUploadEventArgs e)
    {
        //logic here
    }

これで準備は完了です。同じページに複数のAjaxFileUploadコントロールがあり、問題はありません。

于 2013-06-07T15:05:48.613 に答える