需要进行Html Decod——这在JavaScript中可不是一件容易实现的工作。最后我从网上找了一个JavaScript版本的HTML Decode函数才算解决这个问题。此外还有一个问题就和浏览器密切相关了:IE中的换行字符为“\r\n”,而FireFox中的换行字符为“\n”,因此同样的字符串经过IFrame的传递之后实际就改变了。在普通情况下这不会造成太大问题,不过UpdatePanel客户端的解析逻辑与字符串长度密切相关,因此我们需要将结果中的\n替换成\r\n才能让功能正常运行。同样地,我们在服务器端如果手动输出HTML时,就必须输出\r\n而不是\n。
经过我的简单测试,这个方法能够支持IE6+以及FireFox 1.5+的浏览器,不过没有测试过Safari或Opera浏览器。理论上,您可以使用更好的办法来替换这个基于jQuery的实现,甚至您可以避免使用IFrame传递的方式,而改用其他的解决方案,例如swfupload。如果您发现示例中的方法有什么问题,或者有更好的做法请联系我。
控件的使用
由于UpdatePanelFileUpload控件的工作原理是欺骗ScriptManager,将其修改为普通异步调用的状态,因此我们要尽可能早地做到这一点。所以在使用这个控件时必须将其紧跟着ScirptManager摆放,页面中的ScriptManager和UpdatePanelFileUpload控件之间存在任何其他ASP.NET AJAX控件,就可能会产生一些不可预知的问题。以下是附件中的使用示例:
<script type="text/C#" runat="server">
protected void btnUpload_Click(object sender, EventArgs e)
{
this.lblFileSize.Text = this.fileUpload.PostedFile.ContentLength.ToString();
}
</script>
<form id="form1" runat="server">
<asp:ScriptManager runat="server" ID="sm">
<Scripts>
<asp:ScriptReference Path="Scripts/jquery-1.2.3.js" />
<asp:ScriptReference Path="Scripts/jquery.form.js" />
</Scripts>
</asp:ScriptManager>
<ajaxExt:UpdatePanelFileUpload ID="UpdatePanelFileUpload1" runat="server"
ExecuteMethod="executeForm" />
<asp:UpdatePanel runat="server" ID="up1">
<ContentTemplate>
<%= DateTime.Now %><br />
<asp:Label runat="server" ID="lblFileSize" />
</ContentTemplate>
<Triggers>
<asp:AsyncPostBackTrigger ControlID="btnUpload" />
</Triggers>
</asp:UpdatePanel>
<asp:FileUpload runat="server" ID="fileUpload" />
<asp:Button runat="server" ID="btnUpload" Text="Upload"
onclick="btnUpload_Click" />
</form>
| /uploads/soft/1_080728033253.zip |