微软的.NET Framework 3.5自带了Ajax框架,将以往传统的ASP.NET开发带入了一个全新的Ajax.NET开发时代,我们除了在页面上引入ScriptManager控件用以在客户端注册功能丰富的Ajax框架脚本外,这个庞大的框架还提供了诸多功能强大的Ajax控件,例如著名的UpdatePanel、ModalPopupExtender、Rating等控件。Ajax框架和控件的引入大大简化了开发人员的开发任务,同时也给用户带来了全新的Web体验,但是我们在使用复杂的框架提供的脚本时也常常会遇到这样或那样的问题,有很多问题相信不少开发人员都能独立解决,不过有些复杂的问题还真是很伤脑筋。
本来在MOSS中使用Ajax开发就已经不是一件轻易的事情,或许高手们觉得这没有什么,是的!我们在Google上会搜到很多介绍这方面的文章,而且配置步骤都写得非常详细,按照前辈们的经验,只要认真按照步骤将环境配置好,一般都是没有什么问题的,在MOSS中开发Ajax应用程序就如同简单的Ajax网页一样,只是部署的时候稍微要麻烦一些。这里我不想详细讲解在MOSS中如何进行Ajax开发,只是想说一说前段时间在MOSS开发中因为Ajax框架所引起的一个非常怪异的问题,一直困扰了我好几天,不过最终算是委曲求全得找到了一个替代的解决办法,至于会不会引起其它的什么问题,读者也可以帮我分析一下。
前不久我写了一篇有关在FireFox中通过脚本获取客户端本地所选文件路径的文章http://www.cnblogs.com/jaxu/archive/2009/04/19/1439016.html,里面介绍了通过客户端上传文件时如果通过javascript得到文件的本地路径,事实上,在真正的文件上传过程中,得到文件的客户端路径意义是不大的,除非我们需要实现如图片本地预览的功能,否则我们一般都可以通过Form的Post方法得到要上传的文件,在C#一般都是这样的。
<body>
<form id="form1" runat="server" method="post" enctype="multipart/form-data">
<input id="File1" name="mtfile" type="file" />
<asp:Button ID="Button1" runat="server" Text="Button" OnClick="Button1_Click" />
</form>
</body>
protected void Button1_Click(object sender, EventArgs e)
{
HttpFileCollection files = Request.Files;
if (files != null && files.Count > 0)
{
for (int i = 0; i < files.Count; i++)
{
// TODO something
}
}
}
设置Form的method属性为post,并设置enctype为mulipart/form-data,当页面提交时,在服务端通过Request.Files方法即可得到上传文件的对象集合。非常简单,我们根本不需要在客户端通过javascript得到文件的路径。不过这里有一个限制,那就是页面必须post到服务端才能得到要上传的文件,也就是说,我们不能通过javascript方式在页面无刷新的情况下将文件上传到服务器,这也是Ajax唯一不能做到的一件事情。不过我们通过一个比较老旧的技术可以避开这个问题,那就是在页面上使用隐藏的iFrame,在页面提交前将Form的target指向这个隐藏的iFrame,页面提交时iFrame会被刷新提交,从而避免了整个页面被刷新。
事实上,在Ajax兴起前,很多“无刷新”的页面几乎都是通过这种方式来实现的,iFrame可以提交数据,而且还避免了网页的整体刷新。在Ajax兴起后,iFrame似乎很少再被人们提起,但是有一个例外,