Displaying Alert boxes in asp.net from code behind (does not always work)

2k Views Asked by At

I have a generic Alert function that display a message box in my asp.net app:

public void Alert(string sTitle, string sMessage)
{
  StringBuilder sbScript = new StringBuilder();
  sbScript.Append("<script language='Javascript'>");
  sbScript.Append("var varDateNow = new Date();");
  sbScript.Append("var varTimeNow = varDateNow.getTime();");
  //sbScript.Append("var varAlertTime = document.getElementById('Master_cphAlertTime').value;");        
  sbScript.Append("var varAlertTime = document.getElementById('cphAlertTime').value;");
  sbScript.Append("if(varTimeNow - varAlertTime < 1500)");
  sbScript.Append("{alert('");
  sbScript.Append(strMessage);
  sbScript.Append("');}");
  sbScript.Append("</script>");
  ClientScript.RegisterStartupScript(this.GetType(), strTitle, sbScript.ToString());
}   

The Alert box does not appear every time. What is confusing me is why does it appear sometime and not appear at other times? The times when it does not appear is when a page is about to get redirected (or server.transfer) to another page.

Any ideas why the random functionality?

1

There are 1 best solutions below

0
On

you can implement this static class in your application

public class MessageBox
{

        private static Hashtable m_executingPages = new Hashtable();
        private MessageBox()
        { }
        public static void Show(string sMessage)
        {
            // If this is the first time a page has called this method then
            if (!m_executingPages.Contains(HttpContext.Current.Handler))
            {
                // Attempt to cast HttpHandler as a Page.
                Page executingPage = HttpContext.Current.Handler as Page;
                if (executingPage != null)
                {
                    // Create a Queue to hold one or more messages.
                    Queue messageQueue = new Queue();
                    // Add our message to the Queue
                    messageQueue.Enqueue(sMessage);
                    // Add our message queue to the hash table. Use our page reference
                    // (IHttpHandler) as the key.
                    m_executingPages.Add(HttpContext.Current.Handler, messageQueue);
                    // Wire up Unload event so that we can inject 
                    // some JavaScript for the alerts.
                    executingPage.Unload += new EventHandler(ExecutingPage_Unload);
                }
            }
            else
            {
                // If were here then the method has allready been 
                // called from the executing Page.
                // We have allready created a message queue and stored a
                // reference to it in our hastable. 
                Queue queue = (Queue)m_executingPages[HttpContext.Current.Handler];
                // Add our message to the Queue
                queue.Enqueue(sMessage);
            }
        }

        // Our page has finished rendering so lets output the
        // JavaScript to produce the alert's
        private static void ExecutingPage_Unload(object sender, EventArgs e)
        {
            // Get our message queue from the hashtable
            Queue queue = (Queue)m_executingPages[HttpContext.Current.Handler];
            if (queue != null)
            {
                StringBuilder sb = new StringBuilder();
                // How many messages have been registered?
                int iMsgCount = queue.Count;
                // Use StringBuilder to build up our client slide JavaScript.
                sb.Append("<script language='javascript'>");
                // Loop round registered messages
                string sMsg;
                while (iMsgCount-- > 0)
                {
                    sMsg = (string)queue.Dequeue();
                    sMsg = sMsg.Replace("\n", "\\n");
                    sMsg = sMsg.Replace("\"", "'");
                    sb.Append(@"alert( """ + sMsg + @""" );");
                }
                // Close our JS
                sb.Append(@"</script>");
                // Were done, so remove our page reference from the hashtable
                m_executingPages.Remove(HttpContext.Current.Handler);
                // Write the JavaScript to the end of the response stream.
                HttpContext.Current.Response.Write(sb.ToString());
            }
        }

and the call the allert/message box with just a simple call like this MessageBox.Show("hello");