ModalPopup as an AJAX Progress Indicator

I recently read a dotnetkicks article where the author laid out an approach for using the ASP.NET AJAX client-side framework to synchronously execute a WebMethod that does some sort of server-side validation or computation.  I believe the idea here was while this validation is executing the page designer does not want the end user interacting with the other elements on the page.  I had not encountered this issue before, but I started working out how I would have approached it.  I enjoyed the authors article and I liked how he leveraged the existing ASP.NET AJAX framework and that the solution should would work with the existing ASP.NET CustomValidator.  Because the operation is synchronous, you can invoke the WebMethod from the ClientValidationFunction and set the IsValid bit to true or false depending upon the result.  However, I am not sure if I would like having the page go unresponsive while this validation is taking place.  Especially if it is unclear to me that the field I entered data into was going to require validation as I tabbed through to the next control.

Live Demo: Sample 1 | Sample 2 | Sample 3 

Download: Sample Web Site

ModalPopupExtender as Validation Progress Indicator

As a user I would like some sort of indicator that an operation is executing.  And as a page designer I would like some sort of way to make sure that while the validation is taking place the user isn't modifying the other elements on the page or interact with other elements.  I thought using the ModalPopupExtender AjaxControlToolkit control might be helpful here for two of reasons:

  1. It is simple to hide and show using javascript (just find the behavior using the $find function and invoke show() or hide())
  2. It will show the progress indicator as a modal popup, essentially disabling the rest of the input elements from the user

I created a sample page that accepts a VISA credit card number via a textbox and validates the number using the algorithm outlined here.  I wired the onclick event of the Validate button to asynchronously invoke a PageMethod that runs the text through the validation algorithm.  Because the validation is taking place asynchronously, I display a modal progress indicator to the user by calling the hide() and show() methods on the ModalPopup.  You can test this sample out for yourself here - don't enter in your own number, use the test one ;)

For comparison, I also plugged in the synchronous executor to try that out as well.  You can demo that sample here.

ModalPopupExtender as Progress Indicator for Complicated Pages

While playing around with this, I also realized that there are a few pages in the web application that I am currently working on that would benefit from a similar approach, but for a slightly different reason.  The web application contains a few rather complicated pages, each containing a large number of elements.  When the page does partial postbacks, I use the UpdatePanelAnimationExtender OnUpdating and OnUpdated animations to go through and enable and disable certain elements while the asynchronous operation is taking place. 

<cc1:UpdatePanelAnimationExtender runat="server" TargetControlID="udpOrderDetails">
    <Animations>
        <OnUpdating>
            <Parallel Duration="0">
                <EnableAction AnimationTarget="btnFindOrder" Enabled="false" />
            </Parallel>
        </OnUpdating>
        <OnUpdated>
            <Parallel Duration="0">
                <EnableAction AnimationTarget="btnFindOrder" Enabled="true" />
            </Parallel>                    
        </OnUpdated>
    </Animations>                
</cc1:UpdatePanelAnimationExtender>  

I do this because I don't want the user clicking on the elements while the page is refreshing.  Usually I don't think this would be an issue if the partial refreshes are executed quickly, but in our application some may take more than a few seconds depending on the overall load of the system.  On some of these pages, I think it would just be simpler if I made all of the controls disabled by displaying the progress indicator using a ModalPopup. 

To test this out, I created a standard search page that contained a GridView with the customers from the Northwind customer table.  I simplified the sample by only including the GridView, but I believe you can get the idea of how it would look on a more complicated page.  You can test a live demo of this here.

I am not exactly sure if I will use this approach in our application, but I might use a similar css class and apply it to some of the elements that are contained within update panels to make it appear as if all of the elements in the panel are disabled during the async operation.

Here is the complete code listing for the samples (in the order they were discussed):

Sample 1: http://mattberseth2.com/ajax_modalpopup_progress/d...

<%@ Page Language="C#" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title>Untitled</title>
    <style>
        .modalBackground 
        {
            background-color:Gray;
            filter:alpha(opacity=60);
            opacity:0.60;         
        }
        .updateProgress
        {
            border-width:1px; 
            border-style:solid; 
            background-color:#FFFFFF; 
            position:absolute; 
            width:150px; 
            height:50px;    
        }
        .updateProgressMessage
        {
            margin:3px; 
            font-family:Trebuchet MS; 
            font-size:small; 
            vertical-align: middle;
        }        
    </style>    
    <script type="text/javascript">
        //  a reference to the popup behavior
        var _popup;
        
        function validate(){
            //  find the popup behavior
            this._popup = $find('mdlPopup');
            // show the popup
            this._popup.show();
            //  kick-off the webservice, registering our callback
            PageMethods.ValidateCreditCard($get('txtCreditCardNumber').value, this.callback);            
        }
        
        function callback(result){
            //  hide the popup
            this._popup.hide();
            
            //  let the user know if their credit card was validated
            if(result){
                alert('congrats, your credit card is valid!');
            }
            else{
                alert('sorry, your credit card is not valid!');
            }
        }    
            
    </script>
    <script runat="server">
        /// <summary>
        /// 
        /// </summary>
        /// <param name="number"></param>
        /// <returns></returns>
        [System.Web.Services.WebMethod]
        public static bool ValidateCreditCard(string creditCardNumber)
        {
            //  simulate a longer operation ...
            System.Threading.Thread.Sleep(3000);
            
            bool isValid = false;
            try
            {
                //  According to http://www.beachnet.com/~hstiles/cardtype.html, Visa card numbers must be
                //  either 13 or 16 digits in length and the first number must be a 4 ...
                if ((creditCardNumber.Length == 11 || creditCardNumber.Length == 13 || creditCardNumber.Length == 16) 
                    && creditCardNumber[0] == '4')
                {
                    int total = 0;
                    //  Double the value of alternate digits of the 
                    //  primary account number beginning with the second digit from the right
                    for (int i = creditCardNumber.Length - 1; i >= 0; i--)
                    {
                        int currentNumber = Convert.ToInt32(creditCardNumber[i].ToString());
                        if ((i - creditCardNumber.Length) % 2 == 0)
                        {
                            //  Add the individual digits comprising the products obtained in 
                            string doubledValue = (currentNumber * 2).ToString();

                            for (int j = 0; j < doubledValue.Length; j++)
                            {
                                total += Convert.ToInt32(doubledValue[j].ToString());
                            }
                        }
                        else
                        {
                            //  just add the number to the running total
                            total += currentNumber;
                        }
                    }

                    isValid = (total % 10 == 0);
                }
            }
            catch { }
            
            return isValid;
        }
    </script>
</head>
<body>
    <form id="frm" runat="server">
        <asp:ScriptManager runat="server" EnablePageMethods="true" />
        <div>
            <p style="background-color:AliceBlue; width:95%">
                Example of using a ModalPopupExtender as a progress indicator for validation<br />
                To test out the functionality, click the Validate button.<br />
                The validation routine was taken from <a href="http://www.beachnet.com/~hstiles/cardtype.html">here</a>
                and is specific to VISA.<br />
                <i>49927398716</i> can be used as a valid test number.<br />
            </p>
            <br />         
            
            <table>
                <tr>
                    <td>Credit Card Number</td>
                    <td>
                        <input id="txtCreditCardNumber" type="text" />
                    </td>
                    <td>
                        <input type="button" onclick="validate();" value="Validate" />
                    </td>
                </tr>                       
            </table>

            <ajaxToolKit:ModalPopupExtender 
                ID="mdlPopup" runat="server" TargetControlID="pnlPopup" 
                PopupControlID="pnlPopup" BackgroundCssClass="modalBackground"  />
                
            <asp:Panel ID="pnlPopup" runat="server" CssClass="updateProgress" style="display:none">
                <div align="center" style="margin-top:13px;">
                    <img src="Img/simple.gif" />
                    <span class="updateProgressMessage">Validating ...</span>
                </div>
            </asp:Panel>
            
        </div>
    </form>    
</body>
</html>

Sample 2: http://mattberseth2.com/ajax_modalpopup_progress/d...

<%@ Page Language="C#" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<script runat="server">
</script>
<html xmlns="http://www.w3.org/1999/xhtml" >
<head id="Head1" runat="server">
    <title>Untitled Page</title>
    <script type="text/javascript">
        
        function validate(){
            // synchronously run the server side validation ...
            PageMethods.ValidateCreditCard($get('txtCreditCardNumber').value);            
        }
            
    </script>
    <script runat="server">
        /// <summary>
        /// 
        /// </summary>
        /// <param name="number"></param>
        /// <returns></returns>
        [System.Web.Services.WebMethod]
        public static bool ValidateCreditCard(string creditCardNumber)
        {
            //  simulate a longer operation ...
            System.Threading.Thread.Sleep(3000);

            bool isValid = false;
            try
            {
                //  According to http://www.beachnet.com/~hstiles/cardtype.html, Visa card numbers must be
                //  either 13 or 16 digits in length and the first number must be a 4 ...
                if ((creditCardNumber.Length == 11 || creditCardNumber.Length == 13 || creditCardNumber.Length == 16) 
                    && creditCardNumber[0] == '4')
                {
                    int total = 0;
                    //  Double the value of alternate digits of the 
                    //  primary account number beginning with the second digit from the right
                    for (int i = creditCardNumber.Length - 1; i >= 0; i--)
                    {
                        int currentNumber = Convert.ToInt32(creditCardNumber[i].ToString());
                        if ((i - creditCardNumber.Length) % 2 == 0)
                        {
                            //  Add the individual digits comprising the products obtained in 
                            string doubledValue = (currentNumber * 2).ToString();

                            for (int j = 0; j < doubledValue.Length; j++)
                            {
                                total += Convert.ToInt32(doubledValue[j].ToString());
                            }
                        }
                        else
                        {
                            //  just add the number to the running total
                            total += currentNumber;
                        }
                    }

                    isValid = (total % 10 == 0);
                }
            }
            catch { }

            return isValid;
        }
    </script>    
</head>
<body>
    <form runat="server">
        <asp:ScriptManager runat="server" EnablePageMethods="true">
            <Scripts>
                <asp:ScriptReference Path="~/js/XMLHttpSyncExecutor.js" />
            </Scripts>
        </asp:ScriptManager>     
        <div>
            <p style="background-color:AliceBlue; width:95%">
                Example of using a synchronous AJAX call for validation<br />
                To test out the functionality, click the Validate button.<br />
                The validation routine was taken from <a href="http://www.beachnet.com/~hstiles/cardtype.html">here</a> 
                and is specific to VISA.<br />
                <i>49927398716</i> can be used as a valid test number.<br />
            </p>
            <br />         
            
            <table>
                <tr>
                    <td>Credit Card Number</td>
                    <td>
                        <input id="txtCreditCardNumber" type="text" />
                    </td>
                    <td>
                        <input type="button" onclick="validate();" value="Validate" />
                    </td>
                </tr>                       
            </table>
            
        </div>
        <script type="text/javascript">
            Sys.Net.WebRequestManager.set_defaultExecutorType("Sys.Net.XMLHttpSyncExecutor");
        </script>          
    </form>
</body>
</html>

Sample 3: http://mattberseth2.com/ajax_modalpopup_progress/d...

<%@ Page Language="C#" %>
<%@ Register Assembly="AjaxControlToolkit" Namespace="AjaxControlToolkit" TagPrefix="ajaxToolkit" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<script runat="server">
    /// <summary>
    /// 
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    protected void Page_Load(object sender, EventArgs e)
    {
        if (this.IsPostBack)
        {
            // simulate a long postback, so we
            //  can fully enjoy the animation ...
            System.Threading.Thread.Sleep(3000);
        }
    }
</script>
<head id="head" runat="server">
    <title>Untitled</title>
    <style>
        .modalBackground 
        {
            background-color:Gray;
            filter:alpha(opacity=60);
            opacity:0.60;   
        }    
        .updateProgress
        {
            border-width:1px; 
            border-style:solid; 
            background-color:#FFFFFF; 
            position:absolute; 
            width:130px; 
            height:50px;    
        }
        .updateProgressMessage
        {
            margin:3px; 
            font-family:Trebuchet MS; 
            font-size:small; 
            vertical-align: middle;
        }
    </style>
</head>
<body>
    <form runat="server">
        <asp:ScriptManager runat="server" />
        <script type="text/javascript" language="javascript">
        
            //  register for our events
            Sys.WebForms.PageRequestManager.getInstance().add_beginRequest(beginRequest);
            Sys.WebForms.PageRequestManager.getInstance().add_endRequest(endRequest);    
            
            function beginRequest(sender, args){
                // show the popup
                $find('mdlPopup').show();        
            }

            function endRequest(sender, args) {
                //  hide the popup
                $find('mdlPopup').hide();
            }
        
        </script>        
        <div>
            <asp:SqlDataSource ID="sqldsCustomers" runat="server" 
                SelectCommand="select customerid, companyname, contactname, contacttitle from dbo.customers"
                SelectCommandType="Text" ConnectionString="todo" />
            
            <p style="background-color:AliceBlue; width:95%">
            Example of using a ModalPopup as a progress indicator on more involved web pages.<br />
            To view the indicator, click on a column header to sort the GridView, or click on one of the paging buttons.<br />
            Notice how the indicator is modal. <br />
            </p>
            
            <br />
            <asp:Label ID="lblTitle" runat="server" Text="Customers" BackColor="lightblue" Width="95%" />
            <asp:UpdatePanel ID="updatePanel" runat="server">
                <ContentTemplate>
                    <asp:GridView ID="gvCustomers" runat="server" AllowPaging="true" AllowSorting="true"
                        PageSize="10" DataSourceID="sqldsCustomers" Width="95%">
                        <AlternatingRowStyle BackColor="aliceBlue" />
                        <HeaderStyle HorizontalAlign="Left" />
                    </asp:GridView>
                </ContentTemplate>
            </asp:UpdatePanel>
            
            <ajaxToolKit:ModalPopupExtender 
                ID="mdlPopup" runat="server" TargetControlID="pnlPopup" 
                PopupControlID="pnlPopup" BackgroundCssClass="modalBackground"  />
            <asp:Panel ID="pnlPopup" runat="server" CssClass="updateProgress" style="display:none">
                <div align="center" style="margin-top:13px;">
                    <img src="Img/simple.gif" />
                    <span class="updateProgressMessage">Loading ...</span>
                </div>
            </asp:Panel>
        </div>
    </form>
</body>
</html>

TrackBack

TrackBack URL for this entry:
http://mattberseth.com/blog-mt/mt-tb.fcgi/47

Listed below are links to weblogs that reference ModalPopup as an AJAX Progress Indicator:

» AJAX Update Progress (UpdateProgress) in AJAX Modal Popup (ModalPopupExtender) from Object reference not set to an instance of an object
Using article by Matt Berseth ModalPopup as an AJAX Progress Indicator I wanted to show an Update Progress [Read More]

» AJAX Update Progress (UpdateProgress) in AJAX Modal Popup (ModalPopupExtender) from Object reference not set to an instance of an object
Using article by Matt Berseth ModalPopup as an AJAX Progress Indicator I wanted to show an Update Progress [Read More]

Comments


Hi Matt,
Can you please provide a download link for each article you write? It would be easier to simply download the code files instead of copying and pasting from your blog!

Thanks

Hi bhaidar -

I appreciate the feedback. I will do this from now on and back-fill on some of the articles (starting with this one).

Thanks,
Matt

Posted by: Adam on August 3, 2007 12:00 AM

I used this approach as well, but also for standard full-page postbacks as well. At my work, we write a ton of intranet applications that are primarily forms to submit, and dont want people doing multiple submissions, or clicking on dropdowns that autopostback after they have already submitted the form.

Posted by: Gene on August 9, 2007 12:00 AM

Excellent article! I was looking for a solution for the dreaded double-click issue.

Is it possible to have more than 1 Modal Popup on a page? For example, one to handle the progress indicator and one to handle the details popup for the grid. I tried this using your sample3 example, but a CascadingDropDown on the details popup keeps firing beginRequest and endRequest functions.

Posted by: Gene on August 9, 2007 12:00 AM

Maybe a better question is how do you turn off the update progress (i.e. DropDown posting back)

Posted by: Sushil Bogam on October 11, 2007 12:00 AM

Hi this post work well with IE 7, but on IE 6 if I have drop down control in between the response drop down get disappears

Posted by: Murry Gammash on October 18, 2007 12:00 AM

Excellent article.
Thanks

Thanks for the article it works really well and helps simplify using multiple updatepanel. But id really love for there to be a delay for those really quick updates that are less than 1sec. Can you incorporate this idea into your excellent solution?

Posted by: Ronak on October 25, 2007 12:00 AM

Thank you matt.

Really an excellent article.
But one thing I want to tell u that when image appears it hide the dropdownlist of page.

So is there any idea abt it ?

Posted by: Nisar Khan on November 8, 2007 12:00 AM

hi there...

is there a way to use in a real sense means not sleep time?

in my process im not sure how many seconds will take to complete and i dont want to use sleep time, is there a neat way to use without sleep time ?

please email me if you have answer for me.

thanks.

Posted by: Paparao on November 24, 2007 12:00 AM

Thanks for you nice article
it was helped me a lot

Posted by: Gregory on December 7, 2007 12:00 AM

Matt,

Im currently trying to implement this technique using master/content pages.

However, when I place this code in the master page and place the content place holder inside the update panel a null reference JS error occurs on the "$find(mdlPopup).show();" line. Ive confirmed in my environment that this code works fine without being in a master/content page scenario.

Do you know if there are any extra considerations that I may have overlooked?

Any suggestions/advice would be greatly appreciated.

Also, your site and the techniques it contains are amazing, keep up the great work!

Thanks, Greg.

Posted by: Eric on December 14, 2007 12:00 AM

Im seeing the same issue. When implemented inside a master page this example doesnt appear to work.

Anyone find out what needs to be done to overcome this issue?

Thanks

/Eric

Posted by: Vijaianand on December 18, 2007 12:00 AM

Great stuff!! I was looking for something like this to show the user when my grid is loading.. Its saved me lot of time except its not working when I implement in the master page like others mentioned above..

Any solution found?

Posted by: Vijaianand on December 19, 2007 12:00 AM

Great stuff!! I was looking for something like this to show the user when my grid is loading.. Its saved me lot of time except its not working when I implement in the master page like others mentioned above..

Any solution found?

Posted by: VIJAIANAND on December 21, 2007 12:00 AM

I found the solution by playing with it..

Just do this way,

"$find(

Try this for masterpages: $find(ctl00_mdlPopup)

Great article Matt.

hey matt, i am glad I came across your blog. I have been an asp.net developer for about 4 years now and really wanted to get into the ms ajax framework. Your blog has given me a lot of direction and has made it easy to understand and learn. I have been working on a simple website for my friends and I to post pictures and comment on them. Please check it out and let me know... www.gooniesatl.com

Posted by: kishore on January 30, 2008 12:00 AM

great work. thanks alot.

I cant make this work for the life of me. I keep getting a JS error this._popup is null or not an object. I am using vb in code behind. Does this mean I can call a vb function in the code behind using Javascript or have I missed the idea all together. confused...can you help?

hello

you are using ID of ModalPopupExtender and I used it many time. It doesnt work because when code runs it generate the Id like ct00_ContentMain_mdlPopup then how do you simply $find(mdlPopup).show() and show it.

Posted by: Johnny on March 12, 2008 12:00 AM

Thanks very much. Of the three examples I found and implemnted what I needed in about 5 minutes.

In sample three, which I used, I had to add the BehaviorID attribute to the modalpopup tag and update the javascript to get it to work.

Otherwise, flawless, Im going to check out the rest of your site and add to my rss feeds.

Matt -- excellent job on this. Any ideas about a way to only show it if the delay is beyond some threshold? I have it in a master page and would prefer to only see it when there is a significant delay (>.5 sec) or something..... just a thought. Great job.

Posted by: Nas Ali on March 16, 2008 12:00 AM

Hi there, great post mine works perfect without the master page, but as others stated before me I get this js error: "Microsoft JScript runtime error: this._popup is null or not an object" when using a masterpage, this is driving me nuts, any help would be greatly appreciated.

Thanks

Posted by: neeraj on March 20, 2008 12:00 AM

Hi Matt,

This is really a wonderful work you are doing.
Just wanted to share you my problem I getting javavscript error using master page Although I have taken id as ctl00_Main_mdlPopup
Eror is :
sys.webForms.PageRequestManager.getInstance() is null or not an object .

ANy help would br appreciated.

Thankks,
Neeraj

Posted by: David on March 20, 2008 12:00 AM

$find(ctl00_mdlPopup)

should be:

$find();

Posted by: David on March 24, 2008 12:00 AM

Matt,

Thanks, this is a great. We are using several of your tricks on our site.

For those of you having trouble using this with master pages, there is an easy fix that should work in most situations.

Any time he is using:
$find(mdlPopup)

replace it with:
$find()

Posted by: quitchat on March 25, 2008 12:00 AM

I used following code to work-around with master page:

$find().show();

Hey Matt,

Thanks for a great bit of code. Also neeraj thanks for your help with the MasterPages worked like a charm!

Posted by: Mary on April 18, 2008 12:00 AM

hello! very nice! however im using dnn and the "modal" comes out at the very bottom of my page (not on the target panel) - also - where can i get a copy of simple.gif? thanks.

Posted by: Kamal on June 4, 2008 12:00 AM

Hi,
I came across your article and loved it. But i can not make it work in my project. it keeps throwing this error message "MS Jscript runtime error: null is null or not an object".
I set the Behavourial attribute but i do still get this error.
Can you please help?
thanks.

Posted by: Dio on June 20, 2008 12:00 AM

Very nice and easy to understand code :-) ! Please keep posting useful post. Thanks and have a nice day

Posted by: kamal on July 5, 2008 12:00 AM

Hi,
I followed your example. I have a masterpage and 2 contentplaceholder in my project. I design my page with a CSS file (#wrapper.....). when I run my project, I get this error message "Sys is not defined!". I checked my handlers in web.config and I have the correct references.
The other problem is that the panel does not display at all.
Can someone please help?
Thanks,
Kam

Posted by: Kamal on July 5, 2008 12:00 AM

Hi,
Ignore my post. I resolved it. I had my script in the header and it caused the error.
Everything is working perfectly.
Thanks.

Posted by: Kamal on July 5, 2008 12:00 AM

Hi,
Great article.
Could someone tell me how I can use it on multiple updatepanel? Is this possible?

Thanks,
Kamal

Posted by: Suresh on July 9, 2008 12:00 AM

Thanks for the excellent article, it saved me a day!

Hi Matt,

Can you please advise how can i implement this on VB .net instead of c#

Thanks

Janaka

Posted by: Marcus on July 18, 2008 12:00 AM

Do I have to use a WebMethod for this to work ? I have a function in the code behind in the which is not a webmethod and I am getting an error saying PageMethods is undefined.

Thanks

Posted by: Marcus on July 18, 2008 12:00 AM

Do I have to use an input button instead of an asp button for this to work ?

Posted by: Magesh on July 29, 2008 04:42 AM

Hi its good article , Its working in aspx form..,

Suppose i have a user control in that button click event this things have to fire( modal popup show)...,

But its not happening...,

How to resolve it

Guide me plz

I was having trouble implementing Matt's awesome progress loader on Master Pages. To fix the problem, you must use '' instead of mdlpopup.


function beginRequest(sender, args){
$find('').show();

}
function endRequest(sender, args) {
$find('').hide();
}

Posted by: Salvador Ruiz Guevara on October 9, 2008 02:41 PM

Thanks for this solution. I was looking for an easy way to control the double click problem.

But i have a question..is it possible to control when to show up the modelpopup depending on the control that triggers the postback?

Its probably knowing what control generated the request but i have been not able to find the correct solution for this.

Post a comment

(If you haven't left a comment here before, you may need to be approved by the site owner before your comment will appear. Until then, it won't appear on the entry. Thanks for waiting.)

Consulting Services

Yep - I also offer consulting services. And heck, I'll do just about anything. If you enjoy my blog just drop me an email describing the work you need done.

Recent Comments

  • Salvador Ruiz Guevara wrote: Thanks for this solution. I was looking for an easy way to control the double click problem. But i ...
  • evolhost wrote: I was having trouble implementing Matt's awesome progress loader on Master Pages. To fix the proble...
  • Magesh wrote: Hi its good article , Its working in aspx form.., Suppose i have a user control in that button clic...
  • Marcus wrote: Do I have to use a WebMethod for this to work ? I have a function in the code behind in the which is...
  • Marcus wrote: Do I have to use an input button instead of an asp button for this to work ? ...
  • Janaka wrote: Hi Matt, Can you please advise how can i implement this on VB .net instead of c# Thanks Janaka ...
  • Suresh wrote: Thanks for the excellent article, it saved me a day! ...
  • kamal wrote: Hi, I followed your example. I have a masterpage and 2 contentplaceholder in my project. I design my...