2

我的AjaxFileUpload控件工作得很好——它上传,完成后调用服务器端代码来移动文件,工作得很好,等等等等。

我担心的是潜在的服务器端错误,以及如何将某种警告交还给用户。不是 Ajax 错误,而是服务器端代码上的一些错误。

现在,我的 log4net 运行得很好,它在我的错误捕获代码中被调用,当我硬编码错误时,它会愉快地转储日志。

但这并不能告诉用户任何事情。

RegisterStartupScript似乎不是一个有效的解决方案,因为没有允许它运行的 PostBack(与我第一次尝试填充字段一样。doh!)。

现在,我可以将一些 JS 推入ClientUploadCompleteClientUploadCompleteAll执行 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>
4

1 回答 1

1

尽管AjaxFileUploadState枚举包含Failed成员,但我找不到使用它的任何情况。

所以我相信有两种解决方案。

首先是调整 ACT 项目以在Sys.Extended.UI.AjaxFileUpload.C​​ontrol类和Sys.Extended.UI.AjaxFileUpload.ProcessorHtml5类的函数中添加设置器State和类的StatusMessage属性,AjaxFileUploadEventArgs并在客户端处理这些属性的值。raiseUploadCompleteonUploadCompleteHandler

或者您可以通过AjaxFileUploadEventArgs.PostedUrl属性将自定义 JSON 传递给客户端,在OnClientUploadComplete处理程序中的客户端上对其进行反序列化,并显示错误消息(如果有)。请检查此问题以获取使用PostedUrl属性示例:getting asynfileupload controls file name on button click

于 2013-10-03T08:35:58.547 回答