Nueva versión del GoogleMaps.subgurim.NET

Tras un verano de descanso, el Control de GoogleMaps para ASP.NET ha sacado una nueva versión.

Se trata de la mayor evolución desde que se inició el proyecto, resolviendo pequeños bugs, aplicando interesantes cambios, adaptándose a las nuevas versiones de la API oficial de GoogleMaps, añadiendo nuevos controles extra y mejorando y ampliando el número de ejemplos.

Ya sabes que si eres ASP.NETero y quieres un mapa de Google para tu Web, no tienes más que utilizar el GoogleMaps.Subgurim.NET y sin más que arrastrar con el ratón dispondrás del control para tu Web!!

Visita la web oficial: http://googlemaps.subgurim.net



El Breakpoint

Recuerdo que hace varios años acudí a una conferencia de emprendedores, donde todoexpertos.com se presentaba ante nosotros, pues sus creadores iban a nuestra escuela de telecomunicaciones. David Zaragoza nos decía que su último gran paso consistió en cambiarse a ASP.NET (en su versión 1.1) por sus innumerables ventajas... era en 2003, poco tiempo después de la puesta en marcha de ASP.NET 1.1.

Más tarde y en privado le pregunté, en mi completa ignorancia, qué era lo que más destacaba de ASP.NET. Ante una pregunta tan terriblemente genérica, me dijo que el uso del BreakPoint le había ahorrado más horas de depuración de código que tiempo le había costado aprender C# para ASP.NET.

Y no, la afirmación no es en absoluto exagerada. Con cualquier programa de la familia del Visual Studio podemos usar los BreakPoint, que no son más que puntos que podemos marcar en nuestro código de modo que la ejecución del programa se pare ahí... si ya lo sé, eso se viene haciendo desde los años 90 con los programas de escritorio, pero nunca se había podido hacer con un programa Web.

De este modo, en cualquier parte del ciclo de vida de nuestra aplicación Web podemos colocar un BreakPoint y depurar nuestro código al máximo. Es extremadamente útil cuando tenemos un pequeño error, pero también nos puede servir para otras cosas como el hacerse una idea de la eficiencia temporal de nuestros algoritmos o para vigilar detalles que pueden pasar desapercibidos incluso cuando no hay un error.

Usando el Visual Web Developer (es muy similar para otras versiones del Visual Studio), activar un BreakPoint es terriblemente sencillo, no hay más que hacer click sobre la parte izquierda de la línea donde lo queremos ubicar. Y para ponerlos en marcha no hay más que hacer un debugging (tecla F5).

NOTA: es imprescindible que en vuestro web.config tengáis definido <compilation debug="true" />

Una vez comenzado el debugging, utilizaremos los controles siguientes:

Upload/breakpoint4.jpg

Que de izquierda a derecha los describimos como:
1.- El botón de play reanudará la ejecución cuando ésta haya sido parada por un breakpoint.
2.- Se hará un pause estemos donde estemos.
3.- Pararemos el debugging y la aplicación acabará de ejecutarse ignorando el resto de breakpoints.
4.- Reiniciaremos el debugging desde el principio.
5.- Seguiremos la ejecución hasta el próximo estamento.

Una vez parados en un breakpoint tenemos varias opciones de seguir ejecutando el código y depurarlo:
6.- "Step Into". Iremos a la siguiente línea de código entrando en niveles inferiores. Por ejemplo, si la aplicación está parada sobre la llamada a una función, entraríamos dentro de esa función.
7.- "Step Over". Iremos a la siguiente línea de código, siempre en el mismo nivel. Siguiendo el ejemplo anterior, no se entraría dentro de la función, sino que se seguiría a la siguiente línea del lugar en que estemos.
8.- "Step Out". Viajaremos al nivel superior en que nos encontremos. Por ejemplo, si estamos dentro de la función A, saldremos a la otra función B que en su momento había llamada a la función A.

NOTA: Los botones 6, 7 y 8 resultan especialmente difíciles de explicar, por lo que recomiendo que juguéis mucho con ellos y le saquéis todo el jugo posible.

En nuestro ejemplo vamos a poner dos, uno en el evento "Load" de la página y otro en el evento "Click" de un botón:

Upload/breakpoint1.jpg

Nada más cargar la página, la ejecución se parará sobre nuestro primer BreakPoint, que es la línea en que se le asigna el valor de la variable frase a la propiedad Text de nuestro Label:

Upload/breakpoint2.jpg

Si posamos el ratón sobre la variable frase, veremos una pequeña ventanita donde observaremos el valor de dicha variable. En este punto, si posaramos el ratón sobre la propiedad Text de nuestro Label, observaríamos que el campo está vacío, pues la ejecución se para antes de ocurrir la asignación.

Cuando hacemos click en el botón de nuestra página se ejecutará nuestro algoritmo, que consiste en contar los múltiplos de 7 que hay entre 1 y 20. La impresión de pantalla corresponde con el segundo paso por el breakpoint:

Upload/breakpoint3.jpg


Como vemos, si tenemos activa nuestra ventana "Locals" dispondremos de completa información de todas las variables que están en juego en el momento el código llega a nuestro breakpoint. Como podemos observar, i  = 14, y contador = 1 (correspondiente al momento en que i valía 7). Cuando sigamos con la ejecución del programa contador se autoicrementará y finalmente nuestra label mostrará su valor final (2).

Este no ha sido más que un sencillísimo ejemplo del que se pueden extraer pocas conclusiones... incluso así, a la hora de ejecutar el ejemplo, me he dado cuenta de que al hacer click sobre el botón se volvía a ejecutar el primer BreakPoint... deberíamos haber usado el Page.IsPostBack!

La utilidad del BreakPoint se incrementa exponencialmente cuando estamos trabajando con XML, con llamadas a BBDD, pues podemos seguir paso a paso la ejecución de los algoritmos, el valor detallado de nuestras variables, etc.




¿Cómo ganar dinero con ASP.NET?

Importante pregunta que casi todos los webmasters nos hemos hecho
De modo que con la (poca) experiencia que pueda yo aportar, contestaré a modo de FAQ.

¿Cuál es la mejor manera de aprender ASP.NET?

Dedicándose por completo a la tecnología.

¿Cómo me puedo dedicar por completo a ASP.NET?

Ganar dinero trabajando en ello, bien siendo programador en una empresa o bien trabajando para mí.

¿Cómo puedo trabajar para mí con ASP.NET?
Cualquiera puede trabajar para sí mismo programando Webs, y si lo hace con ASP.NET se asegura que cualquier Web la hará más rápido y mejor que con cualquier otro lenguaje.

Lo difícil es saber cómo ganar dinero con sus Webs. Hoy por hoy, el mejor método es el Adsense de Google.
Con Adsense de Google, primero y principal te aseguras que detrás está un gran empresa (¡Y tan grande!), por lo que su solvencia está 100% garantizada.

Lo segundo es que con Adsense puedes tener publicidad en tus Webs, pero cualquier anuncio que te salga estará completamente relacionado con la temática de tu Web. De modo que no se puede decir que estés molestando al usuario con tu publicidad, sino que estás ofreciéndole el motor de google para encontrar información relacionado con la temática en la que está interesado.

Vale, pero, ¿cuál es el truco?, ¿puedo vivir fácilmente de esto?

No creas a nadie que te diga que puedes vivir fácilmente de algo, pues primero a ti no te lo diría y segundo, todo el mundo estaría trabajando en eso.

Vivir de hacer Webs y ganar dinero con su publicidad es una carrera de fondo, con muchas dificultades y con mucho esfuerzo. Pero no es imposible, y el único truco es ofrecer una Web buena, con mucho contenido y que fidelice a usuarios.

Sin embargo, no es demasiado difícil conseguir lo suficiente como para pagarse el hosting de la Web o incluso un servidor privado si la cosa va bien. Simplemente hay que ser bueno y saber esforzarse.

OK, ¿cómo puedo darme de alta en Adsense de Google?
Darte de alta puedes hacerlo desde aquí:



Ánimo con tu Web y mucha suerte!



CommandName y CommandArgument

El CommandName y el CommandArgument son dos de las propiedades más útiles pero menos utilizadas de ASP.NET. La razón de ser tan poco utilizadas es que una vez adquirido el conocimiento mínimo sobre manejo de botones y similares, las funcionalidades del CommandName y del CommandArgument pueden emularse con complicadas, pero funcionales, argucias.

Sin embargo, el uso del CommandName y de CommandArgument es increíblemente sencillo, y sus aplicaciones son muy poderosas.

En este artículo vamos a poner siempre como ejemplo al Button, aunque es exactamente igual para otros controles como el LinkButton, pero básicamente, con el CommandName y el CommandArgument lo que podemos hacer es asignar el mismo evento onclick a varios botones y realizar una acción diferente según el CommandName y el CommandArgument de la fuente responsable de ese click.

Sí, ya sé, un ejemplo vale más que mil palabras, así que:

CommandName_CommandArgument.aspx
            <asp:Button ID="Button1" runat="server" Text="Botón 1" OnClick="myButton_Click" CommandName="NumeroDeBoton" CommandArgument="1" />
        <br />
        <asp:Button ID="Button2" runat="server" Text="Botón 2" OnClick="myButton_Click" CommandName="NumeroDeBoton" CommandArgument="2" />
        <br />
        <asp:Button ID="Button3" runat="server" Text="Botón resumen" OnClick="myButton_Click" CommandName="Resumen" />
        <br />
        <br />
        <asp:Label ID="Label1" runat="server" Text="Label"></asp:Label>



CommandName_CommandArgument.aspx.cs
    protected void myButton_Click(object sender, EventArgs e)
    {
        Button boton = (Button)sender;

        switch (boton.CommandName)
        {
            case "NumeroDeBoton":
                Label1.Text = "Has presionado el botón número " + boton.CommandArgument;
                break;
            case "Resumen":
                Label1.Text = "Has presionado sobre el botón de resumen";
                break;
        }
    }


Como veis, tenemos 3 botones con el mismo evento onclick: myButton_Click.
La diferencia entre los tres botones es que dos de ellos tienen el mismo CommandName (NumeroDeBoton) y diferentes CommandArgument, mientras que el otro tiene directamente otro CommandName (Resumen).

De modo que en nuestro CodeBehind, realizamos acciones diferentes según las variables del botón desde el que viene el clic.

Lo primero que hacemos es recoger el botón mediante:

    Button boton = (Button)sender;

Y mediante el switch hacemos distinción del CommandName. Y dentro de cada caso, usamos el CommandArgument (en caso de ser necesario) para sacar por pantalla un mensaje personalizado.

El ejemplo es muy sencillo, pero las aplicaciones posibles son enormes y sólo vosotros y vuestros trabajos decidirán cuando se puede aplicar eficientemente el CommandName y el CommandArgument.



XmlTextWriter en un StringBuilder

En nuestro artículo sobre el XmlTextWriter, hablamos de cómo fabricar un fichero XML para finalmente guardar éste en un fichero.

Sin embargo, puede darse la ocasión en que no queramos que el XML resultante se guarde en un fichero, sino que puede que queramos guardarlo como un String... y obviamente, para trabajar con Strings lo mejor es el StringBuilder.

Pues entonces estamos de suerte, porque hacer lo que queremos es realmente sencillo. Primero tenemos que importar los namespaces System.XML, System.Text y System.IO, y luego usar un código como:

            StringBuilder sb = new StringBuilder();
            StringWriter sw = new StringWriter(sb);
            using (XmlTextWriter writer = new XmlTextWriter(sw))
            {
                // Escribimos el fichero XML aquí. Podéis aprender a escribir ficheros XML desde el artículo XmlTextWriter.
            }

            return sb.ToString();


Como veis, no hay más que inicializar un StringWriter con un StringBuilder, y posteriormente inicializar un XmlTextWriter con un StringWriter. El resultado final quedará guardado en el StringBuilder.



Validation en ASP.NET 2.0: Avisar con un alert

Como ya conocéis por el artículo Validation en ASP.NET 2.0, en ASP.NET hay varios controles Web que nos ayudan a controlar que el tipo de información que se ha rellenado en un formulario es el adecuado.

Por ejemplo, los Validadores de ASP.NET nos permiten controlar que un campo no está vacío, que está dentro de cierto rango, que responde a la estructura de un eMail, que no excede de N caracteres... y prácticamente cualquier cosa.

Pero, ¿cómo nos avisa ASP.NET de que los datos de un formulario no son los correctos?, con simple y llano texto: nada más... ¿y si lo que queremos es avisar con un alert javascript?

Pues para ello, tenemos dos opciones:
1.- Olvidarnos de los validadores ASP.NET y hacerlo todo con javascript. Es el método "artesanal", pero funciona igualmente. Os recomiendo este enlace si sois tan valientes como para hacerlo de este modo.
2.- Utilizando un pequeño truquito, que explicamos en varios pasos:

Paso 1
Veamos el código de nuestro página .aspx:

    <asp:Button ID="Button1" runat="server" Text="Button" OnClick="Button1_Click" ValidationGroup="a" />
    <asp:TextBox ID="TextBox1" runat="server" ValidationGroup="a"></asp:TextBox>
    <asp:RequiredFieldValidator ID="RequiredFieldValidator1" runat="server" ControlToValidate="TextBox1"
        ErrorMessage="*" ValidationGroup="a" Display="Dynamic" EnableClientScript="False"> </asp:RequiredFieldValidator>


Tenemos tres elementos: un botón, un Textbox y un RequiredFieldValidator, por lo que nuestra intención es controlar que el TextBox no pueda estar vacío cuando hagamos clic sobre el botón.
Lo primero que debemos ver es que los tres elementos tienen el mismo ValidationGroup, lo cual es una buena práctica aunque sólo tengamos un formulario.
Lo segundo que debemos ver es que el RequiredFieldValidator tiene el atributo EnableClientScript puesto a false. Con ello conseguimos que se compruebe si el TextBox está vacío desde el servidor y no con javascript... luego veremos el porqué.

Paso 2
Nuestro tag body debe tener este aspecto:

    <body runat="server" id="myBody" enableviewstate="false">

De este modo podremos manejar los elementos del body desde código. El hecho de enableviewstate="false" lo veremos más tarde.

Paso 3
Veamos nuestro código .aspx.cs

    protected void Button1_Click(object sender, EventArgs e)
    {
        Page.Validate("a");

        if (!Page.IsValid)
        {
            mybody.Attributes.Add("onload", "alert('Rellena el campo de Texto')");
        }
    }


Como es práctica habitual, lo primero que debemos hacer el Page.Validate("a"), para validar nuestro validation Group. Si la página no está correctamente validada (en nuestro caso, el TextBox está vacío) lo que hacemos es añadir el atributo onload con el valor "alert('Mensaje')", de modo que cuando se vuelva a recargar la página se muestre el alert avisando del error.
De ahí el hecho de que el body tenga enableviewstate="false", puesto que la próxima vez que recarguemos la página no nos interesa que vuelva a salir el alert de nuevo.

Espero que os haya gustado el truquito




Recoger el código ASCII con ASP.NET / C#

Recoger el código ASCII de cualquier caracter es muy sencillo con C# y ASP.NET.

Por ejemplo, queremos saber que la 'z' es el 122 o que el '=' es el caracter ASCII 61... pero no sólo eso, queremos saber el código ASCII de todos los caracteres de un string completo... pues lo dicho, con ASP.NET es tremendamente sencillo, ahí van dos modos de hacerlo:

1.- Le pasamos una frase entera, y nos devolverá el resultado de los caracteres ASCII en un array de Byte

    string frase = "Ejemplo de frase ";
    Byte[] codigos = System.Text.ASCIIEncoding.ASCII.GetBytes(frase);


Cada posición del array de Byte se corresponderá con la posición de los caracteres de frase

2.- Le pasamos un sólo caracter y nos devolverá el código de ese único caracter

    Byte codigo = System.Text.ASCIIEncoding.ASCII.GetBytes("a")[0];

Sí, ya sé que el segundo paso no es más que una particularización trivial del primero... pero sigue siendo útil, ¿no?




GUID: identificador global único

Cuantas veces os ha hecho falta un identificador único... pero único de verdad...

Hay ocasiones en las que es muy necesario saber que tienes algo (por ejemplo un string) que es diferente a cualquier otra cosa, para de ese modo identificar un elemento de forma única...

Pues bien, ASP.NET nos lo pone trivialmente fácil, ya que el siguiente código consigue nuestro identificador (teóricamente) único:

    string identificadorUnico = Guid.NewGuid().ToString();

Que nos devolverá algo del estilo de: 2a7d1952-9d66-43e2-8df2-b00a40d2a096