AsyncFileUpload 控件 - Ajax 控件工具包中的新控件






4.89/5 (31投票s)
本文演示了如何使用 Ajax Control Toolkit 中新推出的 AsyncFileUpload 控件。
引言
对于每个 .NET 开发者来说,Ajax Control Toolkit 并不陌生。新版本的 AJAX Control Toolkit 现在可以从 CodePlex 网站下载。这个新版本的 AJAX Control Toolkit 包含两个新控件:
- SeaDragon Java Script Code (SJC) - SJC 控件允许使用 SeaDragon 脚本显示图像,并使用鼠标按键缩放该图像,而无需调整窗口大小。我看到了 演示,这是一个非常酷的控件。
- AsyncFileUpload - 终于,我们有了一个可以异步上传文件的控件。这个新控件使您可以在不进行回发的情况下执行文件上传。控件在上传期间显示一个转动图像,并在上传完成后触发客户端和服务器事件。在这里查看实时 演示。
在本文中,我们将重点介绍 AsyncFileUpload
控件。
注意:此控件仅适用于 .NET 3.5 或更高版本。
AsyncFileUpload 控件特性
众所周知,ASP.NET 的文件上传控件在 update panel 中无法正常工作。如果我们想将其放在 update panel 中,还需要触发回发才能上传文件。这个很棒的控件允许您以异步方式上传文件。以下是关于此控件的一些关键点:
- 它可以在 Update Panel 中工作
- 它在没有任何回发的情况下上传文件
- 它提供客户端和服务器端事件
- 有不同的着色选项用于显示文件上传。例如,上传成功时显示绿色,上传失败时显示红色。
- 您可以在文件上传进行时显示加载图像。
但是它也有一些缺点
- 当我使用该控件时,一旦文件上传完毕,就没有办法清除文件上传控件的内容。
- 我查看了此控件的源代码,发现该控件将文件存储在 Session 中。它从不清除 Session,这意味着每次返回页面时,它都会将上次上传的文件加载到文本框中。
- 没有办法取消上传。
- 没有办法监控上传进度(完成了多少百分比)。
- 一旦您选择文件,上传就开始了。它将文件存储在 Session 中。
除了这些缺点,该控件看起来还是不错的。
现在让我们来看一下该控件的一些属性。
属性和方法
一些可用属性
-
CompleteBackColor
:此属性设置控件在成功上传时的背景颜色。默认值为 "Lime
"。 -
ErrorBackColor
:此属性设置控件在上传失败时的背景颜色。默认值为 "Red
"。 -
UploadingBackColor
:此属性设置控件在文件上传进行时的背景颜色。 -
UploaderStyle
:控件的样式有两种选项。传统和现代。默认值为 "Traditional
"。 -
ThrobberID
:在文件上传期间显示的控件的 ID。它将用于显示加载/进行中图像。 -
HasFile
:返回一个bool
值,指示控件是否具有文件。
可用事件
-
OnClientUploadError
:这是一个客户端事件。如果上传失败,则会执行指定的 JavaScript 函数。 -
OnClientUploadStarted
:这也是一个客户端事件。当上传开始时,将调用指定的 JavaScript 函数。此函数将在上传前调用,一旦执行此函数,上传就会开始。 -
OnClientUploadComplete
:这也是一个客户端事件。如果上传成功,则会执行指定的 JavaScript 函数。 -
onuploadedcomplete
:这是一个服务器端事件,将在上传完成后执行。这里需要注意的一点是,一旦您选择文件,上传就开始了,但它仍然在 Session 中。它没有存储在任何物理位置。在此事件中,我们可以指定路径并将文件保存到物理位置。一旦我们完成代码,事情就会变得清晰。
可用方法
SaveAs()
:此方法将文件保存在指定路径。
Using the Code
让我们创建一个新的网站,并添加对新下载的 AjaxControl ToolKit DLL 的引用。在 default.aspx 页面上,放置一个脚本管理器并注册 Ajax 控件工具包 DLL。
<%@ Register Assembly="AjaxControlToolkit"
Namespace="AjaxControlToolkit" TagPrefix="cc1" %>
现在让我们放置 AsyncFileUpload
控件。
<cc1:AsyncFileUpload ID="AsyncFileUpload1" Width="400px" runat="server"
OnClientUploadError="uploadError" OnClientUploadStarted="StartUpload"
OnClientUploadComplete="UploadComplete"
CompleteBackColor="Lime" UploaderStyle="Modern"
ErrorBackColor="Red" ThrobberID="Throbber"
onuploadedcomplete="AsyncFileUpload1_UploadedComplete"
UploadingBackColor="#66CCFF" />
我们可以将其放置在 update panel 内或外。正如您所见,我已经设置了上面解释过的大部分属性和事件。让我们放置 Throbber
控件以在进度图像中显示。拥有 ThrobberID
不是强制性的。如果设置了它,它将显示控件的内容。
<asp:Label ID="Throbber" runat="server" Style="display: none">
<img src="Images/indicator.gif" align="absmiddle" alt="loading" />
</asp:Label>
我还放置了一个标签在页面上,用于显示上传状态。此控件的值通过客户端函数更新。
<asp:Label ID="lblStatus" runat="server" Style="font-family: Arial;
font-size: small;"></asp:Label>
让我们放置 JavaScript 函数。
<script type="text/javascript" language="javascript">
function uploadError(sender,args)
{
document.getElementById('lblStatus').innerText = args.get_fileName(),
"<span style='color:red;'>" + args.get_errorMessage() + "</span>";
}
function StartUpload(sender,args)
{
document.getElementById('lblStatus').innerText = 'Uploading Started.';
}
function UploadComplete(sender,args)
{
var filename = args.get_fileName();
var contentType = args.get_contentType();
var text = "Size of " + filename + " is " + args.get_length() + " bytes";
if (contentType.length > 0)
{
text += " and content type is '" + contentType + "'.";
}
document.getElementById('lblStatus').innerText = text;
}
</script>
UploadComplete
函数在屏幕上显示文件名、大小和内容类型。
以下是 UploadedComplete
事件的服务器端代码。
protected void AsyncFileUpload1_UploadedComplete
(object sender, AjaxControlToolkit.AsyncFileUploadEventArgs e)
{
System.Threading.Thread.Sleep(5000);
if (AsyncFileUpload1.HasFile)
{
string strPath = MapPath("~/Uploads/") + Path.GetFileName(e.filename);
AsyncFileUpload1.SaveAs(strPath);
}
}
好了。一切就绪。现在只需运行应用程序。
结论
这是一个很棒的控件,具有良好的用户体验,但如上所述,我找不到一种方法来清除控件的内容,即使刷新页面也是如此。另一件令人烦恼的事情是,一旦您选择任何文件,它就开始上传。另一项缺失的功能是它不能以百分比显示进度。尽管存在一些缺点,但我发现这个控件非常有用。希望看到该工具得到一些改进。
尽情享受吧。