Utiliza String.Format para establecer el valor de ImageUrl de un tag asp:Image dentro de un DataList

Me estuve peleando un rato con esto, hasta que encontré la solución.

Tengo un DataList, y dentro de él aparecen imágenes cuya ruta se forma a partir de un valor devuelto por la base de datos.

Mi primera idea fue tratar de unir la ruta con el Eval, de esta forma:

  1. <asp:Image ImageUrl='~/postales/thumbs/<%# Eval("archivoThumbnail") %>' BorderStyle="None" CssClass="bordeImagenGris" Height="80" Width="80" ID="Image1" runat="server" />

Pero dado que el Eval aparece dentro de las comillas simples de ImageUrl, el valor es pasado tal cual, así que la imagen nunca es encontrada.

Para resolverlo, tienes que usar la función String.Format, de esta manera:

  1. <asp:Image ImageUrl=<%# String.Format("~/postales/thumbs/{0}",Eval("archivoThumbnail"))%> BorderStyle="None" CssClass="bordeImagenGris" Height="80" Width="80" ID="Image1" runat="server" />

Sobre String.Format

La función String.Format es un concatenador (valga el término) de cadenas de texto. Toma n parámetros. Cada parámetro se define por un número encerrado entre llaves ({ y }), y a cada parámetro existente debes darle un valor.

Como siempre, es más fácil entenderlo con un ejemplo:

  1. String.Format("Roger {0} es el mejor {1} del {2}", "Federer", "tenista", "mundo")
  2. 'Esto regresará el siguiente texto:
  3. 'Roger Federer es el mejor tenista del mundo

Trabajando con subcarpetas, CSS y Master Pages usando Page.ResolveUrl

Tengo un Master Page en el fólder raíz de mi aplicación ASP.NET.
Tengo un CSS también en el fólder raíz.
En el Master Page, mando llamar al CSS de la siguiente forma:

  1. <link href="Estilo.css" rel="stylesheet" type="text/css" />

Ahora bien, tengo una página llamada Default.aspx en el fólder raíz y otra llamada Dos.aspx en una carpeta. Las dos páginas están basadas en el Master Page. En la página Default.aspx el CSS se carga sin problemas. En la página Dos.aspx el CSS no se carga porque la aplicación no está reescribiendo la ruta del CSS, y no lo encuentra dentro de la carpeta.

Intenté esto:

  1. <link href="~/Estilo.css" rel="stylesheet" type="text/css" runat="server" />

¡Pero no funciona!

Estuve investigando y encontré la manera de hacerlo funcionar, es así:

  1. <link href='<%=Page.ResolveUrl("~/Estilo.css") %>' rel="stylesheet" type="text/css"></link>

La instrucción Page.ResolverUrl reescribe toda la ruta, sin importar en qué carpeta, sub-carpeta, sub-sub-carpeta, etc. estemos. Esto es genial ya que si un día mueves tu aplicación a un fólder virtual o a un dominio distinto, no tendrás que preocuparte por modificar estas referencias.

Lo mejor de todo es que funciona donde sea, por ejemplo:

  1. <script src='<%=Page.ResolveUrl("~/scripts/MisFunciones.js") %>' type="text/javascript"></script>

Las imágenes de las Master Pages no se ven en páginas que están en una subcarpeta

Si en un Master Page de ASP.NET pones alguna imagen de esta manera:

  1. <img src="Imagenes/MiImagen.jpg">

Todo va a funcionar bien siempre y cuando las páginas que crees a partir de tu Master Page se encuentren en la misma carpeta que el Master Page.

Intenta crear un fólder y crea una página basada en tu Master Page dentro del fólder y verás que la imagen no se ve.

Esto es porque el Master Page no modifica la ruta de tu imagen.

Para que lo haga, escribe lo siguiente en tu Master Page:

  1. <img src="~/Imagenes/MiImagen.jpg" runat="server">

La tilde, ~, sumada a la propiedad runat="server" le indican a la Master Page que reescriba las rutas de acuerdo al fólder en que se encuentra la página basada en el Master Page.

Está bien la solución anterior, pero lo mejor que puedes hacer es siempre utilizar tags de servidor. Así que para el ejemplo anterior utiliza:

  1. <asp:Image ImageUrl="~/Imagenes/MiImagen.jpg" ID="Image1" runat="server" />

Con la tilde, si tienes una página en una subcarpeta, la imagen se reescribirá así:

  1. <img src="../Imagenes/MiImagen.jpg">

Esta manera de manejar las imágenes es ideal porque si en un futuro mueves tu aplicación a cualquier otro fólder virtual, no necesitarás modificar las rutas de las imágenes.

Usando UpdatePanel con Triggers

Si estás usando en Ajax un UpdatePanel, es sencillo hacer que éste se actualize si colocas un botón dentro de él mismo, algo como:

<asp:updatepanel id="UpdatePanel1" runat="server">
   <contenttemplate>
      <asp:button id="Buscar" runat="server" text="Buscar"></asp:button>
      <asp:label runat="server" text="Label"></asp:label>
   </contenttemplate>
</asp:updatepanel>

Sin embargo, ¿qué ocurre si el botón que debe desencadenar la actualización del UpdatePanel se encuentra fuera del mismo?

Entonces debes añadir un trigger al UpdatePanel para indicarle cuál o cuáles controles deben desencadenar su actualización. Hazlo así:

<asp:button id="Buscar" runat="server" text="Buscar"></asp:button>
<asp:updatepanel id="UpdatePanel1" runat="server">
   <contenttemplate>
      <asp:label runat="server" text="Label"></asp:label>
   </contenttemplate>
   <triggers>
      <asp:asyncpostbacktrigger controlid="Buscar" eventname="Click"></asp:asyncpostbacktrigger>
   </triggers>
</asp:updatepanel>

SQL que encuentra coincidencias de un string sin usar LIKE en un .XSD de ASP.NET 2

Estoy usando .NET 2. Tengo mi archivo .XSD (Data Layer) y mi Business Logic.

El caso es que en el .XSD estoy poniendo esta consulta:

SELECT * from tabla where nombre LIKE ?

Yo quería encontrar cualquier campo que contuviera el string solicitado, es decir, si alguien buscaba “pa”, la sentencia debía regresar valores como “paco”, “palabra”, “pais”, etc. Pero con el LIKE solamente regresaba el valor si la coincidencia era exacta.

Otros intentos que hice fueron:

SELECT * from tabla where nombre LIKE '%?%'

SELECT * from tabla where nombre LIKE %?%

SELECT * from tabla where nombre LIKE %?%

Ninguno sirve porque al parecer al definir la sentencia SQL en el archivo .XSD, el signo de interrogación no puede tener ningún comodín.

Entonces busqué alguna función que pudiera ayudarme, y al final lo logré. La sentencia debe quedar así:

SELECT * from tabla where (INSTR(nombre,?) > 0)

INSTR(str,substr) devuelve la posición de la primera ocurrencia de substring en la cadena de texto str.

Así que si devuelve un número mayor a cero, significa que lo encontró.

Ahora bien, siendo más estrictos, lo que yo quería era que encontrara el principio de la palabra. Es decir, si alguien buscaba por “yo” debería encontrar “yolanda”, pero no “pelayo”. Entonces necesitaba algo que le indicara que buscara solamente al principio del campo.

Así es como lo logré:

SELECT * from tabla where nombre REGEXP CONCAT('^',?)

expr REGEXP pat realiza una búsqueda de expresiones regulares en la cadena expr usando el modelo pat.

CONCAT(cad1, cad2, ...) une cadenas de texto.

Es decir que al ejecutarse:
SELECT * from tabla where nombre REGEXP CONCAT('^','yo')

Se convierte en:
SELECT * from tabla where nombre REGEXP '^yo'

Como sabes, el símbolo ^ en expresiones regulares, significa el inicio de una palabra.

El signo ‘?’ es por si estás utilizando MySQL.

Si utilizas SQL Server, cambia el ‘?’ por ‘@Nombre’ o cualquiera que sea el nombre de tu parámetro.

Para mayor información:
http://dev.mysql.com/doc/refman/5.0/en/string-functions.html