Como saber se o JavaScript está activo a partir do servidor em C#/.NET

O .NET não inclui uma maneira de detectar se o JavaScript está activo a partir do servidor (é possível detectar se JavaScript é suportado, mas o utilizador poderá tê-lo desactivado). É possível fazer isto usando várias técnicas. Neste artigo vou explicar como conseguir isto usando os PageMethods do .NET.

PageMethods em .NET

PageMethods, como o nome indica, são métodos que pertencem a uma página ASP.NET, mas com uma diferença - estes métodos podem ser chamados do lado do cliente, como se se tratassem de métodos de um Web Service, mas sem ter que fazer um.

Um PageMethod tem de ser declarado public e static e marcado com o atributo WebMethod. Além disso, é preciso incluir na página um ScriptManager que tenha a propriedade EnablePageMethods em true.

Esta técnica permite chamar métodos do servidor a partir do cliente, mas sem ter o trabalho de construir um Web Service - o .NET fará tudo o que é necessário nos bastidores.

Detectar se o JavaScript está activo

A ideia desta solução é usar JavaScript para chamar um método do servidor que guardará numa variável de sessão se o JavaScript está activo. Se o JavaScript não estiver activo, o método nunca será chamado, portanto saberemos que não está activo.

Este é o código necessário:

public class DetectJavascriptPage : System.Web.UI.Page {
    protected const string JAVASCRIPT_ENABLED_KEY = "JavascriptEnabled";
 
    public bool IsJavascriptEnabled { get { return GetJavascriptEnabled(); } }
 
    protected override void OnPreRender( EventArgs e ) {
        base.OnPreRender( e );
  
        // Verify that the startup script isn't already registered (postbacks)
        if (!this.ClientScript.IsStartupScriptRegistered("JavascriptTest_Startup"))
        {
            // Form the script to be registered at client side.
            StringBuilder sb = new StringBuilder();
            sb.Append("<script lang='javascript'>");
            sb.Append("PageMethods.SetJavascriptEnabled(true, SetJavascriptOnSucceeded, SetJavascriptOnFailed);");
            sb.Append("function SetJavascriptOnSucceeded() { }");
            sb.Append("function SetJavascriptOnFailed(error) { }");
            sb.Append("</script>");
   
            // Register the startup script
            this.ClientScript.RegisterStartupScript(typeof(JavascriptTest), "JavascriptTest_Startup", sb.ToString());
        }
    }
 
    [WebMethod]
    public static void SetJavascriptEnabled(bool enabled)
    {
        if (HttpContext.Current.Session[JAVASCRIPT_ENABLED_KEY] != null)
        {
            HttpContext.Current.Session[JAVASCRIPT_ENABLED_KEY] = enabled;
        }
        else
        {
            HttpContext.Current.Session.Add(JAVASCRIPT_ENABLED_KEY, enabled);
        }
    }
 
    [WebMethod]
    public static bool GetJavascriptEnabled()
    {
        if (HttpContext.Current.Session[JAVASCRIPT_ENABLED_KEY] != null)
        {
            return (bool)HttpContext.Current.Session[JAVASCRIPT_ENABLED_KEY];
        }
  
        return false;
    }
}

No pre render inclui-se código JavaScript que irá chamar o método da página, que por si irá definir a variável de sessão. Para saber se o JavaScript está activo ou não, só é preciso chamar a propriedade IsJavascriptEnabled que foi adicionada à classe da página.

Nuno Freitas
Publicado por Nuno Freitas em 25 agosto, 2011

Artigos relacionados