Desenvolvimento - Visual Basic .NET

Usando MessageBox no ASP.NET

Tenho acompanhado em alguns fóruns de ASP.NET diversas questões envolvendo a classe MessageBox e ASP.NET. Entre elas: Por que ASP.NET não implementa MessageBox? Como faço para mostrar mensagens do tipo dialogo? ...

por Rodrigo Glauser



Tenho acompanhado em alguns fóruns de ASP.NET diversas questões envolvendo a classe MessageBox e ASP.NET. Entre elas:Por que ASP.NET não implementaMessageBox? Como faço para mostrarmensagens do tipo dialogo? Como faço para chamar um método no servidor a partir da escolha do usuário em um scriptclient side? e assim por diante. A respostaque costumo dar é de que a tecnologia ASP.NET é assim como outras tecnologias server side(processamento no servidor)baseada em requisições http que são stateless e pormais que o .NETframework tenha se aproximado do modo de se desenvolver WindowsFormse WebForms ainda assim há diferenças nos conceitos de programação paracada uma delas.

Mas então qual é a forma de se interagir com o cliente? Bem,nós temos algumas linguagens de script que podem sim interagir com o cliente e neste artigo mostrarei como fazer um script client side interagir com o cliente e com oASP.NET. O código do WebControl está em VB.NET, porém você poderá utilizar em seus Projetos C# ou outra linguagem do .NET Framework bastando somente importar o Controle para o toolbox.

Passo 1- Criando o Web Control MessageBox

Crie um Projeto do tipo Web Control Library em Visual Basic chamado ContoleMessageBox.

Abra o arquivo WebCustomControl1.vb e substitua seu conteúdo pelo código abaixo.

Imports System.ComponentModel
Imports System.Web.UI

Public Class MessageBox
    Inherits System.Web.UI.WebControls.WebControl
    Implements IPostBackEventHandler
    Private _Message As String
    Private _Key As String
    Private _PostBackOnYes As Boolean
    Private _PostBackOnNo As Boolean

Public Event YesChoosed(ByVal sender As Object, ByVal Key As String)
Public Event NoChoosed(ByVal sender As Object, ByVal Key As String)

    Public Sub ShowConfirmation(ByVal Message As String, _
      ByVal Key As String, _
         ByVal PostBackOnYes As Boolean, _
              ByVal PostBackOnNo As Boolean)
        _Message = "Conf" & Message
        _Key = Key
        _PostBackOnYes = PostBackOnYes
        _PostBackOnNo = PostBackOnNo
    End Sub

    Public Sub ShowMessage(ByVal Message As String)
        _Message = Message
    End Sub

    Protected Overrides Sub OnPreRender(ByVal e As EventArgs)
        If Not MyBase.Page.IsClientScriptBlockRegistered( _
                                             "MessageBox") Then
 Page.RegisterClientScriptBlock("MessageBox", FunctionJava1())
        End If
    End Sub

    Private Function FunctionJava1() As String
        Dim meuPostBackOnYes As String = _
                               "MessageBoxTextoMensagem="""";"
        Dim meuPostBackOnNo As String = _
                               "MessageBoxTextoMensagem="""";"

        If _PostBackOnYes Then
            meuPostBackOnYes = _
               Page.GetPostBackEventReference(Me, "Yes" & _Key)
        End If
        If _PostBackOnNo Then
            meuPostBackOnNo = _
           Page.GetPostBackEventReference(Me, "No_" & _Key)
        End If

        Return "<script language=""javascript""> " & _
           "var MessageBoxTipoMensagem; " & _
           "var MessageBoxTextoMensagem; " & _
           "if (document.all&&window.attachEvent) { " & _
"window.attachEvent(""onfocus"", MessageBoxMostrarMensagem); " & _
           "} else if (window.addEventListener) {  " & _
           "window.addEventListener(""load""," & _ 
"MessageBoxMostrarMensagem,false); }"
& _ "function MessageBoxMostrarMensagem() { " & _ "if (MessageBoxTextoMensagem) { " & _ "if (MessageBoxTextoMensagem != """") { " & _ "if (MessageBoxTipoMensagem==2) {" & _ " alert(MessageBoxTextoMensagem); " & _ "} else {" & _ "if (confirm(MessageBoxTextoMensagem)) { " & _ meuPostBackOnYes & _ "} else { " & _ meuPostBackOnNo & _ "}} MessageBoxTextoMensagem=""""; " & _ " }}} </script>" End Function Protected Overrides Sub Render( _ ByVal writer As System.Web.UI.HtmlTextWriter) If ModoDesign(Me) Then writer.Write(Me.ID) Else If _Message <> String.Empty Then Dim miSB As System.Text.StringBuilder = _ New System.Text.StringBuilder(_Message) miSB.Replace("""", """c) If miSB.ToString.StartsWith("Conf") Then Me.Page.Response.Write( _ "<script>MessageBoxTipoMensagem=1; MessageBoxTextoMensagem=""" + _ miSB.ToString.Substring(4) + """;</script>") Else Me.Page.Response.Write( _ "<script>MessageBoxTipoMensagem=2; MessageBoxTextoMensagem=""" + _ miSB.ToString + """;</script>") End If miSB = Nothing End If End If End Sub Private Shared Function ModoDesign(ByVal QueControl As _ System.Web.UI.WebControls.WebControl) As Boolean Dim DesignMode As Boolean = False Try DesignMode = QueControl.Site.DesignMode Catch : End Try Return DesignMode End Function Public Sub RaisePostBackEvent(ByVal eventArgument As String) _ Implements IPostBackEventHandler.RaisePostBackEvent Select Case eventArgument.Substring(0, 3) Case "Yes" RaiseEvent YesChoosed(Me, eventArgument.Substring(3)) Case "No_" RaiseEvent NoChoosed(Me, eventArgument.Substring(3)) End Select End Sub End Class

Este controle web encapsula funcionalidades de um MessageBox em um WebControl. Os métodos ShowMessage e ShowConfirmation enviam informações aobrowser docliente através dejavascript que é renderizado pelo controle no eventoonfocus da página (para o Internet Explorer )e load ( para o Mozilla ).

Os 2 Eventos ( YesChoosed e NoChoosed )trazem o retorno do client Side Script para o Processamento no lado servidor, isto é possível graças aoevento RaisePostBackEvent da interface IPostBackEventHandler queestamos implementando.

Este WebControl contém os seguintes eventos e métodos:
ShowConfirmation. Mostra uma Mensagem de confirmação. A escolha do usuário por sim chamará o evento YesChoosed no Servidor e a escolha por Cancel irá chamar o evento NoChoosed.

ShowMessage.
Mostra uma Simples Mensagem.

NoChoosed.
Evento disparado se usuário clicar en Cancelar e se no Método ShowConfirmation o parâmetro PostBackOnNo estiver = true
YesChoosed.
Evento disparado se usuário clicar enOk e se no Método ShowConfirmation o parâmetro PostBackOnYes estiver = true

Agora basta compilar a solução no modo Release para gerar o assembly do Web Control.

Passo 2- Testando o Web Control MessageBox

Com o Web Control compilado vamos criar um novo Projeto ASP.NET Web Application chamado TestaMessageBoxe importá-lo no para o toolbox de componentes.

Clique com o botão direito no Toolbar do Visual Studio -> Add/Remove Items. Irá aparecer uma janela com todos os componentes do GAC. Clique em Browse e navegueaté a pasta onde está o assembly do Web Control e selecione o Arquivo MessageBox.dll. Clique em Ok. O Componente deverá ter aparecido no toolbar como está apresentado abaixo:

Adicione um novo WebForm chamado default.aspx ao projeto, altere sua propriedade PageLayout=FlowLayout e adicione os seguintes controles:

  TextBox:Id=txtTextoText="" 
Button : Id=btnIncluir Text="Incluir"
DropDownList : Id=DropItens
Button : Id=btnExcluir Text="Excluir"
MessageBox : Id=MessageBox

Disposição dos controles na página:

A idéia desta página é de incluir itens no DropDownList através do que é digitado noTextBox e gerar uma confirmação ( Ok, Cancel ) e depois de incluído geraruma simples mensagem, o mesmo acontecendo para a exclusão.

Clique duas vezes sobre o Botão btnIncluir e adicione o seguinte código que fará que no evento click do btnIncluir apareça um prompt de confirmação para o cliente.

Private Sub btnIncluir_Click(ByVal sender As System.Object, _
            ByVal e As System.EventArgs) Handles btnIncluir.Click
Me.MessageBox.ShowConfirmation("Deseja Mesmo Incluir?", _ " Texto
"Incluir", _ " Key -  É a chave que identificará quem originou.
True, _ " PostPackOnYes - Indica se a confirmação Ok gerará um PostBack
False)" PostPackOnNo - Indica se a conf. Cancel gerará um PostBack
End Sub

Neste prompt aparecerá a janela com os botões Ok e Cancelar. No método ShowConfirmation do MessageBox podemos escolher se ambas escolhas produzirão um PostBack ou não e também adicionar uma chave para que no retorno do PostBack possamos identificar quem o causou. No exemplo abaixo iremos forçar o PostBack somente se o Usuário clicar em Ok, se isto acontecer o método MessageBox_YesChoosed qeue será criado mais abaixo será chamado.

Da mesma forma que adicionamos uma confirmação para a inclusão iremos adicionar uma para a exclusão:

Private Sub btnIncluir_Click(ByVal sender As System.Object, _
            ByVal e As System.EventArgs) Handles btnIncluir.Click
Me.MessageBox.ShowConfirmation("Deseja Mesmo Excluir?", _
                                                 "Excluir", _
                                                   True, False)
End Sub
					

Agora o método principal que fará o processamento da solicitação do cliente. Clique encima de YesChoosed como mostrado abaixo para gaear o evento.

Adicione o seguinte código para este evento:

Private Sub MessageBox_YesChoosed(ByVal sender As Object, _ 
ByVal Key As String) Handles MessageBox1.YesChoosed
 If Key = "Incluir" Then
    Me.DropItens.Items.Add(Me.txtTexto.Text)
    MessageBox.ShowMessage("Item Incluído")
 ElseIf Key = "Excluir" Then
    Me.DropItens.Items.Remove(Me.DropItens.SelectedItem)
    MessageBox.ShowMessage("Item Excluído")
 End If
End Sub
					

O Evento YesChoosed recebe a confirmação vinda do cliente e com sua chave ( key ) identificamos qual ação deveremos realizar para cada solicitação. Ou seja Inclusão e Exclusão. Após cada ação executada enviamos uma mensagem com o ShowMessage().

Neste Artigo vimos uma forma simples de emular o funcionamento do MessageBox, esta classe tão querida dos programadores WinForms. Este controle foi testado nos navegadores Internet Explorer 6.0 e no Mozilla FireFox 1.0 e em Projeto VB.NET e C#ASP.NETWeb Application com .NET Fx 1.1. Outras versões de nevegadores, linguagens e .NETframeworkdeverão ser testadas.

Downloads:

Web Control MessageBox
Testando o MessageBox

Rodrigo Glauser

Rodrigo Glauser - É líder do Grupo de Usuários Gup.NET Ponta Grossa/PR, desenvolvedor coorporativo da Masisa do Brasil LTDA, trabalha atualmente em um projeto de integração .NET e SAP em filiais da empresa localizadas no Brasil, Argentina, Chile, Venezuela e México, trabalha com .NET há 2 anos e com programação web há 4 anos. Também concentra esforços em soluções para internet na solucoesweb.com.
The Spoke:
http://br.thespoke.net/MyBlog/rglauser/MyBlog.aspx