AjaxControlToolkit AjaxFileUpload问题:UploadComplete方法未触发
先贴出你的代码:
ASPX页面代码
<%@ Register Assembly="AjaxControlToolkit" Namespace="AjaxControlToolkit" TagPrefix="ajaxToolkit" %> <ajaxToolkit:AjaxFileUpload ID="ajaxFileUpload" runat="server" OnUploadComplete="UploadComplete" AllowedFileTypes="xlsx" MaximumNumberOfFiles="1" ClientIDMode="Static" />
后台C#代码
protected void UploadComplete(object sender, AjaxFileUploadEventArgs e) { // Handle the uploaded file here string filePath = Server.MapPath("~/Templates/Upload/" + e.FileName); ajaxFileUpload.SaveAs(filePath); }
针对无法进入UploadComplete方法的问题,按以下步骤排查:
必须配置AjaxFileUpload的HttpHandler
AjaxControlToolkit的文件上传控件需要特定的HttpHandler处理请求,Web.config里必须添加以下配置:
在<system.web>节点下添加:<httpHandlers> <add verb="POST,GET" path="AjaxFileUploadHandler.axd" type="AjaxControlToolkit.AjaxFileUploadHandler, AjaxControlToolkit" /> </httpHandlers>如果你用的是.NET 4.0及以上版本,还要在
<system.webServer>节点下添加:<handlers> <add name="AjaxFileUploadHandler" verb="POST,GET" path="AjaxFileUploadHandler.axd" type="AjaxControlToolkit.AjaxFileUploadHandler, AjaxControlToolkit" /> </handlers>确保页面包含ScriptManager控件
AjaxControlToolkit的所有控件都依赖ScriptManager,必须把它放在AjaxFileUpload之前:<asp:ScriptManager ID="ScriptManager1" runat="server"></asp:ScriptManager> <!-- 然后才是你的AjaxFileUpload控件 -->检查ClientIDMode设置
你设置了ClientIDMode="Static",这个可能导致前端JS无法正确定位控件,尝试去掉这个属性,测试是否能触发后台方法。调整文件大小限制
如果上传的文件超过了系统默认的大小限制,请求会直接被拦截,不会触发后台方法。在Web.config里修改:
在<system.web>节点下:<httpRuntime maxRequestLength="1048576" /> <!-- 单位KB,这里设置为1GB -->在
<system.webServer>节点下:<security> <requestFiltering> <requestLimits maxAllowedContentLength="1073741824" /> <!-- 单位字节,1GB --> </requestFiltering> </security>处理UpdatePanel中的情况
如果你的AjaxFileUpload放在UpdatePanel里面,必须添加PostBackTrigger:<asp:UpdatePanel ID="UpdatePanel1" runat="server"> <ContentTemplate> <ajaxToolkit:AjaxFileUpload ID="ajaxFileUpload" runat="server" ... /> </ContentTemplate> <Triggers> <asp:PostBackTrigger ControlID="ajaxFileUpload" /> </Triggers> </asp:UpdatePanel>检查控件版本兼容性
确保你使用的AjaxControlToolkit版本和项目的.NET框架版本兼容,建议通过NuGet重新安装最新的稳定版,避免版本不匹配导致的问题。清空浏览器缓存
旧的前端JS缓存可能导致控件功能异常,清空浏览器缓存后重新测试。
内容的提问来源于stack exchange,提问作者Khai Loon Lee

