Click here to Skip to main content
15,880,972 members
Articles / Web Development / HTML
Article

ASP.NET AJAX pop-up

Rate me:
Please Sign up or sign in to vote.
4.93/5 (14 votes)
22 Sep 2008CPOL5 min read 167.3K   2.9K   74   28
An article on using ASP.NET AJAX components to build a new one: a pop-up panel

Screenshot - PopupPanel.jpg

Introduction

Pop-ups are helpful items in the UI development toolbox. They allow the display and entry of additional information without changing the context and access to what's displayed in the main window. In this way, they can help to reduce the number of user actions required and the number of post-backs needed. Hence, the load on the server can also be reduced. In other words, they potentially improve the performance of the user, as well as that of the server.

In web applications, support for pop-ups is limited. One can open a new browser window using JavaScript, but it is hard to manage the pop-up. For instance, when the page is left, the pop-up should close. Also, pop-up blockers may disrupt web applications that use window.open(), causing numerous helpdesk calls. For simple error messages, one can use the JavaScript alert() function, but that one does not allow formatting of text.

With ASP.NET AJAX comes support for better user interfaces. DragPanelExtender and ResizableControlExtender support creating a pop-up that meets the needs of ASP.NET web application developers. The PopupPanel control takes this approach.

Requirements

The PopupPanel control meets the following requirements:

  1. It has an optional header and an optional footer.
  2. The header text or pop-up title can be configured.
  3. The header can be used to drag the pop-up. If there is no header, the whole pop-up becomes draggable.
  4. The header has an image button to close the pop-up.
  5. The pop-up can be resized, with minimum and maximum width and height. Resizing happens via dragging the resizing image by the lower right corner.
  6. The footer optionally has one to three buttons. The button text, as well as the client and server callback functions of these buttons, can be configured.
  7. If there is more than one pop-up on the page, it must be possible in client script to open and close each of them or to put any one of them on top, preferably in a single statement.
  8. Its HTML content must be configurable both on the client and on the server. It should have no restrictions whatsoever.
  9. If the content does not fit, the control must add a horizontal and/or vertical scrollbar to support the display. The display of these scrollbars also depends on the size of the pop-up during resizing.
  10. It comes as a single unit: all JavaScript, CSS and images are embedded resources to simplify installation.
  11. It runs on both IE7 and Firefox 2.0.
  12. If there are multiple pop-ups on a page, one can be given focus by clicking it. The pop-up that has focus is on top and has a different header color.

Implementation

The PopupPanel control is a composite control. Each PopupPanel control inserts JavaScript that creates an object to represent the pop-up. If the ID of the PopupPanel control is MyPopup, say, the corresponding JavaScript object has ID MyPopupObj. The prototype of this object contains functions for open, close, focus and resize, as well as functions that yield the ID of the popup itself, its header, its body content and its footer:

C#
// Class prototype
Ktmd.Popup.prototype = 
{
    getId:          Ktmd$Popup$getId,
    getBodyId:      Ktmd$Popup$getBodyId,
    getHeaderId:    Ktmd$Popup$getHeaderId,
    getFooterId:    Ktmd$Popup$getFooterId,
    open:           Ktmd$Popup$open,
    close:          Ktmd$Popup$close,
    focus:          Ktmd$Popup$focus,
    resize:         Ktmd$Popup$resize 
}

This way, the opening of a pop-up becomes as simple as calling eval('MyPopupObj').open(). The PopupPanel control uses both DragPanelExtender and ResizableControlExtender. The latter has a property to configure the JavaScript function to resize it. Unfortunately, this property does not allow a parameter for that function. Hence, a different function has to be defined for each pop-up, which would be called resize_MyPopup for a pop-up with ID MyPopup.

Bringing a pop-up to the front is implemented by setting its z-index upon clicking the pop-up. It is set to the maximum z-index of any pop-up plus one. There is a global variable that maintains the maximum, which is initially set to 100.

Browser specifics

Most of the browser specifics are hidden in DragPanelExtender and ResizableControlExtender. The bottom right DragHandle does not automatically appear on top of the footer in IE. Therefore the footer is 16 pixels smaller than it would otherwise be. IE gives a better 3D effect for border outset. In Firefox, the top left becomes white, blurring the boundary of the pop-up. This can be alleviated by means of the following script at the start of the HTML body:

C#
<script type="text/javascript">
    if (!document.all)
    {   // Firefox needs a bit of help handling 'outset'
        document.write("<style type='text/css'>");
        document.write("    .popupContainer{");
        document.write("        border: outset #B4B0A8 2px;");
        document.write("    }");
        document.write("</style>");
    }
</script>

The control does not look good in IE6. The resize function probably needs to be different.

Use

To use the control on a page:

  1. Register the control on the page.
    C#
    <%@ Register Assembly="KtmdServerControls" 
        Namespace="Kronos.Tmd.ServerControls" TagPrefix="Ktmd" %>
  2. Add the control to the page, as in:
    C#
    <Ktmd:PopupPanel ID="somePopup" 
        OffsetX="200px" OffSetY="200px" 
        ShowButtonOne="True"
        ButtonOneText="OK"
        ButtonOneOnClick="eval('somePopupObj').close(); return false;"
        Width="225"
        Height="150" 
        HeaderText="Title Text"
        MaximumWidth="300"
        MaximumHeight="300"
        runat="server">
        <ContentTemplate>
            <DM:UploadFile id="ucUploadFile" runat="server" />
        </ContentTemplate>
    </Ktmd:PopupPanel>
  3. To make the embedded CSS effective, add an HTML link to the page's head element.
    C#
    <link rel="Stylesheet" id="htmlStyleSheetLink" runat="server" />
  4. Set the href property upon page load. Give access to the embedded JavaScript in a similar way.
    C#
    if (!IsPostBack)
    {
        htmlStyleSheetLink.Href = PopupPanel.GetCssWebResourceUrl(Page);
    }
    ScriptManager.GetCurrent(Page).Scripts.Add(
        PopupPanel.GetJavaScriptReference());

To access the content of the control on the server, use the Content property.

C#
IUploadFile uploadFile = 
    somePopup.Content.FindControl("ucUploadFile") as IUploadFile;
string fileContent = uploadFile.GetUploadedDataUtf8Decoded();

To create a PopupPanel on the server that has one OK button and displays a div element saying "Hello World," code something like this:

C#
PopupPanel popup = new PopupPanel();
HtmlGenericControl div = new HtmlGenericControl("div");
div.Style.Add("padding", "5px");
div.InnerHtml = "Hello World";
popup.Content.Controls.Add(div);
Page.Form.Controls.Add(popup);
popup.ShowButtonOne = true;
popup.ButtonOneText = "OK";
popup.ButtonOneOnClick = popup.ClientID + "Obj.close(); return false;";

The code comes with an example static MessageBox class that shows this use of the PopupPanel.

Resources

[1]"Developing Microsoft ASP.NET Server Controls and Components" by Nikhil Kothari and Vandana Datye, Microsoft Press
[2]"Create Advanced Web Applications With Object-Oriented Techniques" by Ray Djajadinata, MSDN Magazine May 2007
[3]ASP.NET Ajax website

Feedback

It would be great to get feedback on the following:

  • Are there other ways to provide button functionality in the footer that are not limited to three buttons?
  • What would the resize function be in IE6 or other browsers?

History

  • 31 July, 2007 -- Original version posted
  • 2 August, 2007 -- Source download updated
  • 22 September, 2008 -- demo updated

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)


Written By
Web Developer
United States United States
Marc Schluper studied Applied Mathematics at Technical University Eindhoven, The Netherlands.
His employer is Kronos Hiring Solutions in Beaverton, OR.
He is married and has two children.

Comments and Discussions

 
QuestionThis project is available for visual studio 2008? Pin
ozkrgs21-Aug-09 6:21
ozkrgs21-Aug-09 6:21 
AnswerRe: This project is available for visual studio 2008? Pin
Marc Schluper21-Aug-09 7:17
Marc Schluper21-Aug-09 7:17 
GeneralCould not load file or assembly 'AjaxControlToolkit, Version=1.0.10301.0 Pin
gchq4-Feb-09 16:55
gchq4-Feb-09 16:55 
GeneralRe: Could not load file or assembly 'AjaxControlToolkit, Version=1.0.10301.0 Pin
gchq4-Feb-09 19:01
gchq4-Feb-09 19:01 
GeneralRe: Could not load file or assembly 'AjaxControlToolkit, Version=1.0.10301.0 Pin
Marc Schluper5-Feb-09 5:02
Marc Schluper5-Feb-09 5:02 
QuestionAJAX Popup Panel and Master Pages Pin
ThinkForYourSelf15-Sep-08 9:58
ThinkForYourSelf15-Sep-08 9:58 
AnswerRe: AJAX Popup Panel and Master Pages Pin
Marc Schluper22-Sep-08 10:01
Marc Schluper22-Sep-08 10:01 
I cannot reproduce what you encountered. Sigh | :sigh:
But I added a Master Page to the demo project and requested an update of the demo project.

Hope this helps,

Marc Schluper
Beaverton, OR

Generalusage from client side Pin
legcsabi20-Apr-08 3:33
legcsabi20-Apr-08 3:33 
GeneralRe: usage from client side Pin
Marc Schluper20-Apr-08 11:40
Marc Schluper20-Apr-08 11:40 
General<ktmd:upload id="ucUpload" runat="server" /> Pin
ashfaq2006s19-Dec-07 1:57
ashfaq2006s19-Dec-07 1:57 
Generalpopup content Pin
w3Nima17-Oct-07 22:56
w3Nima17-Oct-07 22:56 
GeneralRe: popup content Pin
Marc Schluper18-Oct-07 4:39
Marc Schluper18-Oct-07 4:39 
GeneralRe: popup content Pin
w3Nima20-Oct-07 21:50
w3Nima20-Oct-07 21:50 
GeneralMissing JS - StringUtils Pin
UnquaLeX6-Aug-07 21:06
UnquaLeX6-Aug-07 21:06 
GeneralRe: Missing JS - StringUtils Pin
Marc Schluper7-Aug-07 4:41
Marc Schluper7-Aug-07 4:41 
Generalstyles in masterpage Pin
Cesar to Dnn1-Aug-07 5:30
professionalCesar to Dnn1-Aug-07 5:30 
GeneralRe: styles in masterpage Pin
Marc Schluper1-Aug-07 6:19
Marc Schluper1-Aug-07 6:19 
GeneralRe: styles in masterpage Pin
Cesar to Dnn1-Aug-07 6:32
professionalCesar to Dnn1-Aug-07 6:32 
GeneralRe: styles in masterpage Pin
Marc Schluper1-Aug-07 6:54
Marc Schluper1-Aug-07 6:54 
Generalthe same here Pin
Michael Sync31-Jul-07 22:32
Michael Sync31-Jul-07 22:32 
GeneralRe: the same here Pin
Marc Schluper2-Aug-07 13:05
Marc Schluper2-Aug-07 13:05 
GeneralRe: the same here Pin
Michael Sync2-Aug-07 15:12
Michael Sync2-Aug-07 15:12 
Questioncan u please tell the password Pin
moid.ahmed31-Jul-07 17:58
moid.ahmed31-Jul-07 17:58 
AnswerRe: can u please tell the password Pin
Marc Schluper31-Jul-07 18:37
Marc Schluper31-Jul-07 18:37 
GeneralVisual Studio Express Pin
Marc Schluper31-Jul-07 17:52
Marc Schluper31-Jul-07 17:52 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Praise Praise    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.