我有一个 ASP.NET Webforms 应用程序,我使用
ajaxFileUpload
上传一些文件以通过电子邮件发送。鉴于我的业务逻辑,我希望每封电子邮件最多允许 5 个文件,并且如果达到限制,我希望禁用文件选择器。我知道 ajaxFileUpload
确实在上传开始、完成和完成时有客户端和服务器端事件,但由于文件在选择之间临时存储,我想在 OnUploadComplete
事件内禁用客户端上的选择器(在服务器端)如果上传的文件达到5个。
我尝试过使用
ClientScript.RegisterStartupScript(this.GetType(), "files", "$("#ajaxCargarAdjunto_SelectFileContainer")[0].style.display = "none"", false);
和
ScriptManager.RegisterStartupScript(this.Page, Page.GetType(), "key", "$("#ajaxCargarAdjunto_SelectFileContainer")[0].style.display = "none"", false);
但它不会触发脚本。即使将
UpdatePanel
及其类型传递给方法,但什么也没有。
我还尝试使用隐藏字段并调用
LoadPostData()
,但我得到了 Invalid postback or callback argument
异常。
IPostBackDataHandler textoAdjuntosCorreo = txtAdjuntosCorreo IPostBackDataHandler;
textoAdjuntosCorreo.LoadPostData(txtAdjuntosCorreo.UniqueID, Request.Params);
ajaxFileUpload
活动是
protected void ajaxCargarAdjunto_UploadComplete(object sender, AjaxFileUploadEventArgs e)
{
ClientScript.RegisterStartupScript(this.GetType(), "files", "$("#ajaxCargarAdjunto_SelectFileContainer")[0].style.display = "none"", false);
}
您不能在 AjaxfileUpload 的 3 个服务器端事件中注入脚本,原因是这 3 个事件没有回发,也没有将网页返回到客户端。要使用脚本注册,网页必须返回到服务器。页面+后台代码运行,包括任何脚本注入,然后整个页面返回到客户端。
但是,由于 AjaxFileUpLoad 不会回发,因此您在 3 个服务器端事件中注意到,您可以触摸、查看、更改网页中的任何控件,这些控件当然仍然位于客户端。
因此,这 3 个服务器端事件必须像 Web 方法一样对待,因此它们不能使用客户端的网页,当然包括页面上的控件,或尝试注册脚本。如果没有页面回发,您当然无法注册脚本。
但是,为什么不考虑设置 MaxAllowedFiles 呢?
例如这个:
<ajaxToolkit:AjaxFileUpload ID="AjaxFileUpload1" runat="server"
OnUploadComplete="AjaxFileUpload1_UploadComplete"
ChunkSize="8192" MaxFileSize="-1"
MaximumNumberOfFiles="5"
/>
这样,用户最多只能选择 5 个文件。
例如这个: