文件上载在具有Ajax更新面板的页面中不起作用

时间:2011-09-05 08:10:41

标签: c# asp.net updatepanel captcha asyncfileupload

我使用c#在ASP.NET 4中使用Ajax文件上载控件。同一页面也有更新面板,但上传控件不在更新面板内。上传控件位于更新面板之外。

更新面板有一个验证码图像和提交按钮described here too。里面的提交按钮包含用于从上传控制中保存文件的代码。

问题在于,当用户浏览使用上传控件上传的笛子,然后输入错误的验证码值并提交时,则会向用户异步提供新的验证码图像以供输入。现在上传控件仍然显示文件上传栏中的路径,但在编程方面它不会检测到文件。

提交按钮代码:

if (AsyncFileUpload.HasFile)
{
  // upload logic and other stuff
}
else
{
  // lblShow.Text = "There is no file to be uploaded";
}

上面的代码例如执行else部分说“没有要上传的文件”。页面仍然没有完全刷新,文件上传控件具有显示文件的路径。请帮我解决这个问题。

2 个答案:

答案 0 :(得分:0)

如果您正在使用带文件上载控件的Ajax更新面板,则必须将回发触发器添加到更新面板触发器中。像:

<Triggers>
        <asp:PostBackTrigger ControlID="btnContactSubmit"/>                                                         
</Triggers>

答案 1 :(得分:0)

如果您的代码:

if (AsyncFileUpload.HasFile)
{
  // upload logic and other stuff
}
else
{
  // lblShow.Text = "There is no file to be uploaded";
}

Page_Load事件中,它仍然会在部分回发的情况下执行,例如UpdatePanel刷新。{1}}如果尚未从浏览器执行完整表单提交(您提到文件上载位于UpdatePanel之外),则页面将不会检测到文件上载。

我感到困惑的是,当AsyncFileUpload超出UpdatePanel时,为什么要将其称为UpdatePanel

修改

根据您的回答,我认为您的Captcha实现不能像现在一样使用异步文件上传。

UpdatePanel执行异步POST以评估验证码结果,但您不会发布文件内容,因为它不在UpdatePanel内。然后你的服务器端代码评估验证码结果,并将异步响应中的html或重定向返回给浏览器......你需要最终提交表单以获取文件。

除非您准备编写代码以在异步响应中将一些javascript发送回您的页面以触发完整表单提交,并在表单提交上再次重新评估CAPTCHA,否则您可能最好取出在我看来{{1}}。