Alejandro B. Martin - Blog de Asp.Net y MsSQL

Junio 8, 2008

ToGaDi English

Available the new games torrent searcher.
Like google, but dedicated exclusively for bit-torrent games files, this new browser index thousands of new games every day.

Games for PC (windows), also for Mac (Maccintosh), Linux, and all the VideConsoles (latest and retros): PS3, PS2, PSX, PSP, DS, Wii, Xbox-360, Xbox, Dreamcast, Saturn, MAME, and so on

Currently is available in English and Spanish languages:

Torrent Games at at www.togadi.com
giochi bit-torrent www.togadi.it
Juegos torrent en togadi.es

Abril 25, 2008

Propiedades dinámicas

Con el presente explico -para aquellos a los que les pueda ser útil-, cómo consultar y asignar valores de forma dinámica a las propiedades de cualquier objeto o control de servidor. Requiere el Framework .Net 2.0+ (o superior)

A mi me costó bastante encotrar información, y me ha resultado de mucha utilidad para el gran proyecto -fase 1/3 para 2/3- que llevo desarrollando desde el 2007 [Fase1: GoldByWebs]

Primero mostraré el contexto con algún ejemplo y luego descubro el código mínimo-necesario para tal fin (para no enrollarse y para que descubras lo básico; así luego cada cual con lo suyo ..).

Supongamos que tenemos un GridView -o cualquier otro control e incluso un objeto(object)-, para el que los valores que queremos asignar a sus propiedades no los sabemos en tiempo de diseño; bien los recojemos de una base de datos, o bien de un array, o de donde sea pero sin saber de antemano; ni los valores que vamos a darlas, ni las mismas propiedades a las que asignar dichos valores, ..
-

EJEMPLO PRACTICO:
Tenemos un aplicativo en el que queremos que cada usuario pueda personalizar determinadas propiedades de un control GridView; al que llamaremos UserGridView.

Dynamic properties - Propiedades dinámicas con .Net

Los usuarios acceden a un formulario donde se les pide que definan que valores quieren personalizar para determinadas propiedades de un GridView:

El usuario Pepito a definido que quiere personalizar dicho gridview con los siguientes valores:
Caption = “Pepito quiere así su gridview”, Width = “400px” y Backcolor = “Yelow”

Fulanita por ello define:
Caption = “GridView de Fulanita”, Width = “550px” , Backcolor = “Pink” y BorderStyle=”Dashed”.

Dichos datos son guardados -están almacenados pues- en la base de datos.


COMO PODEMOS HACER PARA QUE A LOS USUARIOS SE LES MUESTRE EL GRID COMO ELLOS QUERIAN. COMO PODEMOS ASIGNAR PROPIEDADES DE FORMA DINAMICA EN .NET

::TENIENDO Y TOMANDO COMO BASE::

-Que determinada consulta a la base de datos para determinado usuario a devuelto un List(of ListItem) con el par “NombreDePropiedad/ValorQueDefinióElUsuario” (.text/.value) [aunque también podría tratarse de un datatable, etc ..]

Lo que muchos hacen, -sólo si saben las propiedades que pueden definir los usuarios, o bien si implementan condicionales tipo If Not IsNothing- es programar algo así como:
-EJEMPLO NO DINÁMICO-

‘[Consulta a la DBA para rellenar este List con el Par NombrePropiedad/Valor (.text/.value)]
Dim ObjPropertiesListOfListItem As New List(Of ListItem)


‘ Según el gráfico, en este caso No Dinámico, sabemos que 0=Caption

UserGridView.Caption = ObjPropertiesListOfListItem(0).Value

UserGridView.Width = ObjPropertiesListOfListItem(1).Value

‘ ..

-
-EJEMPLO DINAMICO- IMPLEMENTANDO PROPIEDADES DINAMICAS EN .NET - REFLECTION

        ‘.. [Consulta a la DBA para rellenar este List con el Par NombrePropiedad/Valor (.text/.value)]
        Dim ObjPropertiesListOfListItem As New List(Of ListItem)
yyy
        ‘Creamos un ArrayList que se rellena con las propiedades que descubre la Function arrPropiedadesDeObjeto para el GridView
        Dim arrDePropiedadesDeMiUserGridView As ArrayList = arrPropiedadesDeObjeto(UserGridView)
        ‘Para tantas propiedades customizadas cómo se recojiesen de la dba (almacenadas en: ObjPropertiesListOfListItem)
        For x = 0 To ObjPropertiesListOfListItem.Count - 1
            ‘Comprobamos si el objeto (UserGridView) admite -tiene- x determinada propiedad; buscando si esta en el array
            If arrDePropiedadesDeMiUserGridView.Contains(ObjPropertiesListOfListItem(x).Text) Then
                ‘Si fuere el caso, llamamos a SetProperty para customizar el objeto con el valor de propiedad
                SetProperty(UserGridView, ObjPropertiesListOfListItem(x).Text, ObjPropertiesListOfListItem(x).Value)
            End If
        Next

Ahora el Function y el Sub, tan esperados !!

    ”’ <summary>Devuelve un array que contiene las propiedades de determinado objeto.</summary>
    ”’ <param name=”objeto”>Cualquier objeto; aunque normalmente suelen ser Controles de Servidor</param>
    Public Function arrPropiedadesDeObjeto(ByVal objeto As Object) As ArrayList
        Dim PropertyInfo As System.Reflection.PropertyInfo() = objeto.GetType.GetProperties() ‘Me.GetType.GetProperties()
        Dim PropertyItem As System.Reflection.PropertyInfo
        Dim _arrAvolver As New ArrayList
        For Each PropertyItem In PropertyInfo : _arrAvolver.Add(PropertyItem.Name) : Next
        Return _arrAvolver
    End Function
    ”’ <summary>Adjudica un valor a una propiedad de un determinado objeto</summary>
    ”’ <param name=”Objeto”>El objeto al que -por reflection- pasar el PropertyValue</param>
    ”’ <param name=”PropertyName”>El nombre de la propiedad</param>
    ”’ <param name=”PropertyValue”>El valor que se la quiere adjudicar</param>
    Public Sub SetProperty(ByVal Objeto As Object, ByVal PropertyName As String, ByVal PropertyValue As String)
        Dim userType As Type = Me.GetType()
        Dim UserProp As System.Reflection.PropertyInfo = userType.GetProperty(PropertyName)
        UserProp.SetValue(Objeto, PropertyValue, Nothing)
    End Sub

Las ventajas que ofrece el uso del dinamismo, són enormes en lo que refiere a escalabilidad, aunque hay que anotar que el uso de “Reflection” siempre conlleva una demora de tiempo, es decir, que las páginas o forms tardarán algo más en cargarse, pero no mucho ..

Copyright 25 Abril 2008 © Alejandro Barrada Martin - Reservados todos los derechos salvo consentimiento del autor.
El autor cede los derechos de publicación del presente artículo siempre y cuando se mencione al mismo y a esta url-dirección web.

Marzo 23, 2008

VS2008 RTM - Could not load file or assembly System.Data.DataSetExtensions, Version=2.0.0.0

Realizo este post para dar solución a todos aquellos programadores .Net que tengan el problema citado en el titular -del presente - a la hora de usar Visual Studio 2008 RTM (vs2008 Final Release).

Desde finales del 2007 que ando involucrado en el desarrollo de varios proyectos usando VS2008 Beta2, la cuál caducaba el pasado 17 de Marzo (2008). Al igual que otros muchos, hemos tenido que actualizarnos con la nueva -y por el momento única disponible- versión Final Release (la que sale antes de la oficial) de Visual Studio 2008 “Visual Studio 2008 RTM”.

Al cargar proyectos desarrollados con VS2008 Beta o Beta 2 que utilizen el Framework 3 o el 3.5, nos encontramos el siguiente mensaje de error:

Description: An error occurred during the processing of a configuration file required to service this request. Please review the specific error details below and modify your configuration file appropriately.

Parser Error Message: Could not load file or assembly ‘System.Data.DataSetExtensions, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089′ or one of its dependencies. El sistema no puede hallar el archivo especificado.

Visual Studio 2008 Configuration Error
En la constante-cambiante plataforma .Net, era previsible que pudiera suceder; al igual que ya sucedió recientemente con el SP2 windows server

No te preocupes, no le ha pasado nada a tu proyecto ni a tus archivos, todo te va a seguir funcionando igual que antes, simplemente tendrás que cambiar un trocito de texto de tu archivo Web.Config.

Como ves en la imagen de arriba, el texto que aparece señalado (azul) es el que deberás cambiar:

  • Mal: Version=2.0.0.0
  • Bien: Version =3.5.0.0

Tras efectuar el simple cambio, compila de nuevo el proyecto y vualá! ya puedes seguir con tu preciado work !

Explicación lógica del “defecto”


La razón es que algunos de los assemblies pre-release Fx 3.5 aún no tenían su versión puesta a 3.5 en la Beta2, por ello que la RTM da errores (al si tenerlos actualizados a 3.5) .Realizad el simple cambio arriba indicado y “en principio” todo os debería correr.

NOTA IMPORTANTE: Se están descubriendo otros fallos tales como la imposible alineación de texto (indent) , la tremenda lentitud que se sufre al editar algunas webs u archivos de mucho código, y otros cuantos bastantes etcéteras, recomiendo bajar el Hot Fix que ha publicado Microsoft (que desastre, .. no si encima !) LINK: https://connect.microsoft.com/VisualStudio/Downloads/DownloadDetails.aspx?DownloadID=10826

Ya como los de google, con sus eternas versiones Beta para que luego no les achaquen (gmail, etc ..) Patraña de poffesionales. JJ!

Copyright 27 Febrero 2008 © Alejandro Barrada Martin - Reservados todos los derechos salvo consentimiento del autor.
El autor cede los derechos de publicación del presente artículo siempre y cuando se mencione al mismo y a esta url-dirección web.

Febrero 27, 2008

Formatear cadenas de Texto/String como númericas con o sin decimales - Regex - Expresiones Regulares

En este post voy a explicar cómo convertir cualquier cadena de texto que contenga letras y números de cualquier índole y posibilidad, a formato numérico utilizando para ello las expresiones regulares (regex : regular expressions). Es decir, recoger números, números con decimales, con o sin puntos y/o comas de separación, así como cualquiera de las anteriores.

Escribo este post, pues me ha resultado bastante complicado dar con la solución (dar con la cadena regex) adecuada para convertir cadenas de texto (strings) a números con o sin decimales, con o sin delimitadores (millares, etc ..).


Hmnn no hace falta que te leas todo este tocho. en este post te abrevio y te doy posiblemente la solución regex que buscasBREVE INTRO - REGEX EN .NET - RECOGER CADENA CON SÓLO SUS NUMEROS

No te asustes por el libro !, en este post encontrarás la solución para recoger de cadenas string, números con todo tipo de formato.

Primero una breve intro. sobre cómo usar las regular expressions en .Net (para más información sobre dicho mundo, al final de página referencio algunos links interesantes para aprender).

Para poder usar expresiones reguares a la hora de recojer, buscar o sustituir cadenas string, .Net nos provee del objeto regex. Dicho objeto viene cargado por defecto salvo que estés utilizando un proyecto de librería de clases en cuyo caso deberás importar su espacio de nombre:

Imports System.Text.RegularExpressions

Bien pues, ahora explico cómo utilizar dicho objeto para nuestro cometido, que tal cual reza el titular de este post, trata de obtener cadenas numéricas.
Empezaremos con algo sencillo para acabar ir avanzando hasta acabar con algo más complejo (decimales y separadores).

APRENDIENDO A USAR EL OBJETO

regex regular expressions, expresiones regulares numéricas en .net

Tomemos como ejemplo las siguientes variables:

Dim CadenaDeTextoSinFormato_comoNumeroEntero As String = “Importe : 150 Euros”

Dim ResultadoQueQueremosObtener_comoNumeroEntero As String

  • Para encontrar (seleccionar) una cadena que cumpla con determinado criterio usamos:

Dim CriterioDeExpresionRegularQueDebemosAplicar As String

ResultadoQueQueremosObtener_comoNumeroEntero = Regex.Match(CadenaDeTextoSinFormato_comoNumeroEntero, CriterioDeExpresionRegularQueDebemosAplicar).Value

play.gif EJ.: RECOJER NUMEROS

Empezaremos con algo sencillo, tomando como ejemplo las variables anteriores, podemos usar cualquiera de las siguientes expresiones regulares para obtener el/los números de la cadena de texto “importe : 150 Euros”. Podemos usar:

  • [d]+
    • Donde + indica que obtendrá todos los caracteres que sigan. Puede ser [d](2) si sólo queremos coger 2 caracteres (numéricos)
  • [0-9]+
    • Donde 0-9 indica que los caracteres deben estar entre el 0 y el 9

Que bien, dirás, ..
Pues si pero no, jj,

RECOGER TODO TIPO DE NUMÉRICOS - DESDE SIMPLES A COMPLEJOS

Si tubiésemos diferentes números, en diferente formato, con o sin Decimales, etc., en fín algo más complicado ..

Supongamos que (como el aquí presente), estás recogiendo datos de los que su formato sea variable(dinámico) .

numeros de todo tipo ¿?

Imagina que estas desarrollando una aplicación que debe guardar datos con formato numérico (integer, decimal, money o lo que sea).
Pero que tu aplicativo sólo recibe cadenas de texto, las que además de poder contener números - lo que tu app. debe recoger (importes (precios u otras)) - dichas cadenas pueden contener:

  • Cadenas de texto con un integer (entero numérico)
    • “Importe : 150 euros” o bien “€150″ <— este último caso esta en formato inglés (el símbolo de la moneda va antes que su cantidad)
  • Números con decimal o decimales
    • “Kilogramos : 1.55 “, “150 euros”, ..
  • Números con separadores
    • “1,400,000 euros”, “150.30 Kb”, ..
  • Números con decimales y con separadores
  • “1.999,99 euros”, ..
  • Con formato a la inglesa (el punto por la coma y viceversa)
  • “1,999.54 euros”, “150 euros”, ..

Como veis, són muchos los casos que nos podemos encontrar, más aún si se trata de formatos diferentes según países (ver los 2ºs ejemplos).

En este post no voy a exponer todas las expresiones regulares que harían falta para recojer los valores anteriormente expuestos en cualquier combinación de los mismos pues el post sería larguíssimo.

Pero basta con deciros que

  • Por una parte expongo abajo varios enlaces; incluidos portales donde se pueden encontrar centenas de expresiones regex para til fin.
  • Pero y Más aún por otro, y el mejor de todos (tras búscar y buscar, probar y probar) ..
  • OS MUESTRO LA QUE POSIBLEMENTE SEA LA ÚNICA EXPRESION REGULAR QUE NECESITÉIS PARA OBTENER DATOS NUMÉRICOS, ESTÉN EN EL FORMATO QUE ESTÉN

b(?:d{1,3}(?(?=[,.])[,.](?:d{3}(?:[.,](?=d)|b)|(?:b|d{1,2}))|b))+

Vale que sea muy larga, pero con dicha regex conseguireis cualquier valor numérico que se encuentre en una cadena de caracteres, tal cuál estuviese excrito.
Así pues, con 1 misma expresión extraeremos siempre el contenido numérico esté en el formato que esté.

A los que se pregunten, ¿Porqué no puedo usar otra expresión regular más pequeña?, les respondo.
Si bien es cierto y correcto utilizar expresiones más sencillas, debo advertir, que si os cambian el formato de las cifras, vuestro regex fallará o no recogerá correctamente los datos.

play.gif RESUMEN

Si quereis capturar númericos de los que su formato y expresión pueda variar; con o sin decimales, con o sín separadores de millar y otros y, estén en el formato que estén (inglés, americano, Español, ..) entonces, así como si quereis despreocupación, utilizad dicha expresión, que repito s:

b(?:d{1,3}(?(?=[,.])[,.](?:d{3}(?:[.,](?=d)|b)|(?:b|d{1,2}))|b))+

Nota* Si en una misma cadena string existen varios números separados, es decir por ejemplo “unidades : 3 — importe x ud.: 5,5 — total: 16,5 euros” debéis separar antes (dividir) la cadena en 3 (o tantas partes como números que querais coger contenga)

_

_

_

Links relacionados

www.regular-expressions.info <– info con manuales

http://regexlib.com/DisplayPatterns.aspx?cattabindex=2&categoryid=3&p=2 <– Montón de expresiones con ejemplos de los resultados que se pueden conseguir, en concreto dicha url apunta a la página con exp. reg. para números, eso sí, la gran cadena mágica que aquí os he expuesto no creo que la encontrareis.

Espero que os sirva de ayuda y que os ahorre tiempo

Saludos

Copyright 27 Febrero 2008 © Alejandro Barrada Martin - Reservados todos los derechos salvo consentimiento del autor.
El autor cede los derechos de publicación del presente artículo siempre y cuando se mencione al mismo y a esta url-dirección web.

Enero 10, 2008

CopyAsHtml actualizado ! para VS 2008 y anteriores

Primero de todo comentar que ante la dificultad que resulta encontrar dicho Addin (add-in) para todos los que usamos Visual Studio 2008, en el presente post facilito la descarga de dicha herramienta para la versión 2008 de visual studio, para anteriores vs-2005 y 2003 ( tanto para .net .3.5 como para 2.0 y retro 1.0/1.1) así como una breve explicación sobre el mismo, y cómo instalarlo (bajo vs2008).

Bien pués, ¿ De qué trata o qué funcionalidad ofrece CopyAsHtml ?

CopyAsHtml es un addin para Visual Studio con el que podremos copiar el código de los ficheros .vb o .cs con los que trabajemos, directamente a formato Html conservando su apariéncia (color, fuente, etc ..)

De esta forma, y como herramienta ideal para editores web,.. podemos plasmar el código fuente que escribamos tal y como nosotros lo vemos, pero en formato html para que igual lo vieren los usuarios.

Como ejemplo el que ves a continuación ..

Partial Class _Default

Inherits System.Web.UI.Page

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load

‘Si pasas por aquí el cursor verás como esto no es una captura de imagen

Dim strA As String = “Fijate que conserva la fuente y colores”

Dim strB As String = “Y lo estás viendo como si fuera el propio código”

For Each elTextoQueQuieras As String In New String(“DondeQuieras”)

Response.Write(“Que bien que queda, ehh ¿?!”)

Next

End Sub

End Class

A continuación ..


Como instalar CopyAsHtml para su uso instantáneo en visual studio 2008 !.

play.gif Descomprime el archivo .rar y coloca sus archivos en la carpeta addins de Visual Studio, que no es otra que:
“Mis documentos/Visual Studio 2008/Addins”
Si en la ruta o path “Mis documentos/Visual Studio 2008/” no divisas la carpeta Addins no te preocupes (posiblemente no hayas usado otro), créala y pon allí los archivos.

play.gif Ahora en VStudio vas al menu: Tools (herramientas) / Addin manager y lo seleccionas
Menú de Acceso Addin Manager de Visual Studio 200X <– Cómo acceder a dicho menú
Addin Manager de Visual Studio 2008

play.gif Ya lo puedes utilizar, para ello selecciona el texto de código fuente que quieras copiar, click con el botón derecho del ratón y CopyAsHtml, Copy As Html

Vuolà !

CopyAsHtml

A continuación facilito links de descarga


CopyAsHtml para Visual Studio 2008
CopyAsHtml para Visual Studio 2005 Instalador - CopyAsHtml para Visual Studio 2005 Código fuente
CopyAsHtml para Visual Studio 2003 Instalador - CopyAsHtml para Visual Studio 2003 Código fuente

Autor original de la herramienta: Colin Coller Copyright: J.T. Leigh & Associates Inc.
Autor de la modificación para vs2008: Guy Burnstein con más info en su post

A colaborar y a informar, mis Queridos Muñecos !

Copyright desde el 10 de Enero de 2008 © Alejandro Barrada Martin - Reservados todos los derechos salvo consentimiento del autor.
El autor cede los derechos de publicación del presente artículo siempre y cuando se mencione al mismo y a esta url-dirección web.
Se deben citar en su defecto, las fuentes y copyrights de terceros autores y/o marcas o empresas referenciadas.

Diciembre 25, 2007

HtmlMeta - Cómo programar dinámicamente las etiquetas Meta del head

Con esta entrada, voy a explicar cómo programar dinámicamente las etiquetas meta de la cabecera de las páginas web que se quieran programar con código Asp.Net.

Dichas etiquetas son fundamentales entre otras cosas, para conseguir un buen posicionamiento en buscadores web.
En este post no voy a explicar su importancia, aquí voy a explicar cómo manipularlas bajo código asp.net (vb codebehind), ideal para todo aquel que (como yo) quiera generar url’s dinámicas (labor importante para SEOs) para alguno de sus proyectos, aunque también e importante en cualquier caso si quieres especificar sus valores desde una base de datos.
Nota: Para escribir el título de la página (title) , no hace falta recurrir a dicho objeto, pues para tal fin bastará con usar:

Page.Title = “El título de la página” ‘<– como vemos, especificar el título es bastante sencillo

El objeto que lleva a cabo todas las labores de programación lado servidor de las etiquetas Meta es el:

HtmlMeta

Para todas las etiquetas meta (description, keywords, copyright, content-language, etc ..), habrá que utilizar el citado objeto. Ante todo debo incidir que en la etiqueta <Head> de nuestro .aspx, deberemos poner (si no esta), el argumento RunAt=”Server”
Veamos en un ejemplo cómo podemos escribir de forma programática bajo asp.net la etiqueta description:

EJEMPLO 1: Escribir el título de la página y la etiqueta Description

Page.Title = “El título de la página” ‘<– como vemos, especificar el título es bastante sencillo

Dim HeaderMetaTags As New HtmlMeta ‘Instanciamos el objeto

HeaderMetaTags.Name = “Description” ‘Le atribuimos el nombre de la etiqueta que tendrá que escribir en la pág.

HeaderMetaTags.Content = “La descripción de su página web” ‘Le indicamos su valor

‘Le indicamos a la cabecera de la página (page.header), que añada dicho objeto que se encargará de escribirla

Page.Header.Controls.Add(HeaderMetaTags)

Titulo y etiqueta Description

Ahora te dirás, ¡ bien pues ya puedo empezar a escribir todas las etiquetas que considere !,
pero advertencia !, al crear (querer poner) varias etiquetas, tendrás que crear una instancia nueva del objeto HtmlMeta (y con diferente nombre) para cada etiqueta que quieras poner.

EJEMPLO 2: para escribir 2 o más etiquetas (description, keywords)

Verás pues que si utilizas el siguiente:
CODIGO INCORRECTO

Dim HeaderMetaTags As New HtmlMeta ‘Instanciamos el objeto

HeaderMetaTags.Name = “Description” ‘Le atribuimos el nombre de la etiqueta que tandrá que escribir en la pág.

HeaderMetaTags.Content = “La descripción de su página web” ‘Le indicamos su valor

‘Le indicamos a la cabecera de la página (page.header), que añada dicho objeto que se encargará de escribirla

Page.Header.Controls.Add(HeaderMetaTags)

‘|||Si utilizamos la misma instancia del HtmlMeta, .net sólo escribirá la última||| ———- PARTE DE CODIGO ERRONEO ———-

HeaderMetaTags.Name = “Keywords”

HeaderMetaTags.Content = “palabra_clave1, palabras clave2, etc ..”

Page.Header.Controls.Add(HeaderMetaTags)


RESULTADO INCORRECTO

Captura de pantalla - HtmlMeta Description y Keywords de forma incorrecta

Fíjate que en el código fuente de la pag., ¡ sólo se esta escribiendo la última etiqueta programada !, y no las 2 (description y keywords)
Como comenté, tendrás que crear una instancia nueva para cada etiqueta

CODIGO CORRECTO AUNQUE MEJORABLE (luego explico como mejorarlo)

Dim HeaderMetaTags_Descripcion As New HtmlMeta ‘Instanciamos el objeto para la etiqueta Description

HeaderMetaTags_Descripcion.Name = “Description” ‘Le atribuimos el nombre de la etiqueta

HeaderMetaTags_Descripcion.Content = “La descripción de su página web” ‘Le indicamos su valor

Page.Header.Controls.Add(HeaderMetaTags_Descripcion)

Dim HeaderMetaTags_PalabrasClave As New HtmlMeta ‘Instanciamos una 2ª nueva instancia del objeto

HeaderMetaTags_PalabrasClave.Name = “Keywords”

HeaderMetaTags_PalabrasClave.Content = “palabra_clave1, palabras clave2, etc ..”

Page.Header.Controls.Add(HeaderMetaTags_PalabrasClave)

RESULTADO CORRECTO AUNQUE MEJORABLE

Captura de pantalla - HtmlMeta Description y Keywords de forma correcta pero bastante mejorable

Como ves, utilizando el código anterior conseguimos que figuren las 2 etiquetas. ¿ Pero porque mejorable ?
Te dirás .. Que palo, o .. que mal eso de tener que escribir una instancia nueva para cada etiqueta, además ..
¿ Y si se quieren escribir tantas etiquetas como así estuvieran en una base de datos ?
Para tal fin, fuera el que fuese, si no queremos tener que escribir una nueva instancia para cada etiqueta (y así escribir menos líneas de código), hay que emplear arrays y un bucle que recorra sus items para escribir las etiquetas.

EJEMPLO 3: Escribimos 3 etiquetas meta (o tantas como se precise)

CODIGO CORRECTO CASI PERFECTO

Dim HeaderMetaTagsArray_Nombres As New ListItemCollection ‘Nuevo array para los nombres de etiquetas (tantos como de ellas queramos poner)

HeaderMetaTagsArray_Nombres.Add(“Description”)

HeaderMetaTagsArray_Nombres.Add(“Keywords”)

HeaderMetaTagsArray_Nombres.Add(“Copyright”)

Dim HeaderMetaTagsArray_Valores As New ListItemCollection ‘Nuevo array para los valores (el content de la etiqueta) (tantos como el anterior array)

HeaderMetaTagsArray_Valores.Add(“Mi descripcion es ..”)

HeaderMetaTagsArray_Valores.Add(“Palabra1, palabra2, ..”)

HeaderMetaTagsArray_Valores.Add(“Alejandro B. Martin”)

For i = 0 To HeaderMetaTagsArray_Nombres.Count - 1 ‘Recorremos un bucle desde 0 hasta el total de etiquetas que queramos poner (definidas en 1er array)

Dim HeaderMetaTags As New HtmlMeta ‘al estar dentro de un bucle, se irá creando (instanciando nuevamente) dicho objeto cada vez que pertoque

HeaderMetaTags.Name = HeaderMetaTagsArray_Nombres(i).Value

HeaderMetaTags.Content = HeaderMetaTagsArray_Valores(i).Value

Page.Header.Controls.Add(HeaderMetaTags) ‘Así pues para cada etiqueta (en HeaderMetaTagsArray_Nombres) se escribirá correctamente.

Next

RESULTADO CASI PERFECTO

Captura de pantalla - HtmlMeta Varias etiquetas de forma casi perfecta

Y ahora me preguntarás ¿Porque casi perfecto ?
Realmente ya esta bien, pero el código debería mejorarse en cualquiera de los siguientes casos:

  • Quieres aprender más | y/o
  • Te gusta hacer tus proyectos lo mejor posible | y/o/u opcional
  • Estas buscando posicionar bien tus páginas en los navegadores (SEO)

Llegado a este punto, ya lo tienes casi todo, pero si buscas la perfección y el buen hacer, verás que el resultado (acude al navegador y haz ver código fuente de l página) no queda todo lo deseable que esperaríamos de cualquier página web escrita manualmente, y el objetivo es hacer parecer a la página lo más similar a como si se hubiesen puesto las etiquetas manualmente (util para SEOs como yo, jj).

Fíjate en la captura de pantalla anterior y verás que:
Las etiquetas aparecen seguidas todas ellas, sin dejar la línea de retorno de carro típica, y ello quizá no sea lo más correcto si nuestro fin es el posicionamiento (y no queremos que google se de cuenta de que es una página dinámica, pues no le gustan tanto como las estáticas, pues el prefiere .htm (si es que ..)), vamos que lo correcto sería encontrarse en la página algo así como:

<head>
<title>Titulo</title>
<meta name=”x” content=”x”>
<meta name=”y” content=”y”>
..
</head>

Pues ahora explico el “resultado perfecto” (recordemos que nadie es perfecto pero ello no quita de)

CODIGOPERFECTO

Además de lo comentado (situar espaciadamente las etiquetas), si nuestro objetivo es el conseguir el buen posicionamiento en cuantos más buscadores mejor, además definiremos ampliamente a cada una de las etiquetas meta, pues además de la tan conocida propiedad Name, también existen para casi el mismo fin HttpEquiv e ID (y nosotros queremos que todos los buscadores nos entiendan y de paso vean que bien trabajamos, jj).

Para poder dar el retorno de carro después de que se escriba cada etiqueta utilizaremos el objeto literal para escribir dicho retorno de carro jto. a un espaciado tab.

Page.Title = “El título de la página” ‘<– como vemos, especificar el título es bastante sencillo

Dim HeaderMetaTagsArray_Nombres As New ListItemCollection ‘Nuevo array para los nombres de etiquetas (tantos como de ellas queramos poner (3 en este ejemplo))

HeaderMetaTagsArray_Nombres.Add(“Description”)

HeaderMetaTagsArray_Nombres.Add(“Keywords”)

HeaderMetaTagsArray_Nombres.Add(“Copyright”)

Dim HeaderMetaTagsArray_Valores As New ListItemCollection ‘Nuevo array para los valores (el content de la etiqueta) (tantos como el anterior array)

HeaderMetaTagsArray_Valores.Add(“Mi descripcion es ..”)

HeaderMetaTagsArray_Valores.Add(“Palabra1, palabra2, ..”)

HeaderMetaTagsArray_Valores.Add(“Alejandro B. Martin”)

For i = 0 To HeaderMetaTagsArray_Nombres.Count - 1 ‘Recorremos un bucle desde 0 hasta el total de etiquetas que queramos poner (definidas en 1er array)

Dim HeaderMetaTags As New HtmlMeta ‘al estar dentro de un bucle, se irá creando (instanciando nuevamente) dicho objeto cada vez que pertoque

HeaderMetaTags.Name = HeaderMetaTagsArray_Nombres(i).Value

HeaderMetaTags.HttpEquiv = HeaderMetaTagsArray_Nombres(i).Value

HeaderMetaTags.ID = HeaderMetaTagsArray_Nombres(i).Value

HeaderMetaTags.Content = HeaderMetaTagsArray_Valores(i).Value

Dim SaltoDeLinea As Literal = New Literal() ‘Utilizamos el objeto literal

SaltoDeLinea.Text = vbCrLf & vbTab ‘(salto de linea) (espaciado TAB)

Page.Header.Controls.Add(SaltoDeLinea)

Page.Header.Controls.Add(HeaderMetaTags) ‘Así pues para cada etiqueta (en HeaderMetaTagsArray_Nombres) se escribirá correctamente.

If i = HeaderMetaTagsArray_Nombres.Count - 1 Then Page.Header.Controls.Add(New LiteralControl(vbCrLf)) ‘llego al final y también queremos retorno de carro (esta vez sin el TAB)

Next

RESULTADOPERFECTO

Captura de pantalla - Varias etiquetas(tag) Meta de la mejor forma (o casi !, je je)

Aunque ..
Como decía en una linea aquello de que nadie es perfecto, y si miras bien el resultado, verás que para rematar la faena, aún queda dejar un retorno de carro y espaciados para la etiqueta title, y ella no se manipula con el objeto HtmlMeta sino directamente a través de page.title, pues como hacerlo, como hacer que quede del todo perfecto ..

.. eso es cosa tuya !

Copyright 26 Diciembre 2007 © Alejandro B. Martin - Reservados todos los derechos salvo consentimiento del autor.
El autor cede los derechos de publicación del presente artículo siempre y cuando se mencione al mismo y a esta url-dirección web.

Blog de WordPress.com.