Obtener el Path absoluto de una pagina u otro archivo en ASP.NET

Como dice Javier Luna, en algunas ocasiones, es necesario tener la ruta absoluta de una imagen o tener la ruta completa de una página aspx para un tag A (hyperlink). O en algunos otros casos es sólo por comodidad, pero alguna vez lo necesitaremos, así que lo comparto:

En el post de Javier: How to construct an absolute path, se muestra el código para lograr el cometido. Pero el pequeño inconveniente es que si estamos en producción o usando algún puerto, por ejemplo cuando usamos el modo FileSystem para almacenar nuestros sitios webs, sólo devolverá sólo http://localhost/tuarchivo.aspx, más no, http://localhost:4712/tuarchivo.aspx, en ese caso podemos usar el siguiente, que también sirve para el caso que no se tenga un puerto en la ruta:

   //retornar la ruta abosula de una rchivo
   protected string AbsolutePath(String file)
   {
      String end = (Request.ApplicationPath.EndsWith(“/”)) ? “” : “/”
      String path = Request.ApplicationPath + end;
      return String.Format(“http://{0}{1}{2}”, Request.Url.Authority, path, file);
   }

Si revisamos las propiedades de la clase Uri, encontramos a la propiedad Authority, que devuelve el nombre de host DNS (Sistema de nombres de dominio) o la dirección IP y el número de puerto de un servidor. Por cierto en el caso de que estemos en un entorno de producción no devolverá http://misitio:80/tuarchivo.aspx, sólo http://misitio/tuarchivo.aspx.

Saludos,

Post cruzado 3Dev Blogs

dar formato condicional a las columnas de un DataGridView (Windows Forms)

Cuando presentamos reportes de información, siempre se necesitan de indicadores que ayuden a encontrar la información de una manera rápida. Por ejemplo, en un reporte de los ingresos de los últimos 24 meses, queremos mostrar todas los campos que sean menor a determinado monto de color rojo, para que sean detectadas rápidamente. Otro ejemplo, son los reportes de notas de alguna institución, normalmente las notas desaprobatorias suelen colorearse de un color distinto. Si estuviéramos usando algún reporteador, como SQL Server Reporting Services, sólo bastaría con agregar una expresión y listo.

Pero si lo queremos hacer en un DataGridView, debemos recurrir a otras opciones. Y en este caso haremos uso del evento CellFormatting, del DataGridView. Y podremos obtener un resultado como el siguiente:

El ejemplo completo esta aquí: Personalizar el formato de los datos en el control DataGridView de formularios Windows Form. Si queremos formatear los datos también podemos visitar: Dar formato a datos en el control DataGridView de formularios Windows Forms.

Y recuerden siempre que necesiten hacer cosas adicionales a los controles, como este tipo de cosas, revisar la documentación del control, y ver que eventos tiene, puede ser que haya un evento disponible para lo que necesitemos hacer.

Saludos,

Post cruzado 3Dev Blogs

Solo en el Peru: www.floreame.net en Web 2.0

Como parte de la revolución de Web 2.0, dentro de ellos están los sitios colectivos de agregación de noticias, como Digg <http://digg.com/>, inspirado en Digg se lanzo Menéame <http://meneame.net/>, pero en español.

Y como el Perú es un país creativo, hace 6 meses, si no me equivoco, ha sido lanzado floreame.net, como clon de Menéame, pero evidentemente hecho para Perú.

 

floreame, noticias colaborativas

Título e imagen perfecta, realmente sensacional. ¿qué peruano no se da cuenta que eso tiene que ver algo con Perú, aunque no sepan de que se trata?. Habrá que empezar a florear a floréame.

Saludos,

Post cruzado 3Dev Blogs

manejando eventos de controles (ajax) dentro de un Repeater

No con mucho tiempo, voy a ser breve en algunas cosas, pero este post ya esta mucho tiempo en cola :p. Si tienen alguna duda con algo del post, lo dejan en los comentarios, y lo aclaramos.

Como ustedes saben para mostrar data personalizada y masiva en ASP.NET, aparte del GridView, tenemos el control DataList y Repeater. Porque usar uno y otro, es tema de otra discusión, y cuando haya algún tiempito lo posteo.

El caso es, que estoy usando un Repeater para mostrar noticias, pero se me presento el requerimiento de poder puntuar una noticia. Nosotros sabemos que ya fue liberado ASP.NET AJAX, pero además sabemos que también fue liberado ASP.NET AJAX Control Toolkit, y dentro de ellos un control muy útil para este tipo de casos: el control Rating.

Y lo quiero lograr al final es esto:

Por cierto este será ahora mi site demo, para todas las cosas que muestre, reconocen el fondo?. Como ustedes saben nosotros podemos responder a eventos de un botón dentro del Datalist o Repeater. Pueden revisar este artículo también: Custom Buttons in the DataList and Repeater.

Pero el ligero problema es que el control Rating no es un botón, pero si maneja eventos, y nos aprovecharemos de eso responder al evento de este control producido dentro del Repater. Primero, agregamos el control Rating a nuestra página aspx:

  1. Agregamos un control ScriptManager.
  2. Agregamos la directiva Register a la cabecera de la página:

    <%@ Register
        Assembly=”AjaxControlToolkit”
        Namespace=”AjaxControlToolkit”
        TagPrefix=”ajaxToolkit” %>

  3. Ahora agregamos el control UpdatePanel. Ojo, no incluir todo el control Repeater dentro del UpdatePanel, lo colocaremos dentro del elemento ItemTemplate del Reapater, agregamos el UpdatePanel y control Rating:

      <asp:UpdatePanel ID=”upnlPuntuar” runat=”server”>
         <ContentTemplate>
            <span class=”contenido_negrita”>Puntuar Noticia: </span>
            <ajaxToolkit:Rating ID=”ratNoticia” runat=”server” CurrentRating=”0″
                Tag='<%# Eval(“notCod”) %>’
                MaxRating=”10″ StarCssClass=”ratingStar”
                WaitingStarCssClass=”savedRatingStar”
                FilledStarCssClass=”filledRatingStar”
                EmptyStarCssClass=”emptyRatingStar”
                OnChanged=”ratNoticia_Change”
                Style=”float: left;” />
         </ContentTemplate>
      </asp:UpdatePanel>
      </p>
    </ItemTemplate>

Con eso ya tenemos en diseño el control dentro de nuestra página, sólo falta una incógnita, como manejar el evento. Si ven la declaración del control Rating, ya habrán notado como será, usando la poderosísima propiedad Tag. Manejando eventos de un botón dentro del Repeater se hace usando el evento ItemCommand del control Repeater, se hace esto para poder saber sobre que fila se hizo el evento, pero al manejar los controles sus propios eventos, se pierde esto, es por eso que nosotros usaremos la propiedad Tag, para almacenar el código de la noticia, de tal manera que cuando se dispare este evento, sepamos sobre cuál noticia ocurrio. Ahora simplemente vamos al código y hacemos lo siguiente:

   protected void ratNoticia_Change(object source, RatingEventArgs e)
   {
       //recuperar la puntación y el código de la noticia.
       
int puntuacion = int.Parse(e.Value);
       int codNot = int.Parse(e.Tag);

       EnviarPuntuacion(codNot, puntuacion); 
   }

Será que es casualidad, que agregaron la propiedad Tag al RatingEventArgs ¿?. Casualidad o no, nos sirve, y muy bien. En el método EnviarPuntuacion, ya ustedes hacen la votación, dependiendo si sólo es para usuarios registrados, para usuarios anónimos, si evito doble votación usando cookies, o usando IP, podemos agregar todas las validaciones que necesitemos, y agregar funcionalidad de nuestra propia lógica de negocios.

Saludos,

Post cruzado 3Dev Blogs

esperemos que sea cierto, y no solo palabras (Joga y biai)

Mi amigo Jorge Ojeda, Joga’s Blog, nos comenta que va retomar los post, todos los interesados en BI, y otros temas que habla en su post, pueden estar atentos a esto, claro siempre y cuando lo que dice sea cierto :p. Si no lo cumple, podemos llenarle el email, para que cumpla con su palabra.

Por cierto la semana pasada que estuve por Lima, tuvimos la oportunidad de conversar un rato al final del día, con él y con Guino, que entre otras cosas no se pudo libar, ya que ese misma noche regresaba a Trujillo. Pero en fin, siempre es agradable y productivo conversar reunirse y conversar con ellos. La experiencia en proyectos que tiene Joga, es mucha, esperemos que ahora se de un tiempito para postear y compartirla con la comunidad.

Aupa (geekeado), Joga!

Saludos,

Post cruzado 3Dev Blogs

Excelente curso de Desarrollo Web con ASP.NET 2.0 y Visual Studio 2005, gratis y en espaniol.

Siempre se recibe consultas de como iniciarse en ASP.NET. En algunos casos te dicen, -si no es mucho pedir, en español por favor.

Este curso, Curso de Desarrollo web con Visual Studio 2005, fue liberado ya hace varios meses (años), es gratuito, y  lo mejor: esta en español. Es ideal para aprender e iniciarse en ASP.NET, y aprender ASP.NET 2.0. El curso se puede llevar con Visual Web Developer Express (si no tienen Visual Studio), descarga gratuita, como también podemos descargar SQL Server Express.

Este excelente Curso, es impartido por José Manuel Alarcón, los capítulos son los siguientes:

  1. Introducción a la plataforma .NET
  2. Características del lenguaje VB.NET
  3. Fundamentos de desarrollo de aplicaciones Web
  4. Acceso a datos
  5. Técnicas avanzadas de ASP.NET
  6. Introducción a los servicios Web

También incluye una Aplicación ejemplo, con su código fuente. En algunas de las sesiones podrán descargar videos con las demos respectivas, es decir, que si no les quedo claro la teoría, pues que mejor que verlo en la práctica.

Si están iniciándose en el mundo .NET, es ideal empezar desde el capitulo 01, pero si ya llevamos algún tiempo en .NET, pero queremos iniciarnos en ASP.NET, podemos saltarnos los dos primeros capítulos y empezar desde el capítulo 3. El curso esta dictado con VB.NET, pero podrán apreciar en muchos de los casos sólo tenemos que agregar “;”. Ya no les comento más, para no ser aguafiestas, pero si les puedo decir, que si quieren aprender Desarrollo Web con ASP.NET, y novedades que trae ASP.NET 2.0, este es el curso.

Saludos, 

Post cruzado 3Dev Blogs

me canse de usar strings en Session, QueryString, Cache, AppSettings, Application, etc

Como saben en todo desarrollo web vamos a hacer uso de variables de tipo Session, Cache, o Application. Si enviamos variables por URL debemos recuperar con Request.QueryString, las variables. Si tenemos variables de aplicación debemos leer el AppSettings del web.config.

Hasta aquí no hay problema, por ejemplo, quieremos asignar una variable al objeto Session:

   Session[“CodArea”] = 5;

Si vamos a pasar variables por la URL debemos hacer:

   Response.Redirect(“~/mostrarnoticiasportag.aspx?” +
             “CodArea=” + Session[“CodArea”].ToString() +
             “&TagNombre=” + ddlTags.SelectedValue,true);

Y si queremos recuperarlas tenemos que usar:

   Request.QueryString[“TagNombre”], o Request.QueryString[“CodArea”]

No fuera problema, si sólo tenemos una página con usando ese nombre, pero que pasa si varias páginas hacen uso de ese nombre, que pasa si cambiamos el nombre de la variable por alguna razón?, tenemos que ir a todas las páginas y cambiar el nombre. Sólo de pensar eso, nació la idea de evitar ese hard code, y tener alguna manera de tener la lista de elementos en el IntellSense, siempre el dedo puede jugar una mala pasada y tipeamos mal el nombre en string, y mientras descubrimos el porque de nuestro problema, perdemos unos minutos, si tenemos muchas páginas, un error o cambio, los minutos pueden aumentar y ya se siente el efecto de estos cambios.

Lo que se me ocurrió fue usar clases de la siguiente manera:

   public class NOTQuery
   {
     
public static string CodArea
      {
         get { return “CodArea”; }
      } 
      public static string TagNombre
      {
         get { return “TagNombre”; }
      } 
   }

   public class NOTSession
   {
      public static string CodArea
      {
         get { return “CodArea”; }
      }
   }

Y ahora nuestro código de envió, sería de la siguiente manera:

    Response.Redirect(“~/not_mostrarnoticiasportag.aspx?” +
          NOTQuery.CodArea + “=” + Session[NOTSession.CodArea].ToString() +
          “&” + NOTQuery.TagNombre + “=” + ddlTags.SelectedValue,true);

Ahora si, es difícil cometer un error al escribir el nombre, pero se ven unos casos *-), además que si quiero cambiar el nombre del parámetro sólo lo hago en la clase, y no en todas las páginas. Noten que estas variables se puede usar tanto para enviar, asignar, o recuperar.

Así también podemos hacer para Cache, Application, y AppSettings. Lo que se me estaba ocurriendo al redactar el post, es también crear una lista para las páginas aspx :), aunque que para estas, ya existe intellsense, el problema es con los cambios de nombres.

Saludos,

Post cruzado 3Dev Blogs

Usando subconsultas en SQL, para reducir la complejidad de nuestros queries

Siempre que tengamos consultas complejas, donde intervienen varias tablas y además hay varios filtros, se nos puede hacer un lío. Ya hay muy buenos artículos sobre el uso subconsultas con SQL en la web: The Power of Subqueries, Using a Subquery in a T-SQL Statement.

Sólo voy a dar un ejemplo sencillo de como usar estas. Tenemos el siguiente modelo, por cierto es un modelo básico, a noticia verdadera le faltan muchos más campos:

Y se me presenta la necesidad de traer todas las noticias con el tag ‘Microsoft’. La consulta sería asi:

   SELECT * FROM Noticias.Noticia noti
        WHERE noti.NOTCod in (
                   SELECT notTag.NOTCod 
                   FROM Noticias.Tag tag
                        INNER JOIN Noticias.NoticiaTag notTag 
                        ON tag.TAGCod = notTag.TAGCod
                   WHERE tag.TAGNombre = ‘Microsoft’ )

Como pueden apreciar, en este caso la subconsulta devuelve todos los código de las noticias con el tag enviado, y sólo recuperaré las noticias cuyo código esté dentro de ese rango. Podrían decir que con sólo usar JOINs se puede también hacer, pero normalmente nuestras tablas no tendrán esta estructura, la cantidad de tablas que participan en la consulta también será mayor, y habrá muchos más filtros, por ejemplo filtro por el área, filtro por las noticias publicadas, entre otros. En el caso de que quisiéramos filtrar las noticias publicadas, sólo habría que agregar un AND y la condición al WHERE de la consulta de arriba.

Las subconsultas se pueden usar en:

  • En el listado de las columnas de una consulta SELECT.
  • En una clausula WHERE, el ejemplo de arriba.
  • En una clausula FROM.
  • En una clausula FROM de una consulta UPDATE.
  • En una clausula HAVING.

Para revisar ejemplos de uso de subconsultas, visitar:

Por cierto, revisaba un post de Percy Reyes, donde hablaba de SubQueries vs INNER JOINs, y en uno de los comentarios, PabloNetrix, comentaba que tenía consultas que toman 45 minutos. Y es que si queremos optimizar queries, no sólo debemos valernos de subconsultas, ya Rodrigo, hablo del uso de índices, también se debe hacer uso del plan de ejecución de SQL, para observar, interpretar, y tunear nuestros queries. Además, para saber si lo que estamos haciendo va bien, o que más podemos hacer. Por cierto encontré estos links: Cómo solucionar problema de consultas de ejecución lenta en SQL Server 7.0 o versiones posteriores, y Mostrar planes de ejecución gráficos (SQL Server Management Studio).

Saludos,

Post cruzado 3Dev Blogs

Chess… ya soy MCTS, si, recien.

La semana pasada me anime a dar el examen 70-528 – TS: Microsoft .NET Framework 2.0 – Web-Based Client Development, el cual me faltaba para ser MCTS en .NET Framework 2.0 Web Applications, ya que hace unos meses había dado y aprobado el examen 70-536 – TS: Microsoft .NET Framework 2.0—Application Development Foundation, gratis. Lo programe para esta semana, previo pago, la fecha parecía muy pronta, pero sin presión no hay emoción, a parte que ese examen y el 70-536, los di cuando estaban en beta, y en el que fue mejor fue en el 70-528, también ASP.NET ya lo vengo viendo desde hace tiempo cuando era beta, participe en la creación de un curso de entrenamiento de Desarrollo Web con ASP.NET 2.0 para 3Dev, y por último, actualmente estoy trabajando en un proyecto Web, ¿habían las de perder?. Sólo estaba esperando un motivo para dar el examen, y fue que, me invitaron a participar en una charla de ASP.NET AJAX, así que si más vueltas que darle, el martes (13/Feb) viaje de mi ciudad actual Trujillo, a la ciudad de ciudad Lima, ya que no hay ningún Microsoft CTEC en mi ciudad. Y ahora ya puedo usar el siguiente logo :p:

MCTS Sergio Tarrillo

Aunque creo, que igual me “costo” ser MCTS (pasaje, y derecho a dar examen). Esperemos que sigan aumentando el tipo de aplicaciones en el logo, y también el grado a MCPD.

Por otro lado, quería comentar la importancia y beneficios, desde mi punto de vista, de obtener una certificación:

  • Acreditar habilidades, en la rama de la certificación obtenida. Esto me paso cuando “era” estudiante, ya egrese :P, no muchas veces las empresas e instituciones confían en las personas, y si tienes la necesidad de empezar a trabajar cuando eres estudiante, contar con un certificado te puede ayudar mucho. Ya con el tiempo, la certificación tiene que ir acompañada de experiencia, si no como¿?.
  • Suma CV, claro siempre y cuando la certificación sea del perfil requerido por la convocatoria.
  • Suma puntos en algunas licitaciones. Al igual que los títulos y grados, contar con determinadas certificaciones suma puntos para presentarse a una licitación.
  • Hay recursos sólo para certificados, y en el caso de poseer determinada Certificación Microsoft, obtienes entradas gratis a determinados tipos de eventos.
  • Poder usar el logo en tus tarjetas, ppts, documentos, etc :D.
  • Permanencia en un filtro de una empresa. Imaginen una empresa que hace una convocatoria masiva para 20 puestos, se presentan 400, sería productivo entrevistar a los 400?. Comenzarán filtrar, 150 menos por no tener título, 100 menos por no tener experiencia, 100 menos por no contar con algún certificado. Y ahí están los 50 con los cuales se quedan y hacen la entrevista. Obviamente que puede haber más parámetros de filtro, sólo es un ejemplo. Por cierto, leer: Como lograr que tu “CV” sea leído.

Debe haber más beneficios, pero esas son las que se me vinieron primero a la mente. Si quieren certificarse y ya cuentan con experiencia en el campo, pueden revisar el contenido del examen, investigar y darlo. Pero si recién están empezando y necesitan asesoría de profesionales, puede acudir a algún CTEC de su región.

P.D.: Para no entrar a la discusión, de siempre, de que muchas veces hay certificados con sólo revisar un testking. Es cierto, es como todo, también hay profesionales mediocres con título, todo depende de que la empresa que evalué lo haga correctamente. Además mi forma de pensar es que los títulos, la universidad, o las certificaciones, o cualquier cosa que adorne profesionalmente a una persona, no hacen a la persona, las personas son quienes hacen que esos títulos, certificaciones, o grados tengan valor ;).

Saludos,

Post cruzado

Links oficiales de ASP.NET AJAX

Este será un quickpost, con los links oficiales de ASP.NET AJAX, además que sirve como punto de referencia para iniciarse en el manejo de AJAX en nuestras Aplicaciones Web con ASP.NET AJAX.

Saludos,

Post cruzado