ASP.NET is a server-based platform, which means the code you write executes on the web server instead of in the client's browser. This approach ensures that your code is kept secure from prying eyes, and it sidesteps most browser-compatibility issues. However, it also introduces some unavoidable limitations.
For example, the ASP.NET web page model doesn't provide any way to react to events, such as a user's mouse movements. In this case, the overhead of sending the page back to the server after every mouse movement would make the web page unworkably slow. Similarly, because your code can't interact directly with the browser, it can't display pop-up windows or manage multiple frames in a frameset in the same way a snippet of client-side JavaScript could.
To compensate for these limitations, ASP.NET developers often need to mix a little JavaScript code into their ASP.NET web pages. This is most commonly the case with custom controls. For example, many menu controls allow the user to browse through multiple menu levels without forcing the page to be posted back to the server every time a new level is shown. (You can find sample menu controls at Microsoft's community site.) Similar techniques are used to ensure that other controls remain rich and responsive, without requiring any work from the web server.
Related Reading ![]() ASP.NET in a Nutshell, 2nd Edition |
In this article, we'll consider three common tasks that require JavaScript but aren't specific to custom controls. You can use these tricks to quickly solve problems that have no native .NET solution. But first, let's look at what you need to do to use JavaScript in an ASP.NET page.
To use JavaScript in an ASP.NET page, you first need to take two steps:
Page.RegisterStartupScript()
or the Page.RegisterClientScriptBlock()
method. In the first case, the JavaScript
code will execute immediately the next time the page is posted back. In the latter
case, the JavaScript code will not execute unless you connect the client-side event
of another control to the JavaScript function. In this article, we'll use the first
approach.The next three sections demonstrate this technique.
Pop-up windows, often used for advertisements and promotions, are a hallmark of the
Internet. But ASP.NET doesn't provide any mechanism for showing pop-up windows,
because your code can't interact directly with the client's browser. The only solution is to
use JavaScript, which provides the useful window.open()
function.
window.open()
function requires three parameters:
height
and width
attributes (with pixel
values); the toolbar
, menuBar
, and scrollbar
attributes (set to yes
or no
, depending
on whether you want to display these elements); and the resizable
attribute (set to
yes
or no
, depending on whether you want a fixed or resizable window border).The following C# code defines the JavaScript code for showing the PopUp.aspx web page in a new window, and registers it to execute immediately upon the page being posted back the next time.
string popupScript = "<script language='javascript'>" +
"window.open('PopUp.aspx', 'CustomPopUp', " +
"'width=200, height=200, menubar=yes, resizable=no')" +
"</script>";
Page.RegisterStartupScript("PopupScript", popupScript);
In VB .NET, the code is virtually identical:
Dim popupScript As String = "<script language='javascript'>" & _
"window.open('PopUp.aspx', 'CustomPopUp', " & _
"'width=200, height=200, menubar=yes, resizable=no')" & _
"</script>"
Page.RegisterStartupScript("PopupScript", popupScript)
You can use this code in any event handler. For example, you might want the window to appear when the page first loads, or after the user clicks a button or performs another action. In any case, the pop-up window will only appear the next time the page is returned to the user. If you want it to reappear the next time the user takes an action, you'll need to create and register the script block again.
Note that when the script block is added to the page, it's identified with a descriptive name (in this case, "PopupScript"). If you add a script block with the same name multiple times, it will only be added to the page once.
The ASP.NET web controls provide a TabIndex
property, but this property only applies
to Internet Explorer and can't be used to programmatically set the focus to a control of
your choice. To perform this task, you'll need the help of some JavaScript code. In this
case, you need to find the JavaScript object that corresponds to the control, and call its focus()
method.
The easiest way to handle this task is to create a function that accepts a control, extracts its client-side ID, and uses it to generate the JavaScript function required to set the focus to that control. You can then register this function so it will set the focus the next time the next time the page is sent to the user.
Here's the function you will need in C#:
private void SetFocus(Control ctrl)
{
// Define the JavaScript function for the specified control.
string focusScript = "<script language='javascript'>" +
"document.getElementById('" + ctrl.ClientID +
"').focus();</script>";
// Add the JavaScript code to the page.
Page.RegisterStartupScript("FocusScript", focusScript);
}
Here's the same function rewritten for VB .NET:
Private Sub SetFocus(ByVal ctrl As Control)
' Define the JavaScript function for the specified control.
Dim focusScript As String = "<script language='javascript'>" & _
"document.getElementById('" + ctrl.ClientID & _
"').focus();</script>"
' Add the JavaScript code to the page.
Page.RegisterStartupScript("FocusScript", focusScript)
End Sub
You can now call the custom SetFocus()
function from any event handler to change the
control focus as needed:
SetFocus(myTextBox);
Remember, the focus change won't take effect until the page is rendered and sent back to the browser.
Frames allow you to display more than one HTML document in the same browser window. In the case of a site with a navigational menu, you could split the page vertically into two frames. The frame on the left would contain the navigation control, while the frame on the right would show the selected content. (For more information about frames, refer to this HTML Frames tutorial or this Web Authoring FAQ.)
Because frames only exist on the client side, it's a little more work to manipulate them in your ASP.NET code. You need to explicitly select the frame you want to modify, and then assign a new location (URL) to it. The following VB .NET code snippet registers the JavaScript coded needed to change frame 1 to a new page. You can assume that this code will run in the page inside of frame 0.
Dim url As String = "NewPage.aspx"
' Use JavaScript to trigger the redirect in the other window.
Dim frameScript As String = "<script language='javascript'>" & _
"window.parent.frames(1).location='" & Url & "';</script>"
Page.RegisterStartupScript("FrameScript", frameScript)
The C# code is virtually identical:
string url = "NewPage.aspx";
// Use JavaScript to trigger the redirect in the other window.
string frameScript = "<script language='javascript'>" +
"window.parent.frames(1).location='" + url + "';</script>"
Page.RegisterStartupScript("FrameScript", frameScript);
A sprinkling of JavaScript code can enhance the reach and responsiveness of your ASP.NET web pages. Best of all, you don't need to sacrifice ASP.NET's secure, server- based model for the bulk of your coding; just fill in the gaps with a little dash of client-side magic.
Matthew MacDonald is an author, educator, and MCSD developer with a passion for emerging technologies. He is the author of several books about programming with .NET, including The Book of VB .NET (No Starch) and ASP.NET: The Complete Reference (Osborne McGraw-Hill), and a contributor to O'Reilly titles such as C# in a Nutshell, and Programming .NET Web Services. He is also a coauthor of ASP.NET in a Nutshell, 2nd Edition.
O'Reilly & Associates recently released (August 2003) ASP.NET in a Nutshell, 2nd Edition.
Sample Chapter 6, "User Controls and Custom Server Controls," is available free online.
You can also look at the Table of Contents, the Index, and the full description of the book.
For more information, or to order the book, click here.
Return to ONDotnet.com
Copyright © 2004 O'Reilly Media, Inc.