Desenvolvimento - ASP. NET

Gerando JavaScript do lado do servidor com ASP.NET

Existem várias maneiras de se utilizar JavaScript com ASP.NET.

por Rodolfo Paoni



Existem várias maneiras de se utilizar JavaScript com ASP.NET. A primeira e mais básica delas é deixar o JavaScript hospedado de maneira estática no cliente, como por exemplo:

<asp:Button runat="server" ID="btnExcluir" Text="Excluir" OnClick="btnExcluir_Click" OnClientClick="javascript:return confirm("Deseja realmente excluir este registro?");" ToolTip="Excluir" />

Neste caso a validação é feita diretamente no cliente e o código é inserido de maneira estática, em tempo de design.

Como inserir JavaScript em ASP.NET dinamicamente?

No Code-behind, do lado servidor, da seguinte forma:

btnExcluir.Attributes.Add("onclick", "javascript:return confirm("Deseja realmente excluir este registro?");");

Como definir o botão padrão a ser acionado quando a tecla ENTER for apertada em qualquer parte da página?

Page.Form.DefaultButton = btnCadastrar.UniqueID; // Ou qualquer outro controle. P.e.: LinkButton, Hyperlink, etc.

Como exibir mensagens Alert em JavaScript criadas no lado do servidor?

Uma maneira simples seria:

Response.Write("<script>alert("Mensagem gerada pelo servidor.")</script>");

Este código gera a mensagem em qualquer ponto do código-fonte da página. Isto não pode ser controlado pelo usuário. Uma maneira de ter este controle seria utilizar um objeto chamado ClientScript presente em Page da seguinte forma:

ClientScript.RegisterClientScriptBlock(typeof(string), string.Empty,
"window.alert(\"" + msg + "\");", true);

Uma maneira de definir que o script seja executado no final da página, ou seja, que o código seja colocado no final do código-fonte da página, utilizados:

ClientScript.RegisterStartupScript(typeof(string), string.Empty,
"window.alert(\"" + msg + "\");", true);

Como monta um conjunto de métodos para exibir mensagens Alert em JavaScript em qualquer página da nossa aplicação?

Podemos utilizar uma técnica simples de herança, definindo uma classe que herde de System.Web.UI.Page e que toda classe herde desta classe customizada. Sendo assim, toda página na nossa aplicação herdará desta classe e automaticamente conterá todos os métodos que forem definidos na mesma.

Exemplo:

using System;
using System.Collections;
using System.Configuration;
using System.IO;
using System.Text.RegularExpressions;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

public partial class Principal : System.Web.UI.Page
{

// Exibe uma mensagem Alert
public void ExibirMensagem(string msg)
{
// Caso haja aspas na mensagem, mudo para aspas simples
msg = msg.Replace("\"", """);
ClientScript.RegisterStartupScript(typeof(string), string.Empty,
string.Format("window.alert(\"{0}\");", msg), true);
}

// Exibe uma mensagem Alert e força um post
public void ExibirMensagem(string msg, string url)
{
// Caso haja aspas na mensagem, mudo para aspas simples
msg = msg.Replace("\"", """);
ClientScript.RegisterStartupScript(typeof(string), string.Empty,
string.Format("window.alert(\"{0}\");window.location=\"{1}\";", msg, url), true);
}

// Exibe uma mensagem Alert e volta n páginas
public void ExibirMensagem(string msg, int qtd)
{
// Caso haja aspas na mensagem, mudo para aspas simples
msg = msg.Replace("\"", """);
ClientScript.RegisterStartupScript(typeof(string), string.Empty,
string.Format("window.alert(\"{0}\");history.go(-{1});", msg, qtd), true);
}

// Exibe uma mensagem Alert e fecha a janela atual
public void ExibirMensagem(string msg, bool fechar)
{
// Se for definido para fechar a janela
if (fechar)
{
// Caso haja aspas na mensagem, mudo para aspas simples
msg = msg.Replace("\"", """);
ClientScript.RegisterStartupScript(typeof(string), string.Empty,
string.Format("window.alert(\"{0}\");window.close();", msg), true);
}
}

// Exibe uma mensagem Alert
public static void ExibirMensagem(string msg, Page page)
{
// Caso haja aspas na mensagem, mudo para aspas simples
msg = msg.Replace("\"", """);
page.ClientScript.RegisterStartupScript(typeof(string), string.Empty,
string.Format("window.alert(\"{0}\");", msg), true);
}

// Exibe uma mensagem Alert e força um post
public static void ExibirMensagem(string msg, string url, Page page)
{
// Caso haja aspas na mensagem, mudo para aspas simples
msg = msg.Replace("\"", """);
page.ClientScript.RegisterStartupScript(typeof(string), string.Empty,
string.Format("window.alert(\"{0}\");window.location=\"{1}\";", msg, url), true);
}

// Exibe uma mensagem Alert e volta n páginas
public static void ExibirMensagem(string msg, int qtd, Page page)
{
// Caso haja aspas na mensagem, mudo para aspas simples
msg = msg.Replace("\"", """);
page.ClientScript.RegisterStartupScript(typeof(string), string.Empty,
string.Format("window.alert(\"{0}\");history.go(-{1});", msg, qtd), true);
}

// Exibe uma mensagem Alert e fecha a janela atual
public void ExibirMensagem(string msg, bool fechar, Page page)
{
// Se for definido para fechar a janela
if (fechar)
{
// Caso haja aspas na mensagem, mudo para aspas simples
msg = msg.Replace("\"", """);
page.ClientScript.RegisterStartupScript(typeof(string), string.Empty,
string.Format("window.alert(\"{0}\");window.close();", msg), true);
}
}

}

Defini uma série de sobrecargas do método ExibirMensagem. Às vezes queremos exibir uma mensagem e forçar um post para uma atualização na página. Assim, poderíamos utilizar:

ExibirMensagem("Reistro cadastrado com sucesso.", Request.Url.ToString());

Ou seja, exibimos uma mensagem e forçamos um post para a própria página, para que um GridView possa ser recarregado, por exemplo. Se fosse um erro na validação do lado do servidor e houvesse necessidade de manter os dados com o ViewState como em uma tela de cadastro, por exemplo, poderíamos utilizar:

ExibirMensagem("Os campos nome, endereço e telefone são obrigatórios."); // Validação do lado do servidor

Exibindo mensagens em UserControl do lado do servidor

Se quiséssemos utilizar esta classe em um UserControl utilizaríamos:

Principal.ExibirMensagem("Mensagem UserControl servidor", this.Page);

Outra maneira seria utilizando Reflection:

this.Page.GetType().GetMethod("ExibirMensagem", BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance,
null, new Type[] { typeof(string) }, null)
.Invoke(this.Page, new object[] { "Os campos nome e e-mail são de preenchimento obrigatório." });

Nesta classe podemos definir uma série de outros métodos como validações e outros tipos de utilidades que serão usadas por todas as página na sua aplicação.

Um abraço e bons códigos!

Rodolfo Paoni

Rodolfo Paoni - Rodolfo Paoni - Desenvolvedor .NET - Twitter: @rodolfopaoni