2

コントロールはAjaxFileUpload問題なく動作しています。アップロードが完了すると、サーバー側のコードを呼び出してファイルを移動したり、問題なく動作したりします。

私が心配しているのは、潜在的なサーバー側のエラーと、何らかの警告をユーザーに返す方法です。Ajax エラーではなく、サーバー側のコードに問題があります。

これで、log4net が正常に動作し、エラーをハードコーディングしたときにエラー トラップ コードで呼び出され、ログを楽しくダンプできます。

しかし、それはユーザーに何も伝えません。

RegisterStartupScriptそれを動作させるPostBackがないため、有効な解決策ではないようです(フィールドにデータを入力する最初の試みと同じです.doh!)。

ClientUploadCompleteこれで、またはにJS を押し込んClientUploadCompleteAllで PostBack を実行できます... しかし、それは正しくないようで、サーバー側のエラー メッセージを表示するためにキューに入れる必要があります。AjaxFileUploadさらに、アップロードされたものの表示をクリアします。

これらのコントロールに関して私が見たすべてのエラー処理は、Ajax エラー用です。ユーザーへの簡単なフィードバックを可能にするサーバー側の問題について何かありますか?

私は正しい木を吠えていますか?


UPDATEポインター@ Yuriyの他の回答を使用して、次の作業を行いました:

サーバー側:

    protected void OnUploadComplete(object sender, AjaxFileUploadEventArgs e)
    {
        try
        {
            // does something with the uploaded files that _might_ fail
        }
        catch (Exception ex)
        {
            var ce = Logger.LogError(ex);

            var msg = string.Format("{{ 'id': '{0}', 'message': '{1}'}}",
                 ce.ErrorId, ce.Message);
            e.PostedUrl = msg;
        }
    }

(ロガーは完全な例外を log4net ログにダンプし、サポートに連絡するためにエラー番号と消費者にわかりやすいメッセージを返します)

ページに戻ると、AjaxFileUploadコントロールは完了時に JS を呼び出すように構成されています。

<asp:AjaxFileUpload runat="server" ID="Uploader" MaximumNumberOfFiles="10"
OnUploadComplete="OnUploadComplete"
OnClientUploadComplete="AjaxFileUpload1_OnClientUploadComplete"/>

そしてJavaScript:

<script type="text/javascript">
    function AjaxFileUpload1_OnClientUploadComplete(sender, args) {

        var errText = args.get_postedUrl();
        if (!errText) return; // only process if populated

        var errinfo = Sys.Serialization.JavaScriptSerializer.deserialize(errText);

        if (errinfo && errinfo.id && errinfo.message) {
            var idEl = document.getElementById('errnbr');
            var msgEl = document.getElementById('errmsg');
            if (idEl && msgEl) {
                idEl.innerHTML = errinfo.id;
                msgEl.innerHTML = errinfo.message;
            }
        }
    }
</script>

これにより、以下が入力されます。

<div class="failureNotification" id="ErrorDisplay" runat="server">
    <span id="errnbr"><asp:Literal ID="ErrorNumber" runat="server"></asp:Literal></span>
    <span id="errmsg"><asp:Literal ID="FailureText" runat="server"></asp:Literal></span>
</div>
4

1 に答える 1

1

AjaxFileUploadState列挙にはメンバーが含まれていFailedますが、使用されているケースは見つかりません。

したがって、私が信じている2つの解決策があります。

1 つ目は、ACT プロジェクトを微調整して、クラスのセッターStateStatusMessageプロパティを追加し、Sys.Extended.UI.AjaxFileUpload.C​​ontrolクラスとSys.Extended.UI.AjaxFileUpload.ProcessorHtml5クラスの関数でAjaxFileUploadEventArgsクライアント上でこれらのプロパティの値を処理することです。raiseUploadCompleteonUploadCompleteHandler

または、カスタム JSON をプロパティ経由でクライアントに渡しAjaxFileUploadEventArgs.PostedUrl、クライアントのハンドラーで逆シリアル化し、OnClientUploadCompleteエラー メッセージがあれば表示することもできます。PostedUrl使用プロパティのサンプルについては、この質問を確認してください:ボタンのクリック時に asynfileupload コントロールのファイル名を取得する

于 2013-10-03T08:35:58.547 に答える