Contador en ASP .NET con archivo XML en VB (1)

Sencillo contador de visitas que utiliza un archivo XML como origen de datos y un DataSet como almacén desconectado para leer y guardar el valor que se incrementa en 1 cada vez que se recarga la página; el número de visitas se muestra formateado con separador de miles mediante el método Strings.FormatNumber

En este ejercicio se muestra cómo crear un contador de visitas muy sencillo en una aplicación ASP .NET. Se utilizan 3 archivos:

  • contador.xml: es un archivo XML muy simple que actúa como almacén del dato que es el número de veces que se recarga la página
  • contadorxml.aspx: página dinámica con 2 etiquetas con diseño personalizado para mostrar el número de visitas y los errores que pueden suceder
  • contadorxml.aspx.vb: página de código VB con la lógica que lee el dato, lo incrementa en 1 y lo guarda con el nuevo valor.

Archivo XML

Tanto la estructura como el contenido son muy sencillos, un nodo raíz contador que integra un nodo cuenta con un nodo num con la cuenta de las visitas, estos 3 nodos son lo que en el DOM de XML se llaman nodos de elemento y la cuenta de las visitas está en lo que se llama un nodo de texto. Este archivo no tiene atributos.

<?xml version="1.0" standalone="yes"?>
<contador>
  <cuenta>
    <num>19524691</num>
  </cuenta>
</contador>

Cuando el DataSet recibe el archivo XML interpreta que el nombre de la tabla es cuenta y el nombre de la columna es num y con esos datos es posible acceder al valor con este código:

DataSet.Tables(0).ToString 'devuelve cuenta'
DataSet.Tables(0).Columns(0).ToString 'devuelve num'
DataSet.Tables(0).Rows(0)("num") 'devuelve 19524712'

Archivo ASPX

También es un archivo de pocas líneas que se limita a generar el fondo de la página de color negro y el color blanco de los números con una determina fuente (Verdana 10 negrita):

<body bgcolor="black">
   <form id="Form1" method="post" runat="server">
      <div align="center">
         <asp:label id="Etiqueta1" runat="server" backcolor="Black" font-name="Verdana" font-size="18" font-bold="True" forecolor="White"></asp:label>
         <asp:label id="Etiqueta2" runat="server" backcolor="Black" font-name="Verdana" font-size="10" forecolor="White"></asp:label>
      </div>
   </form>
</body>

Archivo ASPX.VB

Cuando se usa la aplicación ASP. NET con los archivos .aspx y .aspx.vb en el servidor no hay que declarar aquí las 2 etiquetas que ya están declaradas en el archivo aspx porque da error al compilar, esta conducta es diferente si se utiliza Visual Studio en cuyo caso sí se declararían las etiquetas en los 2 archivos:

'Protected WithEvents Etiqueta1 As System.Web.UI.WebControls.Label'
'Protected WithEvents Etiqueta2 As System.Web.UI.WebControls.Label'

Al cargar la página, por un lado se muestra en la etiqueta el valor actual del nodo num del archivo XML por medio del DataSet y por otro lado se llama al método que incrementa en 1 ese valor y empleando el DataSet lo guarda en el archivo XML:

Protected Sub Page_Load(sender As Object, e As EventArgs)
	Me.Cuenta()
	'el DataSet lee desde el archivo XML el nodo num'
	Datos.ReadXml(Server.MapPath("contador.xml"))
	'se muestra el valor en la etiqueta sin separador de miles'
	'Etiqueta1.Text = Datos.Tables(0).Rows(0)("num").ToString()'
	'se muestra el valor en la etiqueta con separador de miles'
	iCuenta = Datos.Tables(0).Rows(0)("num")
	Etiqueta1.Text =  FormatNumber(iCuenta,0,,,TriState.True)
End Sub

Private Sub Cuenta()
	'el DataSet lee desde el archivo XML el nodo num'
	Datos.ReadXml(Server.MapPath("contador.xml"))
	'el valor actual del nodo se pasa a la variable n como entero'
	Dim n As Integer = Int32.Parse(Datos.Tables(0).Rows(0)("num").ToString())
	'se añade 1 al entero'
	n += 1
	'ese nuevo valor es el que se pasa al DataSet'
	Datos.Tables(0).Rows(0)("num") = n.ToString()
	'y el DataSet lo escribe en el archivo XML donde queda almacenado'
	Datos.WriteXml(Server.MapPath("contador.xml"))
End Sub

Número con separador de miles

Para que la cadena numérica aparezca más fácil de leer se puede usar el método

Strings.FormatNumber(Object, Int32, TriState, TriState, TriState)

del espacio de nombres Microsoft.VisualBasic. Se construye con FormatNumber seguido de un paréntesis en el que, separados por comas, aparecen por este orden:

  • expresión Object que se va a formatear, obligatoria
  • NumDigitsAfterDecimal Int que es el nº de posiciones decimales, opcional
  • IncludeLeadingDigit TriState constante que indica si se muestra cero inicial para valores fraccionarios, opcional
  • UseParensForNegativeNumbers TriState constante que indica si los valores negativos van entre paréntesis, opcional
  • GroupDigits TriState constante que indica si los números se agrupan o no mediante el delimitador de grupo, opcional.
Etiqueta1.Text =  FormatNumber(iCuenta,0,,,TriState.True)

Ejecutar la aplicación

Para probar la aplicación en modo local en nuestro propio ordenador hay que incluir los 3 archivos en una carpeta que se puede llamar contadorxml, colocar esa carpeta en la carpeta del servidor web, no es necesario convertirla en aplicación web si usas IIS, y dirigir el navegador a

http://localhost/contadorxml/contadorxml.aspx

Puedes descargar los 3 archivos completos desde aquí.