Serializar un objeto a JSON en C#

En ocasiones nos interesa serializar un objeto en JSON, como por ejemplo al usar el AJAX de jQuery. Es tan fácil como esto:

static public string ToJSON(object obj)
{
    System.Web.Script.Serialization.JavaScriptSerializer serializer = new System.Web.Script.Serialization.JavaScriptSerializer();
    return serializer.Serialize(obj);
}

Obtener un parámetro de la URL desde JavaScript

Función que nos permite obtener un parámetro de la URL pasado por GET desde JavaScript. En el caso de que el parámetro no exista nos devuelve un null.

// Helper function to get parameters from the query string.
function getUrlParam(paramName) {
    var reParam = new RegExp('(?:[\?&]|&)' + paramName + '=([^&]+)', 'i');
    var match = window.location.search.match(reParam);
    return (match && match.length > 1) ? match[1] : null;
}

Devolver un código 301 (Moved Permanently) en C#

En algunos casos necesitamos informar a terceros que una página nuestra, o incluso un dominio entero ha sido movido a otro sitio.

Un ejemplo claro podría ser que teníamos el dominio www.newagedesign.com y ahora lo hemos movido a www.newagedesign.es. Lo ideal es avisar a todo el mundo que la dirección de nuestra web ha cambiado, pero esto a veces no es posible o puede llevar mucho tiempo. En estos casos lo ideal es redireccionar al visitante pero  indicándole que le redirigimos porque la web ha cambiado de lugar. Esto se consigue devolviéndole un error 301.

Todo esto comentado sobre un dominio también es aplicable a una página concreta.

En el caso de .NET esto se haría insertando el siguiente código en la página que queremos redirigir:

Response.Status = "301 Moved Permanently";
Response.AddHeader("Location","http://www.newagedesign.es/");
Response.End();

Codificar un string a hexadecimal en JavaScript

En cierto momento necesité codificar una cadena de texto en su representación en hexadecimal con la finalidad de realizar una tareas de codificación. La función JavaScript que hace esto es la siguiente:

function encodeToHex(str) {
    var result = "";
    for (var i = 0; i < str.length; i++) {
        result += str.charCodeAt(i).toString(16);
    }
    return result;
}

Comprobar si un array contiene un elemento en JavaScript

JavaScript por desgracia no tiene implementados todos los métodos que podemos tener disponibles desde C# o VB.NET. Uno de ellos es el método “Contains” de las listas. Con este código podemos extender la clase “Array” de JavaScript implementando este método:

Array.prototype.contains = function(element) {
    for (var i = 0; i < this.length; i++) {
        if (this[i] == element) {
            return true;
        }
    }
    return false;
}

Calcular el ancho de un texto y acortarlo a un número de pixeles dado en JavaScript

En algún caso podríamos necesitar calcular desde JavaScript cuanto nos va a ocupar un texto en la pantalla.
Para ello haremos uso de una capa que nos hará las veces de regla. Esta capa deberá tener los mismos estilos que el destino del texto que queremos medir, o asignarle estos estilos cada vez que vayamos a medir.

El código HTML de la capa es este:

<span id="ruler"></span>

Para que no se vea esta capa le asignaremos el siguiente CSS:

#ruler {
	visibility: hidden;
	white-space: nowrap;
	position: absolute;
	top: -100;
	left: 0px;
}

Y como último paso extenderemos la clase string de JavaScript con dos métodos que nos permitirán calcular el ancho de un texto en pixeles y recortar un texto a un ancho determinado.

// Calcula los pixeles de ancho que ocupa un texto
String.prototype.visualLength = function() {
    var ruler = document.getElementById("ruler");
    ruler.innerHTML = this;
    return ruler.offsetWidth;
}

// Recorta un texto al número de pixeles indicados, añadiendo un "..." en el caso de haber sido recortado
String.prototype.trimToPx = function(length)
{
    var tmp = this;
    var trimmed = this;
    if (tmp.visualLength() > length)
    {
        trimmed += "...";
        while (trimmed.visualLength() > length)
        {
            tmp = tmp.substring(0, tmp.length-1);
            trimmed = tmp + "...";
        }
    }

    return trimmed;
}