コントロールは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>