我正在尝试使用AJAX UpdateProgress在创建zip文件时显示加载图像但是出现以下错误:
Microsoft JScript运行时错误:Sys.WebForms.PageRequestManagerParserErrorException:无法解析从服务器收到的消息。此错误的常见原因是通过调用Response.Write(),响应过滤器,HttpModules或服务器跟踪来修改响应。 Detals:解析'PK'附近时出错。
以下是我的.aspx页面的代码
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title></title>
<style type="text/css">
#progressBackgroundFilter
{
position: fixed;
top: 0px;
bottom: 0px;
left: 0px;
right: 0px;
overflow: hidden;
padding: 0;
margin: 0;
background-color: #000;
filter: alpha(opacity=50);
opacity: 0.5;
z-index: 1000;
}
#processMessage
{
position: fixed;
top: 30%;
left: 43%;
padding: 10px;
width: 14%;
z-index: 1001;
background-color: #fff;
border: solid 1px #000;
}
</style>
</head>
<body>
<form id="form1" runat="server">
<div>
<asp:ScriptManager ID="ScriptManager1" runat="server">
</asp:ScriptManager>
<asp:UpdatePanel ID="UpdatePanel1" runat="server">
<ContentTemplate>
<asp:CheckBox ID="chb_pass" runat="server" Text="Do you want the zip file to have a password?"
AutoPostBack="True" />
<br />
<asp:TextBox ID="txt_password" runat="server" MaxLength="20" Visible="false" Style="margin-top: 6px"
Width="152px"></asp:TextBox>
<asp:RequiredFieldValidator ID="RequiredFieldValidator1" runat="server" ControlToValidate="txt_password"
ErrorMessage="* Need Password!"></asp:RequiredFieldValidator>
<br />
<asp:Button ID="btnDownloadPhotos" runat="server" Text="Download Album Photos" Height="27px"
Style="margin-top: 3px" Width="284px" />
</ContentTemplate>
<Triggers>
<asp:AsyncPostBackTrigger ControlID="btnDownloadPhotos" EventName="Click" />
</Triggers>
</asp:UpdatePanel>
<asp:UpdateProgress ID="UpdateProgress1" runat="server" AssociatedUpdatePanelID="UpdatePanel1">
<ProgressTemplate>
<div id="progressBackgroundFilter">
</div>
<div id="processMessage">
Preparing download...<br />
<br />
<img alt="Loading" src="img/ajax-loader.gif" />
</div>
</ProgressTemplate>
</asp:UpdateProgress>
</div>
</form>
</body>
</html>
...以下是aspx.vb页面的代码
Imports System.IO
Imports System.Text
Imports Ionic.Zip
Partial Class download
Inherits System.Web.UI.Page
Protected Sub Button1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnDownloadPhotos.Click
Dim PhotoFileList As New List(Of String)
Dim uploadDirectory As String = Server.MapPath("") & "\uploads\"
Dim albumName As String = "cricket"
PhotoFileList.Add(uploadDirectory & "CIMG1455.JPG")
PhotoFileList.Add(uploadDirectory & "CIMG1453.JPG")
PhotoFileList.Add(uploadDirectory & "CIMG1451.JPG")
PhotoFileList.Add(uploadDirectory & "CIMG1450.JPG")
createZip(PhotoFileList, albumName)
End Sub
Private Sub createZip(ByVal listOfFilename As List(Of String), ByVal albumName As String)
' Tell the browser we're sending a ZIP file!
Dim downloadFileName As String = String.Format(albumName & "-{0}.zip", DateTime.Now.ToString("yyyy-MM-dd-HH_mm_ss"))
Response.ContentType = "application/zip"
Response.AddHeader("Content-Disposition", "filename=" & downloadFileName)
' Zip the contents of the selected files
Using zip As New ZipFile()
'Add the password protection, if specified
If chb_pass.Checked = True Then
zip.Password = txt_password.Text
'This encryption is weak! Please see http://cheeso.members.winisp.net/DotNetZipHelp/html/24077057-63cb-ac7e-6be5-697fe9ce37d6.htm for more details
zip.Encryption = EncryptionAlgorithm.PkzipWeak
End If
' Construct the contents of the README.txt file that will be included in this ZIP
Dim readMeMessage As String = String.Format("This ZIP file {0} contains the following photos within the " & albumName & " album:{1}{1}", downloadFileName, Environment.NewLine)
' Add the checked files to the ZIP
For Each li As String In listOfFilename.ToArray()
' Record the file that was included in readMeMessage
readMeMessage &= String.Concat(vbTab, "* ", li.ToString, Environment.NewLine)
' Now add the file to the ZIP (use a value of "" as the second parameter to put the files in the "root" folder)
zip.AddFile(li.ToString, "Your Files")
Next
' Add the README.txt file to the ZIP
zip.AddEntry("README.txt", readMeMessage, Encoding.ASCII)
' Send the contents of the ZIP back to the output stream
zip.Save(Response.OutputStream)
End Using
End Sub
Protected Sub chb_pass_CheckedChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles chb_pass.CheckedChanged
If chb_pass.Checked = True Then
txt_password.Visible = True
ElseIf chb_pass.Checked = False Then
txt_password.Visible = False
End If
End Sub
End Class
我有什么想法可以解决这个问题?任何帮助将不胜感激。
由于
答案 0 :(得分:2)
我在过去尝试使用更新面板内的按钮流式传输Excel文档时遇到了类似的问题。这是我的解决方案,希望它有所帮助。
VB.NET:
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
Dim sm = ScriptManager.GetCurrent(Me.Page)
sm.RegisterPostBackControl(Me.YOUR_BUTTON)
AddPostBackTrigger(Me.YOUR_BUTTON.UniqueID.ToString())
End Sub
Public Sub AddPostBackTrigger(ByVal ControlId As String)
Dim existingTrigger = FindPostBackTrigger(ControlId)
If existingTrigger Is Nothing Then
Dim trigger As New PostBackTrigger()
trigger.ControlID = ControlId
Me.YOUR_UPDATE_PANEL_GOES_HERE.Triggers.Add(trigger)
End If
End Sub
Public Sub RemovePostBackTrigger(ByVal ControlId As String)
Dim existingTrigger = FindPostBackTrigger(ControlId)
If existingTrigger IsNot Nothing Then
Me.YOUR_UPDATE_PANEL_GOES_HERE.Triggers.Remove(existingTrigger)
End If
End Sub
Private Function FindPostBackTrigger(ByVal ControlId As String) As PostBackTrigger
For Each Trigger In Me.YOUR_UPDATE_PANEL_GOES_HERE.Triggers
If Trigger.GetType().Name = "PostBackTrigger" Then
Dim pt = CType(Trigger, PostBackTrigger)
If pt.ControlID = ControlId Then
Return pt
End If
End If
Next
Return Nothing
End Function
C#:
protected void Page_Load(object sender, EventArgs e)
{
ScriptManager sm = ScriptManager.GetCurrent(Page);
if (sm != null) sm.RegisterPostBackControl(YOUR_CONTROL);
AddPostBackTrigger(YOUR_CONTROL.UniqueID);
}
private void AddPostBackTrigger(string controlId)
{
PostBackTrigger existingTrigger = FindPostBackTrigger(controlId);
if (existingTrigger != null)
{
var trigger = new PostBackTrigger {ControlID = controlId};
YOUR_UPDATE_PANEL.Triggers.Add(trigger);
}
}
private PostBackTrigger FindPostBackTrigger(string controlId)
{
return
YOUR_UPDATE_PANEL
.Triggers.OfType<PostBackTrigger>()
.FirstOrDefault(pt => pt.ControlID == controlId);
}
答案 1 :(得分:2)
Eilon Lipton有一篇很棒的博客文章。它包含许多关于如何避免此错误的提示:
Sys.WebForms.PageRequestManagerParserErrorException - what it is and how to avoid it
阅读评论。有一个人有同样问题的评论:“我解决了它在IIS上改变我的应用程序池的服务器空闲时间。它只有5,所以我增加了它,现在有效。”
回发后可能会发生错误。在这种情况下,您可以通过向updatepanel添加PostBackTrigger并引用导致问题的按钮来查看有关错误的详细信息:
<asp:updatepanel ID="updatepanel1" runat="server">
<Triggers>
<asp:PostBackTrigger ControlID="button1" />
</Triggers>
<ContentTemplate></ContentTemplate>
</asp:updatepanel>