Tuesday, October 30, 2007

Sys.WebForms.PageRequestManagerParserErrorException

Sys.WebForms.PageRequestManagerParserErrorException: The message received from the server could not be parsed. Common causes for this error are when the response is modified by calls to Response.Write(), response filters, HttpModules, or server trace is enabled.


this is the most annoyed error , That I ever had.

It happens only the first time after I restart my web application / after change web.config.

I still keep getting that error even I have try to alter my code based on this
--------------------------------------------------------------------------------------
  1. Calls to Response.Write():
    Place an or similar control on your page and set its Text property. The added benefit is that your pages will be valid HTML. When using Response.Write() you typically end up with pages that contain invalid markup.
  2. Response filters:
    The fix might just be to not use the filter. They're not used very often anyway. If possible, filter things at the control level and not at the response level.
  3. HttpModules:
    Same as response filters.
  4. Server trace is enabled:
    Use some other form of tracing, such as writing to a log file, the Windows event log, or a custom mechanism.
  5. Calls to Server.Transfer():
    I'm not really sure why people use Server.Transfer() at all. Perhaps it's a legacy thing from Classic ASP. I'd suggest using Response.Redirect() with query string parameters or cross-page posting.

Another way to avoid the parse error is to do a regular postback instead of an asynchronous postback. For example, if you have a button that absolutely must do a Server.Transfer(), make it do regular postbacks. There are a number of ways of doing this:

  1. The easiest is to simply place the button outside of any UpdatePanels. Unfortunately the layout of your page might not allow for this.
  2. Add a PostBackTrigger to your UpdatePanel that points at the button. This works great if the button is declared statically through markup on the page.
  3. Call ScriptManager.RegisterPostBackControl() and pass in the button in question. This is the best solution for controls that are added dynamically, such as those inside a repeating template.

-------------------------------------------------------

After I give up... The only solution is to add enableEventValidation="false" in the Page attribute.

Probably it is not the best solution because the event validation mechanism reduces the risk of unauthorized postback requests and callbacks. When the EnableEventValidation property is set to true, ASP.NET allows only the specific events that can be raised on the control during a postback request or callback. In this model, a control registers its events during rendering and then validates the events during postback or callback handling.

However after debugging I relies that It throw that error after I write into a session which I never write anything in the beginning. which cause the event validation not valid

So another solution is if EnableEventValidation is so important then
put it back EnableEventValidation = true then
in your Page_Load Event,
put
----------------------
Session["something"] = true; in your page load event.

This will create the cookie needed for the session variable to work, and therefore anything using a session will also work without throwing the error.

---------------------

This solution needed if there is no session ha s been initialize but when there is asynchronous postback, you put a session and EnableEventValidation is true

No comments: