Ajax FileUpload劫持了aspx

时间:2020-03-13 17:43:28

标签: asp.net ajaxcontroltoolkit

我打算使用一个非常简单的页面来显示网络文件的内容。目标文件通过Ajax Toolkit AjaxFileUpload控件引入。它可以正常工作,逐步调试器时我可以看到文件内容。但是,令人讨厌的行为是,一旦上传了文件,后台代码就会失去所有更新页面的能力。我无法将文件内容写入多行TextBox。我什至无法更新页面上的标签。我也不能将硬编码的“测试文本”写入TextBox或Label。

没有错误或异常抛出。代码运行完成,而没有将内容写入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的解密内容。

在此先感谢您提供的见解。

1 个答案:

答案 0 :(得分:0)

好的,我有几分钟。

如果屏幕上有一堆文本框。您填写它们。 (尚未发生回发)。因此,任何运行的服务器端代码都不会使用,也不会看到或无法使用这些控件。

因此,您在文本框中输入了一些内容。然后,选择要上传的文件。然后点击上传按钮。

现在,您的3个服务器端事件将运行。但是,AJAX的整个想法是您不必做也不希望发生回发页面。并没有回发页面!

因此,现在,当3个服务器端事件(通过ajax文件上传运行)时,我们有:

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

编译单个文件-您的服务器端事件代码将运行。但同样,由于没有发生回发-更改了任何控件或输入控件的文本尚不可用。

最终完成所有文件的上载事件-再次运行服务器端事件代码,并且再次无法获得或使用更改后的表单上的任何控件。

几种解决方案:

是否有任何文本框,或者输入或更改了数据?您需要某种“确定”,然后该按钮将回发-在该例程中,然后打开(显示)上载器。

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

因此,请记住,您可以在表单中输入一堆数据,然后使用上载器(选择文件,然后单击“上传”按钮)。在整个过程中,不会发生页面回发

更糟?如果您在页面上放置了一个提交按钮,并且用户选择了文件,然后决定将其发回?那么ajax上传器不会持久保存回发期间选择的文件。这就是为什么我强烈建议您隐藏上载器的原因(不能使用可见的,必须使用样式)。

最简单的解决方案是,如果表单上有一组或一组控件需要设置,或者在开始上载之前进行了数据/更改?

将控件组放置在最新面板中。并为每个控件设置自动回发。因此,您编辑的任何控件现在都将导致回发。现在,这些数据可以在服务器端代码中找到。 (其中包括3个Ajax上载器服务器端事件)。

请记住,此最新面板将导致所谓的部分回发(将触发on-load事件)。

因此,您所看到的行为一点都不奇怪。您也不能在3个上载事件中隐藏/显示或更改控件的值,因为如前所述,您将更改控件的值,但是页面尚未回发。如果您尝试在这3个事件中更改控件,则当/当您/用户最终将页面发回时,您所做的一切都会丢失。记住,您在桌面上有一个无状态的网页。

如果尚未回发该无状态页面,则这3个Ajax服务器端事件此时无法看到客户端浏览器控件。而且,如果您在这3个事件中更改控件,那么您将更改服务器端的控件,但该网页将不会更新。

因此,您可以让页面上的控件在选择文件并开始上载之前进行回发。如前所述,我经常“隐藏” ajax文件上传。让用户输入一些东西,然后单击“确定-现在可以上传文件”。当他们单击该按钮时,您的服务器端代码将运行,您可以执行任何操作,然后打开(显示)ajax上载器。此时,可以运行ajax上传事件(3个服务器端事件),并且该代码现在具有客户端浏览器的回发副本。

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

实现此目标的另一种方法是使用绑定到LAST ajax事件的客户端javescript事件(所有文件都已完成)。但是,这意味着如果在页面回发之前启动上载,则第二个事件(完成一个文件,另存为文件)将不使用控件。

因此,这意味着如果要在上载期间使用控件(开始到结束事件),或者在该最终事件中运行修改控件的代码?您需要在运行上传过程之前发布页面。

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

那么,大量的负载?好吧,我希望一切都说完之后再发生。这意味着上载器的第三个最终事件需要一个客户端事件(并且它将具有__dopostback()js命令。上载器的构建非常好,因为客户端JS事件仅在服务器端之后触发事件已经完成。

因此,如果您说了一切之后都想做些事情,那么仅使用最终的回发技巧/技巧。但是,此技巧无助于您获得3个事件中的控件,并且如上所述,除非将浏览器页面发送回服务器,否则您在服务器端运行的任何代码都不会显示在浏览器中。换句话说,是否要进行一些更新,或者在加载结束时屏幕上的消息框是否更新?您不能使用该第3个最终ajax代码存根。在尝试修改页面上的任何内容之前,您必须先发回一条帖子。

(否则,您正在修改浏览器的服务器端副本,而没有回发“不同”且不相同的客户端浏览器副本。

因此,这3个事件无法修改任何控件,因为该页面尚未发布,并且当您最终发布页面时,当客户端浏览器回发时,您修改的控件将丢失/覆盖。 / p>

因此,您不会失去在倒数第三次事件中修改页面上控件的能力,但可以修改服务器端页面的副本-并且永远不会看到更改。

因此,使用标准的asp.net按钮: 我们有: 回发(浏览器页面转到服务器) 您的代码(后面的任何代码)都可以运行,可以查看,可以获取/设置/查看/更改表单上的任何控件。 现在,浏览器重新发送回客户端并显示。 (因此您可以在这些控件中看到服务器端代码的更改。

使用ajax上传器时,不会发生页面回发,也不会进行浏览器的重新渲染。 (这些控件和事件不会引起回发)。因此,您无法运行服务器端代码来进行更改,因为您没有客户端的副本。而且即使您修改了控件,也不会将任何页面发送回客户端以重新显示。

那么,基于上面的asp.net模型和后面的代码?除非您的服务器端代码作为回发结果运行,否则您无法更改控件。

因此,要么在上传程序运行之前将您的帖子全部整理好并打包好,因为这3个服务器端事件无法修改控件,并且除非您在上传开始之前做/不发帖,否则不会看到客户端的更改

只需在控件中放置自动回发。但是,随后几个控件的自动回发确实会导致整个页面的回发。因此,您可以通过将控件组放置在更新面板中来“缓解”这种情况。或者,如前所述,加载所有控件并设置一个回帖,然后THEN显示上载程序供用户启动。

相关问题