Introduction

When moving from Windows Forms to ASP.NET Web Forms, an API that may be
missed is that offered by the System.Windows.Forms.MessageBox
Class. Sometimes when developing web forms the application may wish to inform
the user of a successful or, god forbid, an unsuccessful operation. An effective
way to communicate an important message to the user is through the use a
MessageBox or, with respect to web programming, a JavaScript
"alert".

The MessageBox class in the System.Windows.Forms
namespace is usable only from Windows Forms and NOT ASP.NET Web Forms. In
order to alert the user we need to inject some client side code into the HTML
page. This is a simple task but can become quite a nuisance if this
functionality is required on a regular basis.

I thought that it would be nice if we could simply call a static method from
any page that would deal with the client side JavaScript required to display the
alert's. I decided to write a small MessageBox class with a
staticShow(); method.

Using the code

To use this code in your projects, simply call the static Show()
method of the MessageBox class and pass in the string that
you wish to display to the user.

As you can see from the example above, the developer isn't restricted to
displaying one message box.

Behind the scenes

The first time the Show method is invoked from a Page, a
System.Collections.Queue is created and stored in a private static
HashTable. The Queue is used to hold all of the message's
associated with current executing Page. We also "wire up" the
Page.UnLoad event so we can write the client side JavaScript to the
response stream after the Page has finished rendering its HTML.

The reason we store the Queue in a Hashtable is because we are
using static methods. There is the potential for multiple pages to be using the
class at the same time (on separate threads). Therefore we need to make sure we
know which messages belong to which page. To accomplish this we simply use the
Page's reference as the key in the HashTable. We obtain a reference
to the current executing page by casting the current IHttpHandler
to System.Web.UI.Page. The current IHttpHandler can be
obtained from HttpContext.Current.Handler. In most cases this will
be a class either directly or indirectly derived from
System.Web.UI.Page.

License

This article has no explicit license attached to it but may contain usage terms in the article text or the download files themselves. If in doubt please contact the author via the discussion board below.

I wrote this a while back, but from what i can see you should be able to use it globally as it uses a static hashtable to store all of the Message Queues by using the current IHttpHandler as the key (most likely a Page Class)

I have been using this control to send alerts when a user enters an invalid Regex string. Often the error.Message text contains embedded \r's, which will make MessageBox crash with an unterminated string exception.

The only problem I can see is that because it's adding the script using Response.Write on page unload, the page has already been completely rendered, and so the output is going after the closing </html>... it still works in at least IE 6 and Firefox 1, but I'm not sure it's good practice to write anything outside of that.. or if it will remain compatible in future browser versions.

Yeah, I didnt like doing that much either...but the purpose of that was to ensure that the JavaScript executed after the page had fully rendered on screen. I suppose it should really hook into the body.onLoad event but it seemed a bit of a hassel getting it to work cross browser

vb
' ********************************************
' purpose - send an alert message to the client
' called by - Page_Load
Private Sub Send_ClientAlert(ByVal strMessage As String)
' init the string builder for at least 5 items
Dim sb As System.Text.StringBuilder = New System.Text.StringBuilder(5)
' create the javascript command to send an alert to the user (it will be inserted
' at the top of the web page, in the head section, I believe (note - you can't just response.write this stuff - it will be at the very top of html)
sb.Append("<script language=""JavaScript"">")
sb.Append("alert('")
sb.Append(strMessage)
sb.Append("');")
sb.Append("</script>")
RegisterClientScriptBlock("showSaveMessage", sb.ToString())
End Sub