Decrease Font Size
Increase Font Size
   BLOG

MultiHandleSliderExtender could not be set on property MultiHandleSliderTargets

by bryian 7. February 2010 16:50

MultiHandleSliderExtender could not be set on property MultiHandleSliderTargets |

Error Creating Control - MultiHandleSliderExtender1

 

I was working with the AJAX MultiHandleSliderExtender control, the thing that bother me the most is the error listed below at design time. The code didn't throw any error at runtime.

Error Creating Control - MultiHandleSliderExtender1
'cc1:MultiHandleSliderExtender could not be set on property MultiHandleSliderTargets'

Here is the markup code

<%@ Register Assembly="AjaxControlToolkit" Namespace="AjaxControlToolkit" TagPrefix="cc1" %>
<cc1:MultiHandleSliderExtender ID="MultiHandleSliderExtender2" runat="server">
       <MultiHandleSliderTargets>
       <cc1:MultiHandleSliderTarget ControlID="someID" />
       </MultiHandleSliderTargets>
       </cc1:MultiHandleSliderExtender>

After looking into the source code carefully, I noticed that the MultiHandleSliderTargets control is missing a TagPrefix next to it. Placing the TagPrefix "cc1:MultiHandleSliderTargets" has solved the problem.

ASP.NET redirect a web page with AJAX loading indicator image

by bryian 6. February 2010 17:14

ASP.NET page redirecting progress indicator |

Progress Indicator |

Progress Indicator For Slow-Loading Pages |

ASP.NET intermediate processing page |

ASP.NET AJAX loading page |

ASP.NET intermediate page |

ASP.NET Menu Target |

ASP.NET progress indicator |

AJAX loading indicator |

Page Loading Indicator |

ASP.NET progress bar

 

Introduction

There are times when the web pages that the web applications are redirecting to, might take some time to response or load. For instance, after the users successfully login into a web application, the application will redirect the request to the home page. Imagine that, if the mentioned page contains a dashboard and many personalized WebParts. The requested web page might take some time to respond depending on the users Internet connection speed and the amount of network traffic at any given time. Some users might get impatient and tempted to click on other buttons or links on the page, see figure 1. To overcome this problem, first, redirect the request to an intermediate page, and then load the requested page from there. The main purpose of the intermediate page is to display an AJAX loading indicator image (figure 2), while the users wait for the requested web page to respond.

Figure 1
no loading indicator
Figure 2
with loading indicator

Implementation

Create an HTML page and name it Redirecting.html, add an image tag in the body section and wrap it in a div element. See listing 1

Listing 1

<div style='position:absolute;z-index:5;top:45%;left:45%;'>
    <img id="imgAjax" alt="loading..." title="loading..." src="images/ajax-loading.gif" style="width: 100px; height: 100px" /><br /> <br />
 </div>

Add the JavaScript shown in listing 2 below the div tag. In this JavaScript, we have two global variables namely querystring and page, and a public function called toPage. After reading the JavaScript best practices article, I decided to employ the JavaScript module pattern. I have created a namespace called redirect to wrap the mentioned public variables and function. The variable querystring will return the query string value in the current URL. The page variable will return the substring of the querystring from index of "=" to the end of the string. The purpose of the function toPage() is to append a Header to refresh the web page for browsers other than Internet Explorer (IE). If the browser type is IE and its version is greater than or equal to 4, then use the location.replace function to replace the current URL with new location URL. The redirect.begin() will invoke the toPage() method.

Listing 2

<script type="text/javascript">
    /* <![CDATA[ */
    this.focus(); //focus on new window
    redirect = function() {
        var querystring = window.location.search.substring(1); //query string
        var page = querystring.substring(querystring.indexOf('=') + 1, querystring.length);
        function toPage() {
            if (page !== undefined && page.length > 1) {
                document.write('<!--[if !IE]>--> <head><meta http-equiv="REFRESH" content="1;url=' + page + '" /><\/head><!--<![endif]-->');
                document.write(' \n <!--[if IE]>');
                document.write(' \n <script type="text/javascript">');
                document.write(' \n var version = parseInt(navigator.appVersion);');
                document.write(' \n if (version>=4 || window.location.replace) {');
                document.write(' \n window.location.replace("' + page + '");');
                document.write(' document.images["imgAjax"].src = "images/ajax-loading.gif"');
                document.write(' \n } else');
                document.write(' \n window.location.href="' + page + '";');
                document.write(' \n  <\/script> <![endif]-->');
            }
        }
        return {
            begin: toPage
        }
    } ();

    redirect.begin();

    /* ]]> */
</script>  

Using the Code

Response.Redirect("Redirecting.html?page=test.aspx");

<a href="Redirecting.html?page=test.aspx" target="_blank"> Redirect and Open on new page</a>

//requested web page with multiple query string
<a href="Redirecting.html?page=http://www.amazon.com/gp/offer-listing/059610197X?tag=asp-net-20&linkCode=sb1&camp=212353&creative=380553">
	Redirect with multiple query string</a>

Points of Interest

When I tested this JavaScript on browsers other than Internet Explorer, the image did not render correctly. Injecting a Header to refresh the page instead of calling the location.replace or location.href solves the problem.

I encapsulated the JavaScript in a HTML page because the whole process does not require server side programming and I can reuse it in others web applications that are written in different programming languages.

On IE 6, the order of the lines shown below is very important. If we place 2 before 1, the image will not display on IE 6. The current order works fine on both the IE 6 and 7.
1) document.write(' \n window.location.replace("' + page + '");');
2) document.write(' document.images["imgAjax"].src = "images/ajax-loading.gif"');

Conclusion

I hope someone will find this tips useful. If you find any bugs or disagree with the contents, please drop me a line and I'll work with you to correct it. I would suggest downloading the demo and explore it in order to grasp the full concept of it because I might have left out some useful information. Tested on IE 6.0/7.0, Firefox, Google Chrome, Apple Safari 4.0.4, Verizon BlackBerry Storm

Tested on IE 6.0/7.0/8.0, Google Chrome, Firefox, Safari

Resources

JavaScript best practices

Watch this script in action

Demo

Downloads

Download

Data is Null This method or property cannot be called on Null values

by bryian 9. January 2010 09:14

I was working on one of the VB.NET application that have been developed several years ago and I saw some declaration like Str7 = objDr.GetString(7).ToString, Str8 = objDr.GetString(8).ToString, Str9 = objDr.GetString(9).ToString and so on. It puzzled me, what will happen if the value in the column 7, 8, or 9 is null. Then, I went in to the SQL database, pull out the table and changed the value to null. And I received this error "

Data is Null. This method or property cannot be called on Null values.

" If you happen to come across this situation, below is the work around.

 

Solution:

If (Not objDr(8) Is DBNull.Value) Then
     Str8 = Trim(objDr.GetString(8).ToString)
End If

Extender control ValidatorCalloutExtender cannot extend TextBox

by bryian 6. January 2010 19:52

Extender control 'ValidatorCalloutExtender1' cannot extend 'TextBox1'. Extender controls of type 'AjaxControlToolkit.ValidatorCalloutExtender' cannot extend controls of type 'System.Web.UI.WebControls.TextBox'.

Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.

Exception Details: System.InvalidOperationException: Extender control 'ValidatorCalloutExtender1' cannot extend 'TextBox1'. Extender controls of type 'AjaxControlToolkit.ValidatorCalloutExtender' cannot extend controls of type 'System.Web.UI.WebControls.TextBox'.

 

Solution: Make sure the TargetControlID of the ValidatorCalloutExtender is set to a validator control instead of the TextBox control

Example:

<asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>

   <asp:RequiredFieldValidator ID="RequiredFieldValidator1" runat="server" 
        ErrorMessage="Required field" Display="None" 
        ControlToValidate="TextBox1" />
        
   <cc1:ValidatorCalloutExtender ID="ValidatorCalloutExtender1" 
        TargetControlID="RequiredFieldValidator1" runat="server" />