Showing posts with label JavaScript. Show all posts
Showing posts with label JavaScript. Show all posts

Thursday, April 17, 2014

Intermittent PageRequestManagerParserErrorException With Full Postback

I have a project with a bunch of ajaxified Telerik controls within several nested UpdatePanel controls. As part of an Excel export process, I have a button which upon clicking performs a full postback, generates a spreadsheet from a RadGrid, and finally prompts the user to download the file. 

Once in a while, though, the export process would throw the dreaded and unhelpful Sys.WebForms.PageRequestManagerParserErrorException exception.



Eilon Lipton's helpful post gave a handy checklist of things not to do, but in spite of ensuring all the common causes were accounted for, it would still occur occasionally.

I tried implementing a workaround shared by a colleague and thus far it appears to have helped. This involves setting the OnClientClicked event handler of the export button so that it triggers a brief pause prior to initiating the full postback using a client-side Javascript.
function onExportClick(sender, args)
{
     setTimeout(

          function () 
          { 
               __doPostBack(sender.id, "_MyButtonID") 
          }, 
          500
     );   
}

The error itself points you in the right direction, but some more context sure would be nice. Anyway, apparently this script mitigates situations where the Telerik controls are still in the process of being rendered when the full postback is initiated, corrupting the Response header in the process. 




Friday, December 27, 2013

LinkButton OnClick Not Firing After OnClientClick

I worked around an oddball problem where the OnClick event of an ASP LinkButton would not fire following execution of some JavaScript tied to its OnClientClick.

The intent is to enable a row in a Telerik RadGrid to be removed by clicking the corresponding button in the row, and more specifically have a modal confirmation dialog appear to prompt the user to confirm their choice.

Here's markup for the GridTemplateColumn containing the button:
<telerik:GridTemplateColumn HeaderText="Remove" UniqueName="Remove" 
  FilterControlWidth="20">
    <ItemTemplate>
        <div style="cursor: hand;">
            <asp:LinkButton runat="server" ID="_RemoveItem" 
                Name="_RemoveItem" Text=" X " Font-Underline="False" 
                ForeColor="DarkBlue" 
                OnClientClick="confirmAspButton(this, 'Are you sure?'); return false;"
                OnClick="RemoveItemButtonClick" 
                style="font-weight:bold;color:red;">
            </asp:LinkButton>
        </div>
    </ItemTemplate>
    <HeaderStyle Width="55"></HeaderStyle>
</telerik:GridTemplateColumn>

The confirmAspButton function is a little JavaScript which is bound to the OnClientClick method of the LinkButton. If the user clicks OK, the confirmation passes and a postback will occur to execute the code beneath the OnClick method, whereas if they click Cancel the dialog will simply disappear.
     function confirmAspButton(button, message) 
     {
          function aspButtonCallbackFn(arg) 
          {
             if (arg) 
             {
                  window.__doPostBack(button.name, "");
             }
          }
            
          window.radconfirm(message, aspButtonCallbackFn, 330, 120, null, "Confirm");
     }


Seems simple enough, yet for some odd reason, in Internet Explorer 10, the LinkButton brought up the dialog just fine, and although the Cancel button click performed as expected, clicking OK had the same effect as cancel and merely cleared the dialog without executing the underlying code.

I managed to find a workaround via StackOverflow which suggests using a Button rather than a LinkButton. Sure enough, this did the trick, for whatever oddball reason whose particulars I could care less to dive into...




Friday, June 1, 2012

Obtain Element Coordinates Using JQuery

I'm working on a project with ASP.NET and JQuery where I need to be able to obtain the coordinates for a div element in response to a button click. I found an example here, but I wanted to get not just the top and left values, but be able to obtain coordinates of all four corners.

To do this, I make use of JQuery's position, height, and width functions, then simply use some arithmetic to obtain the coordinates and finally display them. 

Here's an example. First, the markup:
<%@ Page Title="Home Page" Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %>

Div Coordinates





I am a div.

Now, the code behind: 

protected void Button1_Click(object sender, EventArgs e)
{
     Label1.Text = "Top Left: " + hfTop.Value + ", " + hfLeft.Value;
     Label2.Text = "Top Right: " + hfTop.Value + ", " + hfRight.Value;
     Label3.Text = "Bottom Left: " + hfBottom.Value + ", " + hfLeft.Value;
     Label4.Text = "Bottom Right: " + hfBottom.Value + ", " + hfRight.Value;
}



In a nutshell, the button click first triggers the OnClientClick event, which calls the JQuery functions to populate the values of the HiddenField objects. Then, the OnClick method takes those values and concatenates them in the code behind into coordinate pairs to display as the label text.
In cases where we need specific coordinates of each corner of a div element in response to a click event, this method works nicely.



Wednesday, February 9, 2011

Blogger Template Change Kills Google Analytics Script


For some reason, several categories of Google Analytics tracking my Blogger blog stats have flatlined within the last month or so.

I just realized why, I'd made some template changes, including choosing a different template from among Blogger's selections, and this clobbered the analytics script! 

Strangely, even though the tracking code was nonexistent, the Tracking Status indicator in Analytics still says that it's "Receiving Data" even though statistics like New Visits, Avg. Time on Site, and Bounce Rate have been flat.

Anyway, you can visit this Google Analytics help page to find out how to enter the necessary tracking code (the preferred one to use is asynchronous).