我已经让AjaxFileUpload
控件工作得很好 - 它上传,并在完成时调用服务器端代码来移动文件,工作得很好等等。
我担心的是潜在的服务器端错误,以及如何向用户提供某种警告。不是Ajax错误,而是服务器端代码。
现在,我已经运行了log4net,并且在我的错误捕获代码中调用它,并且在我对错误进行硬编码时快速转储日志。
但这并没有告诉用户任何事情。
RegisterStartupScript
似乎不是一个有效的解决方案,因为没有PostBack可以让它运行(就像我第一次尝试填充字段一样。多哈!)。
现在,我可以将一些JS推送到ClientUploadComplete
或ClientUploadCompleteAll
来做一个PostBack ......但这似乎不对,它需要服务器端错误消息排队等候显示。此外,它会清除AjaxFileUpload
显示已上传的内容。
我见过的关于这些控件的所有错误处理都是针对Ajax错误的。 是否有任何服务器端问题可以让用户轻松反馈?
我甚至吠叫正确的树木?
更新使用指针@ Yuriy's other answer我有以下工作:
在服务器端:
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>
答案 0 :(得分:1)
虽然AjaxFileUploadState
枚举包含Failed
成员,但我无法找到使用它的任何情况。
所以我相信有两种解决方案可供使用。
第一个是调整ACT项目,将State
和StatusMessage
类的属性添加到AjaxFileUploadEventArgs
类,并在raiseUploadComplete
onUploadCompleteHandler
函数的客户端上处理这些属性的值{3}}类和Sys.Extended.UI.AjaxFileUpload.Control类AjaxFileUploadEventArgs.PostedUrl
。
或者您可以通过OnClientUploadComplete
属性将自定义JSON传递给客户端,在PostedUrl
处理程序中的客户端上反序列化它,并显示错误消息(如果有)。请查看此问题,了解使用情况{{1}}属性:Sys.Extended.UI.AjaxFileUpload.ProcessorHtml5