ASP.NET 2.0 - Usando a Caixa de mensagem


Vou iniciar o artigo com uma má notícia:

"Você não pode usar uma caixa de mensagem (MsgBox ou MessageBox) na ASP.NET. O código é executado no servidor e mesmo que você use uma msgbox , quando a página requisitada gerar a caixa de mensagem ele será exibida no servidor e não na máquina do cliente. Se você deseja gerar uma mensagem de aviso do lado do cliente deve usar um alert JavaScript."

Você não consegue simular uma MessageBox ou mesmo função MsgBox da mesma forma que você esta acostumado usar em aplicações Windows Forms.

Você pode pensar que a coisa é simples de implementar afinal não basta o servidor emitir o código javascript para o cliente quando gerar a resposta HTML e o navegador do cliente executar o código JavaScript para exibir uma caixa de mensagem ?

Existe até uma forma simples de contornar o problema usando o seguinte código em um módulo code-behind da página ASP.NET:

Public Sub ASPNET_MsgBox(ByVal Message As String)

System.Web.HttpContext.Current.Response.Write("<SCRIPT LANGUAGE=""JavaScript"">" & vbCrLf)

System.Web.HttpContext.Current.Response.Write("alert(""" & Message & """)" & vbCrLf)

System.Web.HttpContext.Current.Response.Write("</SCRIPT>")

End Sub

Mas não é tão simples assim. Afinal as páginas e os controles são processados no servidor e a mensagem tem que ser exibida no cliente.

Como as caixas de mensagens são criadas no lado do cliente, pode ser difícil para páginas ASP.NET rodando no servidor, invocar alguma funcionalidade do lado do cliente. Além disso se o cliente desabilitar os scripts no seu navegador, os alertas ou caixas de mensagens não irão funcionar pois estas funcionalidades trabalham usando scripts do lado do cliente.

Neste artigo vou mostrar como usar alguns dos novos recursos da ASP.NET 2.0 para contornar o problema.

A ASP.NET 2.0 usa a nova propriedade Page.ClientScript para registrar e colocar funções JavaScript em suas páginas ASP.NET, os métodos Page.RegisterStartUpScript e Page.RegisterClientScriptBloc da versão 1.0/1.1 da plataforma .NET podem ser considerados obsoletos pois agora você tem que fornecer o conjunto de parâmetros chave/script para registrar scripts do lado do cliente.

O método RegisterClientScriptBlock permite que você coloque uma função JavaScript no topo da página. Vejamos o código abaixo:

Dim meuscript As String = "function Ola() { alert('Ola, Ben-Vindo a ASP.NET 2.0');}"

Page.ClientScript.RegisterClientScriptBlock(Me.GetType(), "MeuScript", meuscript, True)

Neste código podemos ver que cria-se uma função JavaScript como uma string chamada meuscript.

Usando o método Page.ClientScript.RegisterClientScriptBlock você programa o script para ser colocado na página.

Temos duas versões sobrecarregadas deste método:

RegisterClientScriptBlock(type,key,script)

RegisterClientScriptBlock(type,key,script,tag specification)

Acima estamos especificando o tipo como Me.GetType, a chave , o script para incluir e então um valor boleano definido como True de forma que a ASP.NET colocara o script na página ASP.NET com a tag <script> de forma automática.

Ao rodar a página, você poderá ver o código fonte para a página conforme abaixo:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head><title>
Untitled Page
</title></head>
<body>
<form name="form1" method="post" action="Default.aspx" id="form1">
<div>
<input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value="/wEPDwUKMTQ2OTkzNDMyMWRk+EkQMVGipQ+kuCw2vZN0l682PNc=" />
</div>

<script type="text/javascript">
<!--
function Ola() { alert('Olá,BenVindo a ASP.NET 2.0');}// -->
</script>

Usando Page.ClientScript.RegisterStartUpScript

O método Page.ClientScript.RegisterStartUpScript coloca o script no fundo da página ASP.NET ao invés de colocar no topo e usa o mesmo construtor que o método RegisterClientScriptBlock.

Se você tiver um JavaScript em um dos seus controles na página vai desejar usar o método RegisterClientScriptBlock.Você pode usar o código a seguir para criar uma página que inclui um controle <asp:TextBox> que contém um valor padrão para saudação em ASP.NET:

<asp:TextBox ID="Textbox1" runat="server" >Hello ASP.NET </asp:TextBox>

E então usar o método RegisterStartUpScript para colocar o script na página que usa o valor no TextBox1 conforme abaixo:

Dim meuscript As String = "alert(document.getElementById('TextBox1').value);"
Page.ClientScript.RegisterStartupScript(Me.GetType(), "meuscript", myscript, True)




Incrementando ainda mais o exemplo vamos incluir código para exibir uma caixa de mensagem quando o usuário clicar no botão de comando - Clique Me agora.

A seguir temos o código da página Default.aspx:

<%@ Page Language="VB" AutoEventWireup="false" CodeFile="Default.aspx.vb" Inherits="_Default" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
<title>Diplaying MessageBox from ASP.NET</title>
</head>
<body>
<form id="form1" runat="server">
<div>
<asp:Button ID="Button1" runat="server" Text="Clique Me agora" />
<asp:TextBox ID="Textbox1" runat="server" >Olá ASP.NET </asp:TextBox>
</div>
</form>
</body>
</html>

Agora no code-behind incluímos o seguinte código:

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
'Dim meuscript As String = "function Hello() { alert('Olá,BenVindo a ASP.NET 2.0');}"
'Page.ClientScript.RegisterClientScriptBlock(Me.GetType(), "MyScript", meuscript, True)
Dim myscript As String = "alert(document.getElementById('TextBox1').value);"
Page.ClientScript.RegisterStartupScript(Me.GetType(), "myscript", myscript, True)
End Sub

Protected Sub Button1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button1.Click

Dim strMessage As String
strMessage = "Ola, voce clicou no botão Clique-me"

'termina o processamento do servidor e retorna ao cliente
Dim strScript As String = "<script language=JavaScript>"
strScript += "alert(""" & strMessage & """);"
strScript += "</script>"

If (Not ClientScript.IsStartupScriptRegistered("clientScript")) Then
      ClientScript.RegisterClientScriptBlock(Me.GetType(), "clientScript", strScript)
End If

End Sub

Note que no evento Click do botão de comando , estamos fornecendo o código JavaScript do lado do cliente e registrando-o usando o método RegisterClientScriptBlock ; além disso estamos verificando se o mesmo já esta registrado ou não para evitar duplicidade.

Executando o projeto e clicando no botão temos o seguinte resultado:

Pegue o projeto completo aqui: MessageBox.zip

Eu sei é apenas ASP.NET, mas eu gosto..