AJAX updatepanel gives error

I am trying to use AJAX UpdateProgress to display a loading image when creating a zip file, but getting the following error:

Microsoft JScript runtime error: Sys.WebForms.PageRequestManagerParserErrorException: a message received from the server cannot be parsed. Common causes of this error are changes in response to Response.Write () calls, response filters, HttpModules, or server tracing. Detals: parsing error near "PK".

Below is the code for my .aspx page

<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> 

... and below is the aspx.vb page code

 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 

Any ideas how I can solve this problem? Any help would be greatly appreciated.

thanks

+4
source share
2 answers

I had a similar problem in the past trying to transfer an Excel document using a button inside the update panel. Here is my solution, hope this helps.

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 

WITH#:

 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); } 
+2
source

Eilon Lipton has a great blog post. It contains many tips on how to avoid this error:

Sys.WebForms.PageRequestManagerParserErrorException - what it is and how to avoid it

Read also the comments. There is a comment by someone with the same problem: “I decided that it changed the server downtime of my application pool in IIS. It was only 5, so I increased it and now it works.”

Perhaps an error occurred while sending the message back. In this case, you can view the error details by adding PostBackTrigger to your update panel and referring to the button that causes the problem:

 <asp:updatepanel ID="updatepanel1" runat="server"> <Triggers> <asp:PostBackTrigger ControlID="button1" /> </Triggers> <ContentTemplate></ContentTemplate> </asp:updatepanel> 
+2
source

Source: https://habr.com/ru/post/1339088/


All Articles