AjaxFileUpload:如何在OnUploadComplete中警告用户服务器端错误?

时间:2013-10-02 19:32:11

标签: asp.net error-handling ajaxcontroltoolkit

我已经让AjaxFileUpload控件工作得很好 - 它上传,并在完成时调用服务器端代码来移动文件,工作得很好等等。

我担心的是潜在的服务器端错误,以及如何向用户提供某种警告。不是Ajax错误,而是服务器端代码。

现在,我已经运行了log4net,并且在我的错误捕获代码中调用它,并且在我对错误进行硬编码时快速转储日志。

但这并没有告诉用户任何事情。

RegisterStartupScript似乎不是一个有效的解决方案,因为没有PostBack可以让它运行(就像我第一次尝试填充字段一样。多哈!)。

现在,我可以将一些JS推送到ClientUploadCompleteClientUploadCompleteAll来做一个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>

1 个答案:

答案 0 :(得分:1)

虽然AjaxFileUploadState枚举包含Failed成员,但我无法找到使用它的任何情况。

所以我相信有两种解决方案可供使用。

第一个是调整ACT项目,将StateStatusMessage类的属性添加到AjaxFileUploadEventArgs类,并在raiseUploadComplete onUploadCompleteHandler函数的客户端上处理这些属性的值{3}}类和Sys.Extended.UI.AjaxFileUpload.ControlAjaxFileUploadEventArgs.PostedUrl

或者您可以通过OnClientUploadComplete属性将自定义JSON传递给客户端,在PostedUrl处理程序中的客户端上反序列化它,并显示错误消息(如果有)。请查看此问题,了解使用情况{{1}}属性:Sys.Extended.UI.AjaxFileUpload.ProcessorHtml5