我的AjaxFileUpload
控件工作得很好——它上传,完成后调用服务器端代码来移动文件,工作得很好,等等等等。
我担心的是潜在的服务器端错误,以及如何将某种警告交还给用户。不是 Ajax 错误,而是服务器端代码上的一些错误。
现在,我的 log4net 运行得很好,它在我的错误捕获代码中被调用,当我硬编码错误时,它会愉快地转储日志。
但这并不能告诉用户任何事情。
RegisterStartupScript
似乎不是一个有效的解决方案,因为没有允许它运行的 PostBack(与我第一次尝试填充字段一样。doh!)。
现在,我可以将一些 JS 推入ClientUploadComplete
或ClientUploadCompleteAll
执行 PostBack... 但这似乎不对,它需要将服务器端错误消息排队显示。另外,它会清除AjaxFileUpload
已上传内容的显示。
我看到的关于这些控件的所有错误处理都是针对 Ajax 错误的。是否有任何服务器端问题可以轻松反馈给用户?
我什至在吠叫正确的树吗?
更新使用@ 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;
}
}
(Logger 将完整的异常转储到 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>