Ajax FileUpload 正在劫持 aspx

Ajax FileUpload is hijacking the aspx

我有一个非常简单的页面,打算用来显示网络文件的内容。目标文件与 Ajax 工具包 AjaxFileUpload 控件一起引入。它有效,并且在单步执行调试器时我可以看到文件内容。然而,有问题的行为是一旦文件被上传,代码隐藏就失去了更新页面的所有能力。我无法将文件内容写入多行文本框。我什至无法更新页面上的标签。我也不能将硬编码 "Test Text" 写入文本框或标签。

没有错误或异常抛出。代码运行完成,没有将内容写入 TextBox。

<h2>
   Encrypted File Viewer
</h2>
<asp:ScriptManager ID="ScriptManager1" runat="server"></asp:ScriptManager>

<asp:Label ID="ViewingLabel" runat="server" Font-Bold="false" ForeColor="Green"></asp:Label>
<br /><br />
<asp:Button ID="UnauthorizedExitButton" runat="server" Visible="true" OnClick="DoExit" Text="  Exit  " />
<br /><br />
<Ajax:AjaxFileUpload ID="AjaxUploader" runat="server" OnUploadComplete="FileOpen" width="800px"></Ajax:AjaxFileUpload>
<br /><br />
<asp:TextBox ID="Viewer" runat="server" Width="800px" Height="500px" TextMode="MultiLine"></asp:TextBox>

在 FileOpen() 中

        string tempPath = Path.GetTempFileName();
        string tempPath2 = Path.GetTempFileName();
        AjaxUploader.SaveAs(tempPath);
        myStrUtility.DecryptFile(tempPath, tempPath2);

        Viewer.Text = File.ReadAllText(tempPath2);          //Fails
        // For testing - Debugging
        ViewingLabel.Text = File.ReadAllText(tempPath2);    //Fails
        Response.Write (File.ReadAllText(tempPath2));       //Fails

我对此完全感到困惑,因为我可以看到tempPath2 的解密内容。

提前感谢您提供的任何见解。

好的,我有几分钟时间。

如果你的屏幕上有一堆文本框。你填写它们。 (还没有 postback 发生)。因此,运行s 将不会使用、看不到或无法使用这些控件的任何服务器端代码。

因此,您在文本框中输入了一些内容。然后你 select 上传一个文件。然后点击上传按钮。

现在,您的 3 个服务器端事件将 运行。但是 AJAX 的整个想法是您不必做也不希望页面 post 返回已经发生。 post 返回页未出现!

所以,现在当 3 个服务器端事件(来自 ajax 文件上传 运行)时,我们有:

上传事件开始 - 服务器端 运行s。但同样,后面表单中的代码不会更改任何控件的使用。

单个文件上传编译 - 您的服务器端事件代码 运行s。但是同样,由于没有发生 post 返回 - 然后任何控件更改或输入到控件中的文本尚不可用。

所有文件上传事件的最终结果 - 同样是服务器端事件代码 运行s,而且您无法获取或使用已更改的表单上的任何控件。

几种解决方案:

是否输入或更改了任何文本框或数据?您需要某种 "ok buttion",并且该按钮执行 post 返回 - 在该例程中,您然后打开(显示)上传器。

现在用户可以 select 个文件,并开始上传。对于 3 个 ajax 事件(开始上传),单个文件完成,然后所有完成事件都可以 运行 服务器端使用您的控件。

因此,请记住,您可以在表单中输入一堆数据,然后使用上传器(select 个文件,然后使用上传按钮)。对于整个过程,没有页面 post 返回

更糟?如果您在页面上放置一个提交按钮,并且用户已经 select 编辑了文件,然后决定点击 post 返回?那么 ajax 上传者不会在 post 返回期间保留 selected 的文件。这就是为什么我强烈建议你隐藏上传器(不能使用可见的,你必须使用样式)。

最简单的解决方案是,如果您在表单上有一组或一堆控件需要设置或将在它们开始上传之前制作 data/changes?

将控件组放在更新面板中。并为每个控件重新设置自动 post。因此,您编辑的任何控件现在都会导致 post-back。现在,此类数据在服务器端代码中可用。 (这包括 3 个 ajax 上传程序服务器端事件)。

请记住,此更新面板将导致所谓的部分 post 返回(加载事件将触发)。

因此,您所看到的行为一点也不奇怪。您也不能 hide/show 或更改 3 个上传程序事件中的控件值,因为如前所述,您将更改控件的值,但页面尚未 post 返回。如果您尝试更改这 3 个事件中的控件,您所做的任何操作都将丢失 if/when you/users 最终 post 返回页面。请记住,您的桌面上有一个无状态网页。

如果该无状态页面(尚未)post返回,则 3 ajax 服务器端事件此时无法看到客户端浏览器控件。如果您在这 3 个事件中更改控件,则您正在更改位于服务器端的控件,但网页不会更新。

因此,您要么让页面上的控件在 select 文件之前执行 post 返回并开始上传。如前所述,我经常 "hide" ajax 文件上传。让用户输入一些东西,然后有一个 "ok - now lets up-load files"。当他们单击该按钮时,您的服务器端代码 运行s,您可以做任何事情,然后打开(显示)ajax 上传程序。那时 ajax 上传事件(3 个服务器端事件)可以 运行,并且该代码现在有一个 post 客户端浏览器的备份副本。

现在,假设最后一个 ajax 事件(所有文件已上传)已经发生。您现在可以尝试修改页面上的控件,但页面仍然位于客户端。它尚未 post 退回。而且您将无法 post 在上传开始和完成之间返回该页面。如果您只是 运行 最终事件中的一堆代码并尝试更新页面上的控件和值 - 您做不到!!因为没有发生 post 返回并且控件及其值仍然位于客户端。

另一种实现此目标的方法是使用与最后一个 ajax 事件(所有文件已完成)相关联的客户端 javescript 事件。但是,这意味着如果您在页面被post回退之前开始上传,那么第二个事件(一个文件完成,另存为文件)将不会使用控件。

那么,这意味着如果您要在上传期间使用控件(从开始到完成事件),或者 运行 在修改控件的最终事件中使用代码?在 运行 上传过程之前,您需要先 post 编辑页面。

您可以尝试使用第三个最终服务器端事件中的代码更改所有和任何控件,但您在服务器端浏览器副本中修改控件。您看不到任何更改生效。因此,您似乎无法修改任何内容。

所以,大量上传?好吧,我希望在一切都说完之后发生一些事情。这意味着上传器的第三个最终事件需要一个客户端事件(并且它将有一个 __dopostback() js 命令。上传器构建得非常好,客户端 JS 事件只触发服务器端事件完成后。

因此,最后的 post-back trick/tip 仅在您希望在一切都说完之后发生某些事情时才有用。但是这个提示并不能帮助您控制这 3 个事件,并且如前所述,除非您将浏览器页面发送回服务器,否则您 运行 服务器端的任何代码都不会显示在浏览器中。换句话说,如果你想要一些更新,或者屏幕上的消息框在加载结束时更新?您不能使用第三个最终 ajax 代码存根。在尝试修改页面上的任何内容之前,您必须执行 post 返回。

(否则您将修改浏览器的服务器端副本,而没有 post 返回客户端浏览器副本 "different" 而不是相同的。

因此,这 3 个事件不能修改任何控件,因为页面未被 posted,当您最终 post 页面时,您修改的控件将是 lost/overwritten 当客户端浏览器 post 返回时。

所以您并没有失去在最后 3 次事件中修改页面控件的能力,但是您修改了服务器端页面的副本 - 而且您永远看不到更改。

因此,使用标准 asp.net 按钮: 我们有: Post 返回(浏览器页面转到服务器) 您的代码(后面的任何代码)可以 运行,可以看到,可以 grab/set/see/change 窗体上的任何控件。 现在浏览器被重新发送回客户端并显示。 (因此您可以在这些控件中看到您的服务器端代码更改。

使用 ajax 上传器,没有页面 post 返回,也不会重新呈现浏览器。 (那些控制和事件不会导致 post-back)。因此,您不能 运行 服务器端代码来更改内容,因为您没有客户端的副本。即使您修改了控件,也不会将页面发送回客户端重新显示。

那么,基于上面的asp.net模型和背后的代码呢?您不能更改控件,除非您的服务器端代码 运行s 作为 post-back 的结果。

所以,要么让你的 post 全部完成并在上传 运行 之前完成,因为这 3 个服务器端事件不能修改控件,并且不会看到客户端更改,除非你 do/did 在上传开始前 post 回来了。

只需将 auto-post 放回控件中即可。但是,几个控件的自动 post 后退确实会导致整个页面 post 后退。因此,您可以 "mitigate" 通过将控件组放在更新面板中来做到这一点。或者,如前所述,加载所有控件并设置 post 返回,然后显示上传程序供用户启动。