ASP.NET Jquery C # MessageBox.Show диалогового окна э-э ... проблема - PullRequest
0 голосов
/ 30 июня 2010

Я поддерживаю сайт ASP.NET, и я пытался заставить диалоги выглядеть лучше, используя jQuery.В веб-приложении есть класс C #, называемый MessageBox, который позволяет показывать сообщения клиенту со стороны сервера .... по существу, в C # в коде aspx, если какая-то логика «не вычисляет», вы можете просто MessageBox.Show ('your error message');

Так как класс MessageBox, по-видимому, просто «внедряет» javascript ... «alert (your message)», я попытался изменить javascript на вызов диалога jquery:

html: стандартное диалоговое окно примера jQuery ... (намеренно обрезать теги ... просто чтобы показать пример кода ... здесь, вероятно, есть реальный способ сделать это ... но этомой первый пост ...)

div id="dialog" title="Example dialog">
 p>Some text that you want to display to the user./p>
/div>

jQuery: я закомментировал Alert и подставил: sb.Append ("$ ('dialog'). dialog ('open');");

while( iMsgCount-- > 0 )
{
  sMsg = (string) queue.Dequeue();
  sMsg = sMsg.Replace( "\n", "\\n" );
  sMsg = sMsg.Replace( "\"", "'" );
  //sb.Append( @"alert( """ + sMsg + @""" );" );

  **** sb.Append("$('dialog').dialog('open');"); ****
}

Я ожидал, что это откроет диалоговое окно, настроенное в HTML, но ничего не показывает.Я полагал, что javascript - это javascript ... и что вместо вызова jQuery вместо ручного оповещения не будет иметь значения ... однако очевидно, что есть разрыв.

Есть мысли о том, как решить эту проблему?Или о каких-либо лучших реализациях, о которых я не знаю?

Спасибо за любую помощь ... Я включил полный класс MessageBox ниже.

Curt.

public class MessageBox
{
    private static Hashtable m_executingPages = new Hashtable();

 private MessageBox(){}

    public static void Show( string sMessage )
    {
       if( !m_executingPages.Contains( HttpContext.Current.Handler ) )
       {
          Page executingPage = HttpContext.Current.Handler as Page;
          if( executingPage != null )
          {
             Queue messageQueue = new Queue();
             messageQueue.Enqueue( sMessage );
             m_executingPages.Add( HttpContext.Current.Handler, messageQueue );
             executingPage.Unload += new EventHandler( ExecutingPage_Unload );
          }   
       }
       else
       {
          Queue queue = (Queue) m_executingPages[ HttpContext.Current.Handler ];
          queue.Enqueue( sMessage );
       }
    }

    private static void ExecutingPage_Unload(object sender, EventArgs e)
    {
       Queue queue = (Queue) m_executingPages[ HttpContext.Current.Handler ];
       if( queue != null )
       {
          StringBuilder sb = new StringBuilder();
          int iMsgCount = queue.Count;
          sb.Append( "" );
          string sMsg;
          while( iMsgCount-- > 0 )
          {
             sMsg = (string) queue.Dequeue();
             sMsg = sMsg.Replace( "\n", "\\n" );
             sMsg = sMsg.Replace( "\"", "'" );
             sb.Append( @"alert( """ + sMsg + @""" );" );
          }

          sb.Append( @"" );
          m_executingPages.Remove( HttpContext.Current.Handler );
          HttpContext.Current.Response.Write( sb.ToString() );
       }
    }
 }

Ответы [ 3 ]

3 голосов
/ 30 июня 2010

это странно ... Я написал класс, почти идентичный давным-давно.на секунду я подумал, что вы используете это!

В любом случае, я откопал код у себя.Я использовал это совсем немного.Это позволяет вам указать имя функции «Обратный вызов» в случае, если вы не хотите использовать функцию «оповещения».

Кстати, вам нужно быть осторожным с static Hashtable если у вас есть несколько человек, использующих приложение одновременно, они могут получать сообщения друг друга.

использование:

<webapp:MessageBox ID="messageBox" Callback="showMessage" runat="server" />
<script type="text/javascript">
    function showMessage(messages) {
        $("#dialog p").empty();
        for(var msg in messages) {
            $("#dialog p").html += msg;
        }
        $("#dialog p").show();
    }
</script>

Я не тестировал скрипт обратного вызова, но вы получаетеидея.

и код:

/// <summary>
/// MessageBox is a class that allows a developer to enqueue messages to be
/// displayed to the user on the client side, when the page next loads
/// </summary>
public class MessageBox : System.Web.UI.UserControl
{

    /// <summary>
    /// queues up a message to be displayed on the next rendering.
    /// </summary>
    public static void Show( string message )
    {
        Messages.Enqueue( message );
    }

    /// <summary>
    /// queues up a message to be displayed on the next rendering.
    /// </summary>
    public static void Show( string message, params object[] args )
    {
        Show( string.Format( message, args ) );
    }

    /// <summary>
    /// override of OnPreRender to render any items in the queue as javascript
    /// </summary>
    protected override void OnPreRender( EventArgs e )
    {
        base.OnPreRender( e );

        if ( Messages.Count > 0 )
        {

            StringBuilder script = new StringBuilder();
            int count = 0;

            script.AppendLine( "var messages = new Array();" );

            while ( Messages.Count > 0 )
            {
                string text = Messages.Dequeue();
                text = text.Replace( "\\", "\\\\" );
                text = text.Replace( "\'", "\\\'" );
                text = text.Replace( "\r", "\\r" );
                text = text.Replace( "\n", "\\n" );

                script.AppendFormat( "messages[{0}] = '{1}';{2}", count++, HttpUtility.HtmlEncode(text), Environment.NewLine );
            }

            if ( string.IsNullOrEmpty( Callback ) )
            {
                // display as "alert"s if callback is not specified
                script.AppendFormat( "for(i=0;i<messages.length;i++) alert(messages[i]);{0}", Environment.NewLine );
            }
            else
            {
                // call the callback if specified
                script.AppendFormat( "{0}(messages);{1}", Callback, Environment.NewLine );
            }

            Page.ClientScript.RegisterStartupScript( this.GetType(), "messages", script.ToString(), true );
        }
    }

    /// <summary>
    /// gets or sets the name of the javascript method to call to display the messages
    /// </summary>
    public string Callback
    {
        get { return callback; }
        set { callback = value; }
    }
    private string callback;

    /// <summary>
    /// helper to expose the queue in the session
    /// </summary>
    private static Queue<string> Messages
    {
        get
        {
            Queue<string> messages = (Queue<string>)HttpContext.Current.Session[MessageQueue];
            if ( messages == null )
            {
                messages = new Queue<string>();
                HttpContext.Current.Session[MessageQueue] = messages;
            }
            return messages;
        }
    }
    private static string MessageQueue = "MessageQueue";

}
0 голосов
/ 30 июня 2010

"Событие Unload () возникает после того, как страница полностью обработана, отправлена ​​клиенту и готова к удалению. На этом этапе свойства страницы, такие как Response () и Request (), выгружаются и очищаются. выполняется." http://msdn.microsoft.com/en-us/library/ms178472.aspx

Вы должны добавить свои выходные данные во время рендеринга страницы, а не в событии Unload.

После прочтения выше, что это работает с «предупреждением», я скажу, что мой ответ не поможет. Однако я скажу, что странно, что это работает, поскольку это не должно учитывать способ запуска событий в asp.net

0 голосов
/ 30 июня 2010

Обернуть испускаемый Javascript в $(function() { ... }).

...