<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://geeks.ms/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>SergioTarrillo - RichWeblog : Best Practices</title><link>http://geeks.ms/blogs/sergiotarrillo/archive/tags/Best+Practices/default.aspx</link><description>Etiquetas: Best Practices</description><dc:language>en</dc:language><generator>CommunityServer 2008.5 SP1 (Build: 31106.3070)</generator><item><title>Que hacer cuando IIS no te deja publicar un Sitio Web ASP.NET</title><link>http://geeks.ms/blogs/sergiotarrillo/archive/2010/03/03/168632.aspx</link><pubDate>Wed, 03 Mar 2010 15:01:54 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:168632</guid><dc:creator>Sergio Tarrillo</dc:creator><slash:comments>4</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/sergiotarrillo/rsscomments.aspx?PostID=168632</wfw:commentRss><comments>http://geeks.ms/blogs/sergiotarrillo/archive/2010/03/03/168632.aspx#comments</comments><description>&lt;p&gt;Con el paso del tiempo y familiaridad nos daremos cuenta que la publicación de un Sitio Web (Web Site) o Aplicación Web (Web Application), es lo más sencillo gracias a la herramienta, es decir, Visual Studio 2005+ o Visual Web Developer Express, sólo hacemos clic derecho sobre el proyecto Web o el Sitio Web, y seleccionamos Copy Web Site o Publish Web Site, y podemos escoger si publicamos directamente hacia un servidor, un FTP, o File System para copiarlo por RED o llevarlo en un USB.&lt;/p&gt;  &lt;p&gt;&lt;img src="http://sergiot2.com/blogimages/2010/01Ene/02_CopyWebSite_Web_Site_ASPNET.jpg" alt="" /&gt;&lt;/p&gt;  &lt;p&gt;&lt;img src="http://sergiot2.com/blogimages/2010/01Ene/02_Publish_Web_Site_ASPNET.jpg" alt="" /&gt;&lt;/p&gt;  &lt;p&gt;Reducimos el problema, &lt;strike&gt;divide y vencerás &lt;b&gt;forever&lt;/b&gt;&lt;/strike&gt;, a llevar los archivos generados a nuestro Servidor Web IIS, que es donde suceden los mayores problemas al publicar un Sitio Web.&lt;/p&gt;  &lt;p&gt;&lt;b&gt;Problema Central&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;En cuanto a la publicación en un Servidor Web, se pondrá más interesante si es que no tenemos acceso remoto al servidor, y sólo podemos copiar los archivos por FTP o subiéndolos vía web, la identificación de problemas será un poco más difícil porque no tenemos acceso a la servidor (verificar permisos en el sistema de archivos, revisar Event Viewer, etc). Por ejemplo, un error en la definición de la de conexión, puede hacer que no podamos acceder a la pagina y confundir sobre el verdadero error, entonces debemos deshabilitar los errores personalizados, en algunos extremos intentar depurar remotamente la aplicación Web (es lo peor que se puede hacer, evitar llevar este tema a los foros). Si una aplicación funciona bien en desarrollo, debería funcionar también en producción sin la necesidad de hacer una depuración remota, sólo es un tema de configuración y permisos.&lt;/p&gt;  &lt;p&gt;&lt;b&gt;Alternativa&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;Una buena práctica si es que recién estamos empezando y el llevar nuestra aplicación a producción se convierte en un grave problema , es tener un página con código “Inline” que sea nuestro robot “buscaerrores”. Cada vez que deseamos publicar una aplicación Web, primero enviaremos a nuestro robot a verificar que la configuración del servidor Web sea el correcta, si el robot pasa la prueba, la publicación del sitio web será una tarea sencilla.&lt;/p&gt;  &lt;p&gt;&lt;b&gt;Algunas Ventajas &lt;/b&gt;&lt;/p&gt;  &lt;p&gt;Ya sea el equipo infraestructura o el equipo de desarrollo, el que realice la publicación de una Aplicación Web, debemos tener un robot que nos permita detectar los siguientes problemas:&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;Detectar configuraciones incorrectas en el Application Pool de un Sitio Web. ¿&lt;a title="Los Application Pools, y que tienen que ver con los Web Sites de ASP.NET" href="http://geeks.ms/blogs/sergiotarrillo/archive/2007/03/04/11279.aspx" target="_blank"&gt;Qué es un Application Pool&lt;/a&gt;? Por ejemplo, si no tenemos al usuario por defecto en un Application Pool (NETWORK SERVICE), debemos darle ciertos permisos y hacerlo que pertenezca a un grupo especial para que pueda ser un usuario del Application Pool. &lt;/li&gt;    &lt;li&gt;Verificar que las conexiones a la base de datos funcionen correctamente. Hay muchos sitios web, que no hay ninguna página que no funcione sin hacer conexiones a la base de datos, es decir que si por alguna razón no cambiaron la cadena de conexión al pasar a producción, o el servidor de base de datos no tiene los permisos correctos, ninguna página web de toda la Aplicación va a funcionar. Por ejemplo sitios web que generan sus menús desde la base de datos, este menú estará presente en todas las páginas. &lt;/li&gt;    &lt;li&gt;Verificar que los permisos en el sistema de archivos sea el correcto. Si habilitamos la carga de archivos en nuestra aplicación debemos dar los permisos necesarios al usuario del Application Pool (por defecto NETWORK SERVICE) para que pueda escribir sobre la carpeta donde vamos a poner los archivos. &lt;/li&gt;    &lt;li&gt;Cualquier otra verificación que ustedes requieran hacer antes de pasar una aplicación Web a Producción. La idea es dejar una página base, pero ustedes pueden personalizarla de acuerdo a sus escenarios. &lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;El robot, debe ser muy simple y no depender de ninguna otra página o recurso para funcionar:&lt;/p&gt;  &lt;p&gt;&lt;img src="http://sergiot2.com/blogimages/2010/01Ene/02_Robot_Interface.jpg" alt="" /&gt;&lt;/p&gt;  &lt;p&gt;Y el código fuente debe ser Inline para que funcione independiente si es un Sitio Web o una Aplicación Web:&lt;/p&gt;  &lt;p&gt;&lt;img src="http://sergiot2.com/blogimages/2010/01Ene/02_Robot_Source.jpg" alt="" /&gt;&lt;/p&gt;  &lt;p&gt;&lt;a title="Descargar Robot para Verficicar IIS para ASP.NET" href="http://geeks.ms/media/p/168621.aspx" target="_blank"&gt;Descargar Robot para Verificar IIS para ASP.NET&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;&lt;b&gt;Anécdota sobre el tema&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;Recuerdo hace algunos años, en el team “epica” estábamos liberando una nueva versión de un producto Web para uno de nuestros clientes, el Project Manager tuvo problemas durante la presentación de esta nueva versión, sólo llamo para decirme: “La Web no funciona, revisa que puede estar pasando”. El equipo de infraestructura del cliente (un empresa multinacional) no pudo detectar el problema y sólo se liberaba de la responsabilidad diciendo que la aplicación Web no Funcionaba. Después de un par de intentos fallidos por solucionar el problema, el equipo de desarrollo tuvo que ir a resolver el problema. No recuerdo exactamente el problema, pero era más o menos así: anteriormente habían instalando una Aplicación Web, que había cambiado la estructura común del IIS, ellos al instalar nuestra aplicación Web no lo habían hecho correctamente y nuestra Web estaba heredando el archivo de configuración de la aplicación instalada anteriormente, y por eso no funcionaba correctamente. Después de un par de cambios en el IIS Manager, nuestra aplicación Web estaba funcionando correctamente.&lt;/p&gt;  &lt;p&gt;Saludos,&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=168632" width="1" height="1"&gt;</description><category domain="http://geeks.ms/blogs/sergiotarrillo/archive/tags/ASP.NET/default.aspx">ASP.NET</category><category domain="http://geeks.ms/blogs/sergiotarrillo/archive/tags/IIS/default.aspx">IIS</category><category domain="http://geeks.ms/blogs/sergiotarrillo/archive/tags/Best+Practices/default.aspx">Best Practices</category><category domain="http://geeks.ms/blogs/sergiotarrillo/archive/tags/Web/default.aspx">Web</category></item><item><title>ADO.NET: tu conexion no se cierra?, el poder de using</title><link>http://geeks.ms/blogs/sergiotarrillo/archive/2008/01/17/64538.aspx</link><pubDate>Thu, 17 Jan 2008 14:51:00 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:64538</guid><dc:creator>Sergio Tarrillo</dc:creator><slash:comments>11</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/sergiotarrillo/rsscomments.aspx?PostID=64538</wfw:commentRss><comments>http://geeks.ms/blogs/sergiotarrillo/archive/2008/01/17/64538.aspx#comments</comments><description>&lt;p&gt;Aunque en desarrollo &lt;a href="http://msdn2.microsoft.com/es-es/library/yh598w02(VS.80).aspx" target="_blank"&gt;using sólo será una instrucción&lt;/a&gt;, cuando hagas deployment verás el poder de using :).&lt;/p&gt;
&lt;p&gt;Sobre todo cuando empiecen a tener este mensajillo: &amp;quot;&lt;i&gt;Timeout expired. The timeout period elapsed prior to obtaining a connection from the pool. This may have occurred because all pooled connections were in use and max pool size was reached.&lt;/i&gt;&amp;quot;&lt;/p&gt;
&lt;p&gt;Como decía en &lt;a href="http://blogs.msdn.com/angelsb/archive/2004/08/25/220333.aspx" target="_blank"&gt;uno los links&lt;/a&gt;, este mensaje principalmente se presenta cuando la web esta en producción, más no en desarrollo (ya que al detener la app, o el servidor virtual de asp.net, se reciclan todas las conexiones), pero cuando esta tu server, tendriás que reiniciar el servicio.&lt;/p&gt;
&lt;p&gt;La causa de este problema (en mi escenario), es&amp;nbsp;que las conexiones no se estaban cerrando&amp;nbsp;como yo pensaba, la llamada al método Close(), nunca se daba.&lt;/p&gt;
&lt;p&gt;Revisen esta entrada: &lt;a href="http://blogs.msdn.com/angelsb/archive/2004/08/25/220333.aspx" target="_blank"&gt;Connection Pooling and the &amp;quot;Timeout expired&amp;quot; exception FAQ&lt;/a&gt;, pero más importante que revisarla, hagan el ejemplo. Cuando hagan el ejemplo revisen en el managment studio, las conexiones con el siguiente sp, &lt;a href="http://msdn2.microsoft.com/es-es/library/ms174313.aspx" target="_blank"&gt;SP_WHO&lt;/a&gt;: &lt;/p&gt;
&lt;div&gt;
&lt;div style="PADDING-RIGHT:0px;PADDING-LEFT:0px;FONT-SIZE:8pt;PADDING-BOTTOM:0px;OVERFLOW:visible;WIDTH:100%;COLOR:black;BORDER-TOP-STYLE:none;LINE-HEIGHT:12pt;PADDING-TOP:0px;FONT-FAMILY:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;BORDER-RIGHT-STYLE:none;BORDER-LEFT-STYLE:none;BORDER-BOTTOM-STYLE:none;"&gt;&lt;pre style="PADDING-RIGHT:0px;PADDING-LEFT:0px;FONT-SIZE:8pt;PADDING-BOTTOM:0px;MARGIN:0em;OVERFLOW:visible;WIDTH:100%;COLOR:black;BORDER-TOP-STYLE:none;LINE-HEIGHT:12pt;PADDING-TOP:0px;FONT-FAMILY:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;BORDER-RIGHT-STYLE:none;BORDER-LEFT-STYLE:none;BORDER-BOTTOM-STYLE:none;"&gt;&lt;span&gt;   1:&lt;/span&gt; &lt;span&gt;exec&lt;/span&gt; SP_WHO&lt;/pre&gt;&lt;pre style="PADDING-RIGHT:0px;PADDING-LEFT:0px;FONT-SIZE:8pt;PADDING-BOTTOM:0px;MARGIN:0em;OVERFLOW:visible;WIDTH:100%;COLOR:black;BORDER-TOP-STYLE:none;LINE-HEIGHT:12pt;PADDING-TOP:0px;FONT-FAMILY:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;BORDER-RIGHT-STYLE:none;BORDER-LEFT-STYLE:none;BORDER-BOTTOM-STYLE:none;"&gt;&lt;span&gt;   2:&lt;/span&gt; go&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;Verán como crece exorbitantemente el número de conexiones. Un ejemplo de los resultados es el siguiente pantallazo: &lt;/p&gt;
&lt;p&gt;&lt;img src="http://galeon.com/solocodigo/images/blog/2008/01Ene/17_sp.jpg" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;Como se puede apreciar todas las conexiones actuales a un servidor de base de datos, los login con nombre propio son de las estaciones de trabajo, se puede deteminar el patrón de quién esta generando conexiones de más, que ususario en que PC contra que base de datos, entre otras. Nótese que el spid, es el PrimaryKey del registro :D.&lt;/p&gt;
&lt;p&gt;Otra herramienta de ayuda para diagnosticar en que parte del código o juego de consultas tenemos problemas con las conexiones, es usar el &lt;a href="http://geeks.ms/blogs/sergiotarrillo/archive/2007/07/07/19011.aspx" target="_blank"&gt;SQL Profiler&lt;/a&gt;:&lt;/p&gt;
&lt;p&gt;&lt;img src="http://galeon.com/solocodigo/images/blog/2008/01Ene/17_prof.jpg" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;Acá podemos determinar en que juego de columnas se están abriendo nuevas conexiones, cada consulta tiene un SPID, y junto con los resultados del SP_WHO, podemos buscar la raíz del problema.&lt;/p&gt;
&lt;p&gt;Si tenemos problemas como el primer mensaje, la primera tarea sería identificar si estamos administrando bien las conexiones dentro de nuestra aplicación. Por cierto no es una solución, no en primera instancia, &lt;a href="http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=1037884&amp;amp;SiteID=1" target="_blank"&gt;aumentar el número de conexiones máximas&lt;/a&gt; (modificando la propiedad &lt;a href="http://msdn2.microsoft.com/es-es/library/system.data.sqlclient.sqlconnection.connectionstring(VS.80).aspx" target="_blank"&gt;Max Pool Size&lt;/a&gt;, que tiene un valor por defecto de 100), ya que cada vez van necesitar seguir aumentado más, este problema de escalabilidad con una buena administración de las conexiones no tiene porque dar mucha lata :D.&lt;/p&gt;
&lt;p&gt;Ejemplo:&lt;/p&gt;
&lt;div&gt;
&lt;div style="PADDING-RIGHT:0px;PADDING-LEFT:0px;FONT-SIZE:8pt;PADDING-BOTTOM:0px;OVERFLOW:visible;WIDTH:100%;COLOR:black;BORDER-TOP-STYLE:none;LINE-HEIGHT:12pt;PADDING-TOP:0px;FONT-FAMILY:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;BORDER-RIGHT-STYLE:none;BORDER-LEFT-STYLE:none;BORDER-BOTTOM-STYLE:none;"&gt;&lt;pre style="PADDING-RIGHT:0px;PADDING-LEFT:0px;FONT-SIZE:8pt;PADDING-BOTTOM:0px;MARGIN:0em;OVERFLOW:visible;WIDTH:100%;COLOR:black;BORDER-TOP-STYLE:none;LINE-HEIGHT:12pt;PADDING-TOP:0px;FONT-FAMILY:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;BORDER-RIGHT-STYLE:none;BORDER-LEFT-STYLE:none;BORDER-BOTTOM-STYLE:none;"&gt;&lt;span&gt;   1:&lt;/span&gt; &lt;span&gt;using&lt;/span&gt; (OleDbConnection cnExcel = &lt;span&gt;new&lt;/span&gt; OleDbConnection(strCnExcel))&lt;/pre&gt;&lt;pre style="PADDING-RIGHT:0px;PADDING-LEFT:0px;FONT-SIZE:8pt;PADDING-BOTTOM:0px;MARGIN:0em;OVERFLOW:visible;WIDTH:100%;COLOR:black;BORDER-TOP-STYLE:none;LINE-HEIGHT:12pt;PADDING-TOP:0px;FONT-FAMILY:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;BORDER-RIGHT-STYLE:none;BORDER-LEFT-STYLE:none;BORDER-BOTTOM-STYLE:none;"&gt;&lt;span&gt;   2:&lt;/span&gt; {&lt;/pre&gt;&lt;pre style="PADDING-RIGHT:0px;PADDING-LEFT:0px;FONT-SIZE:8pt;PADDING-BOTTOM:0px;MARGIN:0em;OVERFLOW:visible;WIDTH:100%;COLOR:black;BORDER-TOP-STYLE:none;LINE-HEIGHT:12pt;PADDING-TOP:0px;FONT-FAMILY:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;BORDER-RIGHT-STYLE:none;BORDER-LEFT-STYLE:none;BORDER-BOTTOM-STYLE:none;"&gt;&lt;span&gt;   3:&lt;/span&gt;    &lt;span&gt;using&lt;/span&gt; (OleDbCommand cmd =&lt;/pre&gt;&lt;pre style="PADDING-RIGHT:0px;PADDING-LEFT:0px;FONT-SIZE:8pt;PADDING-BOTTOM:0px;MARGIN:0em;OVERFLOW:visible;WIDTH:100%;COLOR:black;BORDER-TOP-STYLE:none;LINE-HEIGHT:12pt;PADDING-TOP:0px;FONT-FAMILY:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;BORDER-RIGHT-STYLE:none;BORDER-LEFT-STYLE:none;BORDER-BOTTOM-STYLE:none;"&gt;&lt;span&gt;   4:&lt;/span&gt;                &lt;span&gt;new&lt;/span&gt; OleDbCommand(&lt;span&gt;&amp;quot;SELECT * FROM [Sheet1$]&amp;quot;&lt;/span&gt;, cnExcel))&lt;/pre&gt;&lt;pre style="PADDING-RIGHT:0px;PADDING-LEFT:0px;FONT-SIZE:8pt;PADDING-BOTTOM:0px;MARGIN:0em;OVERFLOW:visible;WIDTH:100%;COLOR:black;BORDER-TOP-STYLE:none;LINE-HEIGHT:12pt;PADDING-TOP:0px;FONT-FAMILY:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;BORDER-RIGHT-STYLE:none;BORDER-LEFT-STYLE:none;BORDER-BOTTOM-STYLE:none;"&gt;&lt;span&gt;   5:&lt;/span&gt;        {&lt;/pre&gt;&lt;pre style="PADDING-RIGHT:0px;PADDING-LEFT:0px;FONT-SIZE:8pt;PADDING-BOTTOM:0px;MARGIN:0em;OVERFLOW:visible;WIDTH:100%;COLOR:black;BORDER-TOP-STYLE:none;LINE-HEIGHT:12pt;PADDING-TOP:0px;FONT-FAMILY:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;BORDER-RIGHT-STYLE:none;BORDER-LEFT-STYLE:none;BORDER-BOTTOM-STYLE:none;"&gt;&lt;span&gt;   6:&lt;/span&gt;           cnExcel.Open();&lt;/pre&gt;&lt;pre style="PADDING-RIGHT:0px;PADDING-LEFT:0px;FONT-SIZE:8pt;PADDING-BOTTOM:0px;MARGIN:0em;OVERFLOW:visible;WIDTH:100%;COLOR:black;BORDER-TOP-STYLE:none;LINE-HEIGHT:12pt;PADDING-TOP:0px;FONT-FAMILY:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;BORDER-RIGHT-STYLE:none;BORDER-LEFT-STYLE:none;BORDER-BOTTOM-STYLE:none;"&gt;&lt;span&gt;   7:&lt;/span&gt;           &lt;span&gt;using&lt;/span&gt; (OleDbDataReader reader = cmd.ExecuteReader())&lt;/pre&gt;&lt;pre style="PADDING-RIGHT:0px;PADDING-LEFT:0px;FONT-SIZE:8pt;PADDING-BOTTOM:0px;MARGIN:0em;OVERFLOW:visible;WIDTH:100%;COLOR:black;BORDER-TOP-STYLE:none;LINE-HEIGHT:12pt;PADDING-TOP:0px;FONT-FAMILY:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;BORDER-RIGHT-STYLE:none;BORDER-LEFT-STYLE:none;BORDER-BOTTOM-STYLE:none;"&gt;&lt;span&gt;   8:&lt;/span&gt;           {&lt;/pre&gt;&lt;pre style="PADDING-RIGHT:0px;PADDING-LEFT:0px;FONT-SIZE:8pt;PADDING-BOTTOM:0px;MARGIN:0em;OVERFLOW:visible;WIDTH:100%;COLOR:black;BORDER-TOP-STYLE:none;LINE-HEIGHT:12pt;PADDING-TOP:0px;FONT-FAMILY:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;BORDER-RIGHT-STYLE:none;BORDER-LEFT-STYLE:none;BORDER-BOTTOM-STYLE:none;"&gt;&lt;span&gt;   9:&lt;/span&gt;              &lt;span&gt;//....&lt;/span&gt;&lt;/pre&gt;&lt;pre style="PADDING-RIGHT:0px;PADDING-LEFT:0px;FONT-SIZE:8pt;PADDING-BOTTOM:0px;MARGIN:0em;OVERFLOW:visible;WIDTH:100%;COLOR:black;BORDER-TOP-STYLE:none;LINE-HEIGHT:12pt;PADDING-TOP:0px;FONT-FAMILY:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;BORDER-RIGHT-STYLE:none;BORDER-LEFT-STYLE:none;BORDER-BOTTOM-STYLE:none;"&gt;&lt;span&gt;  10:&lt;/span&gt;           }&lt;/pre&gt;&lt;pre style="PADDING-RIGHT:0px;PADDING-LEFT:0px;FONT-SIZE:8pt;PADDING-BOTTOM:0px;MARGIN:0em;OVERFLOW:visible;WIDTH:100%;COLOR:black;BORDER-TOP-STYLE:none;LINE-HEIGHT:12pt;PADDING-TOP:0px;FONT-FAMILY:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;BORDER-RIGHT-STYLE:none;BORDER-LEFT-STYLE:none;BORDER-BOTTOM-STYLE:none;"&gt;&lt;span&gt;  11:&lt;/span&gt;        }&lt;/pre&gt;&lt;pre style="PADDING-RIGHT:0px;PADDING-LEFT:0px;FONT-SIZE:8pt;PADDING-BOTTOM:0px;MARGIN:0em;OVERFLOW:visible;WIDTH:100%;COLOR:black;BORDER-TOP-STYLE:none;LINE-HEIGHT:12pt;PADDING-TOP:0px;FONT-FAMILY:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;BORDER-RIGHT-STYLE:none;BORDER-LEFT-STYLE:none;BORDER-BOTTOM-STYLE:none;"&gt;&lt;span&gt;  12:&lt;/span&gt; }&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;P.D.: Using en general es usando para forzadamente liberar lo recursos usados, es por eso que comúnmente lo vemos ahora en el manejo de archivo, o en el uso de TransactionScope, y en general con cualquier objeto que implementa la &lt;a href="http://msdn2.microsoft.com/en-us/library/system.idisposable.aspx" target="_blank"&gt;interfaz IDisposable&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;font color="#ff0000"&gt;&amp;nbsp;Actualización (20070118)&lt;/font&gt;&lt;/strong&gt;: Revisar los comentarios y aclaraciones que hace Unai, con respecto al tema de la entrada.&lt;/p&gt;
&lt;p&gt;Saludos,&lt;/p&gt;&lt;br /&gt;Post cruzado&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=64538" width="1" height="1"&gt;</description><category domain="http://geeks.ms/blogs/sergiotarrillo/archive/tags/Ado.NET/default.aspx">Ado.NET</category><category domain="http://geeks.ms/blogs/sergiotarrillo/archive/tags/Best+Practices/default.aspx">Best Practices</category></item><item><title>usando UrlRewriting :D</title><link>http://geeks.ms/blogs/sergiotarrillo/archive/2007/11/30/53936.aspx</link><pubDate>Fri, 30 Nov 2007 14:34:04 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:53936</guid><dc:creator>Sergio Tarrillo</dc:creator><slash:comments>2</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/sergiotarrillo/rsscomments.aspx?PostID=53936</wfw:commentRss><comments>http://geeks.ms/blogs/sergiotarrillo/archive/2007/11/30/53936.aspx#comments</comments><description>&lt;p&gt;Hace tiempo que tenía un post en la cola, sobre el &lt;a href="http://geeks.ms/blogs/sergiotarrillo/archive/2007/01/30/9467.aspx" target="_blank"&gt;uso URL Rewriting en ASP.NET&lt;/a&gt;, la mayoría de ejemplos se basan en crear un nuevo HttpModule en ASP.NET, leer este artículo sobre Http Handlers y Http Modules: &lt;a href="http://www.15seconds.com/issue/020417.htm" target="_blank"&gt;HTTP Handlers and HTTP Modules in ASP.NET&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;Como decía, la solución más común es crear un nuevo Http Module, me animé por el &lt;a title="http://www.urlrewriting.net/" href="http://www.urlrewriting.net/" target="_blank"&gt;http://www.urlrewriting.net/&lt;/a&gt;, ya que sólo adjuntas la dll, que contiene el nuevo HttpModule, lo registras en el web.config, agregas la siguientes configuración:&lt;/p&gt; &lt;div&gt; &lt;div style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;   1:&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;urlrewritingnet&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;rewriteOnlyVirtualUrls&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;true&amp;quot;&lt;/span&gt; &lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;   2:&lt;/span&gt;                    &lt;span style="color:#ff0000;"&gt;contextItemsPrefix&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;QueryString&amp;quot;&lt;/span&gt; &lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;   3:&lt;/span&gt;                    &lt;span style="color:#ff0000;"&gt;defaultPage&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;default.aspx&amp;quot;&lt;/span&gt; &lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;   4:&lt;/span&gt;                    &lt;span style="color:#ff0000;"&gt;defaultProvider&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;RegEx&amp;quot;&lt;/span&gt; &lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;   5:&lt;/span&gt;                    &lt;span style="color:#ff0000;"&gt;xmlns&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;http://www.urlrewriting.net/schemas/config/2006/07&amp;quot;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;   6:&lt;/span&gt;         &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;rewrites&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;   7:&lt;/span&gt;             &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;add&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;name&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;Rewrite&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;virtualUrl&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;^~/Noticias/ShowNoticia(.*).aspx&amp;quot;&lt;/span&gt; &lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;   8:&lt;/span&gt;            &lt;span style="color:#ff0000;"&gt;rewriteUrlParameter&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;ExcludeFromClientQueryString&amp;quot;&lt;/span&gt; &lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;   9:&lt;/span&gt;            &lt;span style="color:#ff0000;"&gt;destinationUrl&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;~/Noticia/vernoticia.aspx?codNot=$1&amp;quot;&lt;/span&gt; &lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  10:&lt;/span&gt;            &lt;span style="color:#ff0000;"&gt;ignoreCase&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;true&amp;quot;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  11:&lt;/span&gt;         &lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;rewrites&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  12:&lt;/span&gt;     &lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;urlrewritingnet&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;Y listo, ahora ya tienes lo siguiente:&lt;/p&gt;
&lt;p&gt;&lt;img src="http://galeon.com/solocodigo/images/blog/2007/11_Nov/30_Url.jpg" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;Esto es lo más simple que podemos hacer, ya que con expresiones regulares se pueden hacer otras marcianadas para ocultar la identificación de un posible parámetro.&lt;/p&gt;
&lt;p&gt;Algunas de las features de &lt;a title="http://www.urlrewriting.net/" href="http://www.urlrewriting.net/" target="_blank"&gt;http://www.urlrewriting.net/&lt;/a&gt;, son las siguientes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Rewriting Urls based on regular expressions&lt;/li&gt;
&lt;li&gt;Support for Themes and Master Pages&lt;/li&gt;
&lt;li&gt;Support for OutputCacheing&lt;/li&gt;
&lt;li&gt;Use in medium trust level environments (shared hosting) possible&lt;/li&gt;
&lt;li&gt;Consistent Url after post back&lt;/li&gt;
&lt;li&gt;Adding own rewrite rule providers possible&lt;/li&gt;
&lt;li&gt;Redirects (also permanent) to other domains or websites possible&lt;/li&gt;
&lt;li&gt;Support for Cookie less Sessions&lt;/li&gt;
&lt;li&gt;Adding rewrite rules on runtime&lt;/li&gt;
&lt;li&gt;Very easy installation and use&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;La documentación, sobre todo los elementos disponibles en el web.config, lo encontramos en el siguiente link: &lt;a href="http://www.urlrewriting.net/en/Config.aspx" target="_blank"&gt;UrlRewritingNet.UrlRewrite - Configuration&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Por cierto en ASP.NET 2.0 tenemos &lt;a target="_blank"&gt;URL Mapping&lt;/a&gt;, pero como dicen en el artículo con la limitante de no poder usar expresiones regulares, ah y no se pierdan esta entrada del gran ScottGu&amp;#39;s: &lt;a href="http://weblogs.asp.net/scottgu/archive/2007/02/26/tip-trick-url-rewriting-with-asp-net.aspx" target="_blank"&gt;Tip/Trick: Url Rewriting with ASP.NET&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Saludos,&lt;/p&gt;
&lt;br /&gt;Post cruzado&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=53936" width="1" height="1"&gt;</description><category domain="http://geeks.ms/blogs/sergiotarrillo/archive/tags/ASP.NET/default.aspx">ASP.NET</category><category domain="http://geeks.ms/blogs/sergiotarrillo/archive/tags/Best+Practices/default.aspx">Best Practices</category></item><item><title>Serie de articulos: Cazando mitos en ADO.NET</title><link>http://geeks.ms/blogs/sergiotarrillo/archive/2007/11/15/50355.aspx</link><pubDate>Thu, 15 Nov 2007 16:18:30 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:50355</guid><dc:creator>Sergio Tarrillo</dc:creator><slash:comments>1</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/sergiotarrillo/rsscomments.aspx?PostID=50355</wfw:commentRss><comments>http://geeks.ms/blogs/sergiotarrillo/archive/2007/11/15/50355.aspx#comments</comments><description>&lt;p&gt;El título también pudo ser: &amp;quot;Serie de artículos: Destripando a ADO.NET&amp;quot;, pero creo que no se leía bien :S.&lt;/p&gt; &lt;p&gt;Excelente serie de Artículos del amigo &lt;a href="http://msmvps.com/blogs/cwalzer/default.aspx" target="_blank"&gt;Carlos Walzer&lt;/a&gt;:&lt;/p&gt; &lt;ol&gt; &lt;li&gt;&lt;a href="http://msmvps.com/blogs/cwalzer/archive/2007/09/24/anti-pr-225-cticas-i-acceso-a-datos-con-ado-net.aspx" target="_blank"&gt;Anti Prácticas .NET: Lectura de Datos con ADO.NET&lt;/a&gt;. En esta entrada se resuelve el mito:&amp;nbsp;&amp;nbsp;&lt;i&gt;&amp;quot;El DataReader es más rápido que un DataSet&lt;/i&gt;&amp;quot;. Se muestra a detalle un versus del uso de DataSet vs DataTable vs DataReader, los tiempos que demoran los queries, y&amp;nbsp;como podemos optimizarlos. Esto último hay que resaltarlo bastante, si bien estamos tras la caza de un mito, también podemos ir tras los mitos de nuestras propias aplicaciones y ver el porqué de los cuellos de botella.&lt;/li&gt; &lt;li&gt;&lt;a href="http://msmvps.com/blogs/cwalzer/archive/2007/10/30/antipracticasnetlecturaadonet2.aspx" target="_blank"&gt;Anti Prácticas .NET: Lectura de Datos con ADO.NET II&lt;/a&gt;. El mismo artículo, pero a mi pedido agregando ahora Lista genérica para pasarlo entre las capas, y compararlo con los técnicas usados en el artículo anterior.&lt;/li&gt; &lt;li&gt;&lt;a href="http://msmvps.com/blogs/cwalzer/archive/2007/11/12/antipracticaslecturadatosnet3.aspx" target="_blank"&gt;Anti Prácticas .NET: Lectura de Datos con ADO.NET III&lt;/a&gt;. En este artículo se agrega el uso del asistente de Visual Studio y crear un DataSet tipificado para acceder a la data. Además se muestra un resumen comparativo en tiempos del uso de las diversas técnicas, y se hacen algunas conclusiones.&lt;/li&gt;&lt;/ol&gt; &lt;p&gt;Para los artículos Carlos, utilizo la herramienta &lt;a href="http://www.jetbrains.com/profiler/" target="_blank"&gt;dotTrace 3.0&lt;/a&gt;, otra herramienta que podríamos usar pero con distintas features, es el &lt;a href="http://geeks.ms/blogs/sergiotarrillo/archive/2007/04/13/13155.aspx" target="_blank"&gt;Profiler de Visual Studio&lt;/a&gt;. Por cierto,&amp;nbsp;&lt;a href="http://www.jetbrains.com/profiler/" target="_blank"&gt;dotTrace 3.0&lt;/a&gt; es una herramienta, aquí&amp;nbsp;su &lt;a href="http://www.jetbrains.com/profiler/features/index.html" target="_blank"&gt;lista de las features&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;P.D.: Interesante serie, no se la pierdan.&lt;/p&gt; &lt;p&gt;Saludos,&lt;/p&gt;
&lt;br /&gt;Post cruzado&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=50355" width="1" height="1"&gt;</description><category domain="http://geeks.ms/blogs/sergiotarrillo/archive/tags/Visual+Studio/default.aspx">Visual Studio</category><category domain="http://geeks.ms/blogs/sergiotarrillo/archive/tags/Ado.NET/default.aspx">Ado.NET</category><category domain="http://geeks.ms/blogs/sergiotarrillo/archive/tags/Best+Practices/default.aspx">Best Practices</category></item><item><title>Validation Application Block en el Enterprise Library 3.1</title><link>http://geeks.ms/blogs/sergiotarrillo/archive/2007/08/03/25245.aspx</link><pubDate>Fri, 03 Aug 2007 10:57:08 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:25245</guid><dc:creator>Sergio Tarrillo</dc:creator><slash:comments>2</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/sergiotarrillo/rsscomments.aspx?PostID=25245</wfw:commentRss><comments>http://geeks.ms/blogs/sergiotarrillo/archive/2007/08/03/25245.aspx#comments</comments><description>&lt;p&gt;Estaba revisando la presentación, léase&amp;nbsp;ppt,&amp;nbsp;de las&amp;nbsp;&lt;a href="http://download.microsoft.com/download/b/2/2/b22eb038-fa47-4f5e-ac70-5e17d8db55aa/enterprise%20library%203.0%20-%20whats%20new.ppt" target="_blank"&gt;novedades en el Enterprise Library 3.x&lt;/a&gt;, y lo que más me llamo la atención, en esta corta&amp;nbsp;revisión, es el &lt;a target="_blank"&gt;Validation Application Block&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;Puedes usar validaciones de tres formas:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;Usando atributos, si, puedes agregar los atributos a tus entidades de negocio, por ejemplo si tuvieras la entidad Usuario, y tuviera la propiedad Email, quedaría así:&lt;br /&gt;&lt;/li&gt; &lt;div&gt; &lt;div style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;   1:&lt;/span&gt; [RegexValidator(&lt;span style="color:#006080;"&gt;@&amp;quot;\w+([-+.&amp;#39;]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*&amp;quot;&lt;/span&gt;, MessageTemplate=&lt;span style="color:#006080;"&gt;&amp;quot;Invalid e-mail address&amp;quot;&lt;/span&gt;, &lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;   2:&lt;/span&gt;     Ruleset=&lt;span style="color:#006080;"&gt;&amp;quot;RuleSetA&amp;quot;&lt;/span&gt;)]&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;   3:&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; Email&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;   4:&lt;/span&gt; {&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;   5:&lt;/span&gt;     get { &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; email; }&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;   6:&lt;/span&gt;     set { email = &lt;span style="color:#0000ff;"&gt;value&lt;/span&gt;; }&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;   7:&lt;/span&gt; }&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;li&gt;También lo podemos configurar, desde Enterprise Library Configuration.*&lt;/li&gt;
&lt;li&gt;O también hacerlo programáticamente.&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;*Otra novedad interesante es que el &lt;a href="http://msdn2.microsoft.com/en-us/library/aa480453.aspx" target="_blank"&gt;Enterprise Library 3.X&lt;/a&gt;, se integra en el IDE de Visual Studio 2005:&lt;/p&gt;
&lt;p&gt;&lt;img src="http://galeon.com/solocodigo/images/blog/2007/08_Agosto/03_EntLib.jpg" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;Y desde Visual Studio configurar todo:&lt;/p&gt;
&lt;p&gt;&lt;img src="http://galeon.com/solocodigo/images/blog/2007/08_Agosto/03_VS.jpg" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;El Validation Application&amp;nbsp;Block, además se integra con WinForms, ASP.NET o WCF. Estas últimas&amp;nbsp;son cosas que tengo que probar aún, pero no quería dejar de enviar este post, con un pequeño overview que tuve de este Application Block, que por lo que se pinta promete mucho :). Aunque en este momento,&amp;nbsp;estoy en un dilema, de&amp;nbsp;si seguir revisando el VAB, o ir a dormir un par de horas por lo menos, antes de salir a la oficina :S (son las 05:58 a.m. :S), tengo miedo de&amp;nbsp;ya no despertar&amp;nbsp;:$, pero si voy a llegar tarde, que sea posteando :).&lt;/p&gt;
&lt;p&gt;Otros Links:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://msdn2.microsoft.com/en-us/library/aa480453.aspx" target="_blank"&gt;Enterprise Library&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://msdn2.microsoft.com/en-us/library/bb410105.aspx" target="_blank"&gt;Validation Application Block&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://download.microsoft.com/download/b/2/2/b22eb038-fa47-4f5e-ac70-5e17d8db55aa/enterprise%20library%203.0%20-%20whats%20new.ppt" target="_blank"&gt;What&amp;#39;s New in Enterprise Library 3.x&lt;/a&gt;&amp;nbsp;(ppt)&lt;/li&gt;
&lt;li&gt;&lt;a href="http://download.microsoft.com/download/b/2/2/b22eb038-fa47-4f5e-ac70-5e17d8db55aa/enterprise%20library%203.0%20overview.ppt" target="_blank"&gt;Enterprise Library 3.x: Overview&lt;/a&gt;&amp;nbsp;(ppt)&lt;/li&gt;
&lt;li&gt;&lt;a href="http://msevents.microsoft.com/cui/eventdetail.aspx?eventid=1032331979&amp;amp;culture=en-us" target="_blank"&gt;New Capabilities in Enterprise Library 3.x&lt;/a&gt;&amp;nbsp;(webcast)&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;Saludos,&lt;/p&gt;
&lt;br /&gt;Post cruzado&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=25245" width="1" height="1"&gt;</description><category domain="http://geeks.ms/blogs/sergiotarrillo/archive/tags/ASP.NET/default.aspx">ASP.NET</category><category domain="http://geeks.ms/blogs/sergiotarrillo/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://geeks.ms/blogs/sergiotarrillo/archive/tags/Visual+Studio/default.aspx">Visual Studio</category><category domain="http://geeks.ms/blogs/sergiotarrillo/archive/tags/Best+Practices/default.aspx">Best Practices</category><category domain="http://geeks.ms/blogs/sergiotarrillo/archive/tags/WCF/default.aspx">WCF</category><category domain="http://geeks.ms/blogs/sergiotarrillo/archive/tags/developer_2B002B00_/default.aspx">developer++</category></item><item><title>usas SQL Profiler?</title><link>http://geeks.ms/blogs/sergiotarrillo/archive/2007/07/07/19011.aspx</link><pubDate>Sat, 07 Jul 2007 07:28:52 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:19011</guid><dc:creator>Sergio Tarrillo</dc:creator><slash:comments>11</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/sergiotarrillo/rsscomments.aspx?PostID=19011</wfw:commentRss><comments>http://geeks.ms/blogs/sergiotarrillo/archive/2007/07/07/19011.aspx#comments</comments><description>&lt;p&gt;Básico, en un ambiente de desarrollo y parece que en mantenimiento también. Siempre ante cualquier marcianada que suceda en la aplicación, como por ejemplo,&amp;nbsp;que has hecho&amp;nbsp;una paginación optimizada, pero no se muestra data :S. En esos casos,&amp;nbsp;mi última opción es depurar la aplicación. La primera opción es sacarla al &amp;quot;ojo&amp;quot; :D, al muy estilo de algunos retos de &lt;a href="http://geeks.ms/blogs/programancia101/default.aspx" target="_blank"&gt;programancia101&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;Si tienes una solución con unos cuantos proyectos, no cuesta nada depurar. Pero si tienes una solución un poco más compleja en capas, y con varios módulos. La opción de depuración se pone un poco más pesadita. Imagina que ya terminaste de hacer todas tus capas de componentes, y terminaste la capa final de presentación, pero por cuestiones del destino tu GridView con paginación optimizada no funciona. Entonces te echas&amp;nbsp;a depurar esperas que compile, que cargue el navegador, empiezas a depurar, y aunque uses el &lt;a href="http://geeks.ms/blogs/sergiotarrillo/archive/2007/02/03/9713.aspx" target="_blank"&gt;QuickWatch de Visual Studio&lt;/a&gt;, tienes que irte hasta la última capa, para darte cuenta que te faltaba un parámetro, que hiciste mal una conversión, que un dato iba un null, y todo lo que normalmente pasa, si no, &lt;a href="http://www.youtube.com/watch?v=k3cK1RRDm70" target="_blank"&gt;que levanten la mano&lt;/a&gt; los que han depurado y se encontraron que por copiar procesos, se olvidaron de cambiar el nombre del SPs, hasta el copy/paste hay que saberlo hacer :).&lt;/p&gt; &lt;p&gt;Pero como hacemos para aproximarnos a una depuración al &amp;quot;ojo&amp;quot;?.&amp;nbsp;En&amp;nbsp;un anterior proyecto en&amp;nbsp;&lt;a href="http://www.3devnet.com/" target="_blank"&gt;3Dev&lt;/a&gt;,&amp;nbsp;me inculcaron el uso de &lt;strong&gt;SQL Profiler&lt;/strong&gt;, y bueno actualmente es imposible dejar de usarlo. Sobretodo si quieres ahorrarte tiempo y esfuerzo para ubicar el problema. Pero, que&amp;nbsp;se puede hacer con &lt;strong&gt;SQL Profiler&lt;/strong&gt;?, en cuanto a&amp;nbsp;cosas básicas para depurar:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;Ver si se ejecuto o no la llamada a&amp;nbsp;un StoreProcedure.&lt;/li&gt; &lt;li&gt;Ver los valores de los parámetros de un StoreProcedure.&lt;/li&gt; &lt;li&gt;Verificar la consulta generada en el Management Studio.&lt;/li&gt; &lt;li&gt;Ver las llamadas que hace tu app al SQL.&lt;/li&gt; &lt;li&gt;Y otras cosas más.&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;Algunas pantallazos:&lt;/p&gt; &lt;p&gt;&lt;img src="http://galeon.com/solocodigo/images/blog/2007/07_Julio/07_PagSimple.JPG" alt="" /&gt;&lt;/p&gt; &lt;p&gt;En la pantalla superior podemos apreciar que efectivamente, se llegaron a&amp;nbsp;realizar las llamadas a los SPs, y no se quedo en la aplicación. También podemos apreciar cada llamada que ha tenido nuestro servidor de SQL, ya sea un SP o una consulta T-SQL, además de los parámetros enviados.&lt;/p&gt; &lt;p&gt;&lt;img src="http://galeon.com/solocodigo/images/blog/2007/07_Julio/07_PagOptim.JPG" alt="" /&gt;&lt;/p&gt; &lt;p&gt;A diferencia de la pantalla de arriba, acá podemos ver una paginación optimizada, y también podemos comparar las duración de cada consulta. También podemos copiar el código generado,&amp;nbsp;ejecutarlo y verificar el porque del problema.&lt;/p&gt; &lt;p&gt;Otro punto a tener en cuenta es, si bien en un ambiente de desarrollo podemos usar Visual Studio 2005 para depurar, que pasa en un ambiente de pruebas, donde sólo tenemos SQL y IIS?, y sobre todo más cuando sabes que en el server de prueba, es cuando recién aparecen los problemas :D.&lt;/p&gt; &lt;p&gt;Además de las ventajas que le puede dar al desarrollador, hay otras&amp;nbsp;fumadas que se pueden hacer&amp;nbsp;con &lt;strong&gt;SQL Profiler&lt;/strong&gt;:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;&lt;a href="http://oasis-luisenrique.blogspot.com/2006/02/sql-que-podemos-hacer-con-el-sql.html" target="_blank"&gt;SQL: Que podemos hacer con el SQL Profiler&lt;/a&gt;&lt;/li&gt; &lt;li&gt;&lt;a href="http://eugeserrano.wordpress.com/2006/12/24/optimizando-aplicaciones/" target="_blank"&gt;Optimizando aplicaciones&lt;/a&gt;&lt;/li&gt; &lt;li&gt;&lt;a href="http://www.developer.com/db/article.php/3482216" target="_blank"&gt;Introduction to SQL Profiler&lt;/a&gt;&lt;/li&gt; &lt;li&gt;&lt;a href="http://www.developer.com/db/article.php/10920_3490086_1" target="_blank"&gt;SQL Profiler Tips and Tricks&lt;/a&gt;&lt;/li&gt; &lt;li&gt;&lt;a href="http://msdn2.microsoft.com/en-us/library/ms979207.aspx" target="_blank"&gt;How To: Use SQL Profiler&lt;/a&gt;&lt;/li&gt; &lt;li&gt;&lt;a href="http://msdn2.microsoft.com/en-us/library/ms187929.aspx" target="_blank"&gt;Using SQL Server Profiler&lt;/a&gt;&lt;/li&gt; &lt;li&gt;&lt;a href="http://msdn2.microsoft.com/en-us/library/ms173757.aspx" target="_blank"&gt;SQL Server Profiler Reference&lt;/a&gt;&lt;/li&gt; &lt;li&gt;&lt;a href="http://technet.microsoft.com/es-es/library/ms175848.aspx" target="_blank"&gt;Ver y analizar trazas con el Analizador de SQL&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;P.D.: Traten de que la depuración con Visual Studio sea la última opción, sobre todo para soluciones con proyectos grandes, para mi es una tarea fastidiosa, aunque a veces necesaria, pero se puede evitar con herramientas como esta. Sólo es cuestión de acostumbrarse, verán que algún momento ante una pantalla no esperada, lo primero que harán será ir al profiler, en lugar depurar la aplicación :). Y bueno no te ahorras &amp;quot;el tiempo&amp;quot; que gastarías en depuración, pero esto sumado a otras cosas más, como adquirir mejores máquinas, aumentar la concentración, puede sumar y disminuir unos días de ineficiencia, sobre todo en un mes crítico como este, bueno para mi :D. Por cierto, debido a estro parece que sólo estare posteando los fines de semana :), hay mucha información que compartir y algunos anéctodas, del trabajo que contar, pero trato de tener los títulos anotados, así que algún día los contare :).&lt;/p&gt; &lt;p&gt;Saludos, desde Lima, con mucho frío por cierto.&lt;/p&gt;
&lt;br /&gt; Post cruzado &lt;a target="_blank" href="http://blogs.3devnet.com/blogs/default.aspx"&gt;3Dev Blogs&lt;/a&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=19011" width="1" height="1"&gt;</description><category domain="http://geeks.ms/blogs/sergiotarrillo/archive/tags/SQL+Server/default.aspx">SQL Server</category><category domain="http://geeks.ms/blogs/sergiotarrillo/archive/tags/Best+Practices/default.aspx">Best Practices</category></item><item><title>accesibilidad y shortcuts en ASP.NET 2.0</title><link>http://geeks.ms/blogs/sergiotarrillo/archive/2007/06/18/16268.aspx</link><pubDate>Tue, 19 Jun 2007 03:40:06 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:16268</guid><dc:creator>Sergio Tarrillo</dc:creator><slash:comments>1</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/sergiotarrillo/rsscomments.aspx?PostID=16268</wfw:commentRss><comments>http://geeks.ms/blogs/sergiotarrillo/archive/2007/06/18/16268.aspx#comments</comments><description>&lt;p&gt;accesibilidad es todo un tema, voy a dejar abajo&amp;nbsp;varios links como referencia. En este post, lo vamos a ver más orientado al mundo del &amp;quot;business&amp;quot;.&lt;/p&gt; &lt;p&gt;Una pregunta para iniciar el post: &amp;quot;cuando&amp;nbsp;se van&amp;nbsp;comprar algo,&amp;nbsp;les gusta que la cajera(o) se demore?, personalmente no me gusta esperar mucho por algún servicio, menos hacer cola salvo que sea necesario, prefiero ir tarde a hacer algún trámite porque todos van temprano, en fin, son gustos. Dejando los gustos, cuantos clientes perdemos por se retiran antes de que sean atendidos?, cuanto dinero se pierde?, en &lt;a href="http://www.gartner.com" target="_blank"&gt;Gartner&lt;/a&gt; debe haber varias investigaciones sobre esto, pero ahora al post:&lt;/p&gt; &lt;p&gt;Un cajero rápido, podrá ser rápido con esta pantalla?:&lt;/p&gt; &lt;p&gt;&lt;img src="http://galeon.com/solocodigo/images/blog/2007/06_Junio/18_anteacce.JPG" alt="" /&gt;&lt;/p&gt; &lt;p&gt;Y no pensar, que pasa si malogra el mouse, y tiene 10 personas&amp;nbsp;en la cola esperando, fácil que te demandan por hacer esa pantalla. Y eso que esta pantalla es simple, imaginen un maestro de contactos o una guía de remisión.&lt;/p&gt; &lt;p&gt;En &lt;strong&gt;ASP.NET 2.0&lt;/strong&gt; hay algunas características de accesibilidad, y shortcuts que podemos utilizar:&lt;/p&gt; &lt;p&gt;&lt;img src="http://galeon.com/solocodigo/images/blog/2007/06_Junio/18_shortcuts.JPG" alt="" /&gt;&lt;/p&gt; &lt;p&gt;Lo primero que podemos aprovechar es asociar los botones a un &lt;strong&gt;AccessKey&lt;/strong&gt;, lo que no he podido hacer directamente es colocarle el subrayado, pero se puede suplantar por una pequeña leyenda los &lt;strong&gt;shortcuts&lt;/strong&gt;. Ahora en &lt;strong&gt;Internet Explorer&lt;/strong&gt;, basta con hacer &lt;strong&gt;Alt+N&lt;/strong&gt;, pero &lt;strong&gt;Firefox&lt;/strong&gt; debemos hacer &lt;strong&gt;Alt+Shift+N&lt;/strong&gt;, y para evitar poner dos mensajes se puede poner sólo&amp;nbsp;&lt;strong&gt;Alt+Shift&lt;/strong&gt;, porque igual funciona para los dos navegadores. Si el control esta deshabilitado el shortcut no funciona:&lt;/p&gt; &lt;p&gt;&lt;font face="Courier New" color="#800000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;asp:&lt;strong&gt;Button&lt;/strong&gt; ID=&amp;quot;&lt;strong&gt;btnNuevo&lt;/strong&gt;&amp;quot; runat=&amp;quot;server&amp;quot; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;strong&gt;AccessKey&lt;/strong&gt;=&amp;quot;N&amp;quot; Text=&amp;quot;Nuevo&amp;quot; /&amp;gt;&lt;/font&gt;&lt;/p&gt; &lt;p&gt;Otra cosa que podemos aprovechar en los &lt;strong&gt;Labels&lt;/strong&gt;, además de los &lt;strong&gt;AccessKey&lt;/strong&gt; es la propiedad &lt;strong&gt;AssociatedControlID&lt;/strong&gt;, con esta propiedad podemos asociarlo a un control, en nuestro&amp;nbsp;ejmplo&amp;nbsp;al control TextBox. De tal manera que cuando presione el shortcut &lt;strong&gt;Alt+Shift+o&lt;/strong&gt;, el foco se coloque dentro del control &lt;strong&gt;txtNombre&lt;/strong&gt;, ó&amp;nbsp;también sólo bastaría con hacer clic encima del label Edad, y el foco se iría al control &lt;strong&gt;txtEdad&lt;/strong&gt;:&lt;/p&gt; &lt;p&gt;&lt;font face="Courier New" color="#800000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;asp:&lt;strong&gt;Label&lt;/strong&gt; ID=&amp;quot;&lt;strong&gt;Label1&lt;/strong&gt;&amp;quot; runat=&amp;quot;server&amp;quot;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;strong&gt;AccessKey&lt;/strong&gt;=&amp;quot;o&amp;quot; Text=&amp;quot;N&amp;lt;u&amp;gt;o&amp;lt;/u&amp;gt;mbre&amp;quot;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;strong&gt;AssociatedControlID&lt;/strong&gt;=&amp;quot;txtNombre&amp;quot; /&amp;gt;&lt;/font&gt; &lt;p&gt;Otros links de referencia:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;&lt;a href="http://devauthority.com/blogs/simoneb/archive/2006/05/17/1055.aspx" target="_blank"&gt;The AssociatedControlID property of the Label web control&lt;/a&gt;&lt;/li&gt; &lt;li&gt;&lt;a href="http://www.15seconds.com/issue/040727.htm" target="_blank"&gt;Accessibility Improvements in ASP.NET 2.0&lt;/a&gt;&lt;/li&gt; &lt;li&gt;&lt;a href="http://msdn2.microsoft.com/es-es/library/system.web.ui.webcontrols.label.associatedcontrolid(VS.80).aspx" target="_blank"&gt;Label.AssociatedControlID (Propiedad)&lt;/a&gt;&lt;/li&gt; &lt;li&gt;&lt;a href="http://msdn2.microsoft.com/es-es/library/system.web.ui.webcontrols.webcontrol.accesskey(VS.80).aspx" target="_blank"&gt;WebControl.AccessKey (Propiedad)&lt;/a&gt;&lt;/li&gt; &lt;li&gt;&lt;a href="http://msdn2.microsoft.com/es-es/library/ms227996(VS.80).aspx" target="_blank"&gt;Controles y accesibilidad en ASP.NET&lt;/a&gt;&lt;/li&gt; &lt;li&gt;&lt;a href="http://www.microsoft.com/spanish/msdn/articulos/archivo/100904/voices/acsaraf1.asp" target="_blank"&gt;Cómo conseguir que un sitio Web ASP.NET sea accesible (artículos técnicos sobre ASP.NET)&lt;/a&gt;&lt;/li&gt; &lt;li&gt;&lt;a href="http://msdn2.microsoft.com/es-es/library/ms228004(VS.80).aspx" target="_blank"&gt;Compatibilidad de accesibilidad en ASP.NET&lt;/a&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;&lt;a href="http://msdn.microsoft.com/msdnmag/issues/07/04/ASPNET20/default.aspx?loc=es" target="_blank"&gt;Aplicación de estándares web para una mejor accesibilidad&lt;/a&gt;&lt;/li&gt; &lt;li&gt;&lt;a href="http://msdn2.microsoft.com/es-es/library/3has1x30(vs.80).aspx" target="_blank"&gt;Tutorial: Crear una aplicación Web accesible&lt;/a&gt;&lt;/li&gt; &lt;li&gt;&lt;a href="http://msdn2.microsoft.com/en-US/library/aa291312(VS.71).aspx" target="_blank"&gt;Accessibility Design Guidelines for the Web&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;P.D.: Recuerden que lo que están desarrollando no lo van usar ustedes, si no, personas que no son expertas en software, y en muchos casos su aplicación podría ser el primer contacto que tienen con las PCs.&lt;/p&gt; &lt;p&gt;Saludos,&lt;/p&gt;
&lt;br /&gt; Post cruzado &lt;a target="_blank" href="http://blogs.3devnet.com/blogs/default.aspx"&gt;3Dev Blogs&lt;/a&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=16268" width="1" height="1"&gt;</description><category domain="http://geeks.ms/blogs/sergiotarrillo/archive/tags/ASP.NET/default.aspx">ASP.NET</category><category domain="http://geeks.ms/blogs/sergiotarrillo/archive/tags/Best+Practices/default.aspx">Best Practices</category><category domain="http://geeks.ms/blogs/sergiotarrillo/archive/tags/Web/default.aspx">Web</category></item><item><title>Demos atrasadas del MS Andean Web Days (sesion ASP.NET AJAX)</title><link>http://geeks.ms/blogs/sergiotarrillo/archive/2007/04/14/13173.aspx</link><pubDate>Sat, 14 Apr 2007 17:13:00 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:13173</guid><dc:creator>Sergio Tarrillo</dc:creator><slash:comments>1</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/sergiotarrillo/rsscomments.aspx?PostID=13173</wfw:commentRss><comments>http://geeks.ms/blogs/sergiotarrillo/archive/2007/04/14/13173.aspx#comments</comments><description>&lt;P&gt;Como saben el mes pasado &lt;A href="http://geeks.ms/blogs/sergiotarrillo/archive/2007/04/02/12690.aspx" target=_blank&gt;participe&lt;/A&gt; en el &lt;A href="http://geeks.ms/blogs/sergiotarrillo/archive/2007/03/22/12130.aspx" target=_blank&gt;MS Andean Web Days&lt;/A&gt;, en la sesión de ASP.NET AJAX Extensions, en la cual básicamente se trato sobre buenas prácticas en el uso de ASP.NET AJAX, además de implementaciones de patrones AJAX (&lt;A href="http://ajaxpatterns.org/" target=_blank&gt;ajax patterns&lt;/A&gt;)&amp;nbsp;con &lt;A href="http://ajax.asp.net/" target=_blank&gt;ASP.NET AJAX&lt;/A&gt;. &lt;/P&gt;
&lt;P&gt;Las demos la pueden descargar de la &lt;A href="http://www.3devnet.com/download.aspx" target=_blank&gt;Zona de Descarga de 3Dev&lt;/A&gt;, y también desde los siguientes links: &lt;A href="http://www.3devnet.com/download/ASPNETAJAX_Slides.pdf" target=_blank&gt;Slides&lt;/A&gt;, y &lt;A href="http://www.3devnet.com/download/ASPNETAJAX_Demos.zip" target=_blank&gt;Demos&lt;/A&gt;.&lt;/P&gt;
&lt;P&gt;Pasos para restaurar demos:&lt;/P&gt;
&lt;OL&gt;
&lt;LI&gt;Restaurar la base de datos: dentro de la carpeta CrearBaseDatos se encuentran &lt;STRONG&gt;dos archivos&lt;/STRONG&gt;, uno crea todos los objetos de la base de datos Tablas, y Store Procedures, y en el otro archivo esta la data de la base de datos. 
&lt;LI&gt;Abrir la aplicación &lt;STRONG&gt;slnPeruGeeks_Base&lt;/STRONG&gt;, dentro de ella se encuentra la solución completa del proyecto. En el caso de que sólo tenga instalado &lt;A href="http://msdn.microsoft.com/vstudio/express/vwd/" target=_blank&gt;Visual Web Developer Express&lt;/A&gt;, que es una herramienta gratuita, sólo abrir la carpeta del sitio Web. 
&lt;LI&gt;Cambiar la cadena de conexión de la base de datos, en el archivo &lt;STRONG&gt;web.config&lt;/STRONG&gt;.&amp;nbsp; 
&lt;LI&gt;En cada carpeta &lt;STRONG&gt;aspx_demo0N&lt;/STRONG&gt;, se encuentra las páginas de las demos respectivas. Sólo tenemos que adjuntar estos archivos a la solución del proyecto, y en algunos casos sobrescribir las ya existentes.&lt;/LI&gt;&lt;/OL&gt;
&lt;P&gt;Descripción de las demos:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;STRONG&gt;Demo01&lt;/STRONG&gt;: En esta primera demo se muestra el funcionamiento básico de &lt;A href="http://ajax.asp.net/" target=_blank&gt;ASP.NET AJAX&lt;/A&gt;, en una maestro/detalle, a través de los controles &lt;STRONG&gt;UpdatePanel&lt;/STRONG&gt; y &lt;STRONG&gt;UpdateProgress&lt;/STRONG&gt;,&amp;nbsp;se trabaja con los objetos &lt;STRONG&gt;Triggers&lt;/STRONG&gt; del control UpdatePanel, para forzar una actualización provocada por un evento fuera del UpdatePanel, también se resalta el concepto de usar múltiples updatePanels cuando sea necesario. Además, en esta primera demo se implementa el patrón &lt;A href="http://ajaxpatterns.org/Update_Control" target=_blank&gt;Update Control&lt;/A&gt;, y el patrón &lt;A href="http://ajaxpatterns.org/Progress_Indicator" target=_blank&gt;Progress Indicator&lt;/A&gt;:&lt;BR&gt;&lt;IMG src="http://galeon.com/solocodigo/images/blog/2007/04_Abril/14_demo01.JPG"&gt;&lt;BR&gt;
&lt;LI&gt;&lt;STRONG&gt;Demo02&lt;/STRONG&gt;: La primera parte de la segunda demo, trata sobre el uso de algunos controles de validación del &lt;A href="http://ajax.asp.net/ajaxtoolkit/" target=_blank&gt;Ajax Control Toolkit&lt;/A&gt;:&lt;BR&gt;&lt;IMG src="http://galeon.com/solocodigo/images/blog/2007/04_Abril/14_demo020.JPG"&gt;&lt;BR&gt;&lt;BR&gt;La segunda parte de la demo, esta demo es bravaza :D, es un formulario de búsqueda de noticias. Y lo bravazo, no es la búsqueda en si,&amp;nbsp;si no, que al tipiar alguna letra en la caja de texto te da sugerencia de títulos, y no cualquier título sino títulos desde la base de datos misma, por cierto para esto se usa un Servicio Web, hay que verlo en vivo para ver la espectacularidad. Una vez encontrado el título, podemos ver el detalle de la noticia, el cuál se desvanece para mostrar la siguiente noticia. En este caso se ha usado el control &lt;A href="http://ajax.asp.net/ajaxtoolkit/AutoComplete/AutoComplete.aspx" target=_blank&gt;AutoComplete&lt;/A&gt;, y el control &lt;A href="http://ajax.asp.net/ajaxtoolkit/UpdatePanelAnimation/UpdatePanelAnimation.aspx" target=_blank&gt;UpdatePanelAnimation&lt;/A&gt; del &lt;A href="http://ajax.asp.net/ajaxtoolkit/"&gt;Ajax Control Toolkit&lt;/A&gt;, y hemos logrado implementar el patrón &lt;A href="http://ajaxpatterns.org/Suggestion" target=_blank&gt;Suggestion&lt;/A&gt; y el patrón &lt;A href="http://ajaxpatterns.org/One-Second_Spotlight" target=_blank&gt;One-Second Spotlight&lt;/A&gt;:&lt;BR&gt;&lt;IMG src="http://galeon.com/solocodigo/images/blog/2007/04_Abril/14_demo025.JPG"&gt;&lt;BR&gt;
&lt;LI&gt;&lt;STRONG&gt;Demo03&lt;/STRONG&gt;: En la primera parte usamos control extender de ASP.NET, además de implementar el patrón &lt;A href="http://ajaxpatterns.org/Popup" target=_blank&gt;PopUp&lt;/A&gt;:&lt;BR&gt;&lt;IMG src="http://galeon.com/solocodigo/images/blog/2007/04_Abril/14_Demo030.JPG"&gt;&lt;BR&gt;En la segunda parte se muestra como llamar a un Web Service (con&amp;nbsp;consultas a base de datos)&amp;nbsp;desde JavaScript, en este caso se puede apreciar un ejemplo sencillo de como traer un tipo simple, y también un ejemplo de como traer un tipo más complejo como un arreglo:&lt;BR&gt;&lt;IMG src="http://galeon.com/solocodigo/images/blog/2007/04_Abril/14_Demo035.JPG"&gt;&lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;Si quieren implementar más patrones, en el &lt;A href="http://ajax.asp.net/ajaxtoolkit/" target=_blank&gt;Ajax Control Toolkit&lt;/A&gt;, podrán encontrar algunos ya construidos, y si no podemos crear nuestro propio control&amp;nbsp;extender, extendiendo algún control existente de ASP.NET con &lt;A href="http://ajax.asp.net/" target=_blank&gt;ASP.NET AJAX&lt;/A&gt;.&lt;/P&gt;
&lt;P&gt;Por cierto no es que me haya demorado en publicar las demos, lo que pasa es que el tiempo pasa muy rápido :D. Y esta demás decir que cualquier duda sobre las demos, la pueden dejar en este post :).&lt;/P&gt;
&lt;P&gt;Saludos,&lt;/P&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=13173" width="1" height="1"&gt;</description><category domain="http://geeks.ms/blogs/sergiotarrillo/archive/tags/ASP.NET/default.aspx">ASP.NET</category><category domain="http://geeks.ms/blogs/sergiotarrillo/archive/tags/Eventos/default.aspx">Eventos</category><category domain="http://geeks.ms/blogs/sergiotarrillo/archive/tags/Patrones/default.aspx">Patrones</category><category domain="http://geeks.ms/blogs/sergiotarrillo/archive/tags/Best+Practices/default.aspx">Best Practices</category><category domain="http://geeks.ms/blogs/sergiotarrillo/archive/tags/ASP.NET+AJAX/default.aspx">ASP.NET AJAX</category></item><item><title>Static Code Analysis en Sitios Web</title><link>http://geeks.ms/blogs/sergiotarrillo/archive/2007/04/05/12789.aspx</link><pubDate>Thu, 05 Apr 2007 16:56:26 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:12789</guid><dc:creator>Sergio Tarrillo</dc:creator><slash:comments>2</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/sergiotarrillo/rsscomments.aspx?PostID=12789</wfw:commentRss><comments>http://geeks.ms/blogs/sergiotarrillo/archive/2007/04/05/12789.aspx#comments</comments><description>&lt;p&gt;Si estamos haciendo una análisis de nuestro código, para ver si cumple con las buenas prácticas, por cierto Static Code Analysis esta incluido dentro de &lt;a href="http://www.microsoft.com/spanish/msdn/comunidad/mtj.net/voices/MTJ_4300.asp" target="_blank"&gt;VS2005 Team Edition for Software Developers&lt;/a&gt;, y necesitamos determinar las reglas de análisi y escoger las que necesitemos en ese momento, sólo necesitamos entrar a las propiedades de la libería de clases, y listo:&lt;/p&gt; &lt;p&gt;&lt;img src="http://galeon.com/solocodigo/images/blog/2007/04_Abril/04_tipos.JPG"&gt;&lt;/p&gt; &lt;p&gt;&lt;a href="http://msdn2.microsoft.com/es-es/library/ms165258(VS.80).aspx" target="_blank"&gt;Cada grupo&lt;/a&gt; cumple una determinada función. El&amp;nbsp;incovienten en un sitio Web es que la selección de reglas de análisis,&amp;nbsp;no está en propiedades de la aplicación web, pero si tenemos disponible la ejecución de la herramienta, a través del item, &lt;strong&gt;Run Code Analysis on Web Site&lt;/strong&gt;, que lo encontramos al hacer clic derecho en el Sitio Web:&lt;/p&gt;&lt;img src="http://galeon.com/solocodigo/images/blog/2007/04_Abril/04_runWeb.JPG"&gt;  &lt;p&gt;Sin el espíritu intuitivo me fui a la Web a buscar ayuda, y llegue &lt;a href="http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=400543&amp;amp;SiteID=1" target="_blank"&gt;al foro&lt;/a&gt;. Y pues la solución era tan obvia que pasaba desapercibida:&lt;/p&gt; &lt;p&gt;&lt;img src="http://galeon.com/solocodigo/images/blog/2007/04_Abril/04_confWeb.JPG"&gt;&lt;/p&gt; &lt;p&gt;Ahora, nosotros podemos seleccionar las reglas de análisis de nuestro Sitio Web,&amp;nbsp;además del tipo de mensaje al no pasar determinada regla:&lt;/p&gt; &lt;p&gt;&lt;img src="http://galeon.com/solocodigo/images/blog/2007/04_Abril/04_define.JPG"&gt;&lt;/p&gt; &lt;p&gt;En esta web podemos encontrar el detalle de cada grupo de comprobaciones: &lt;a href="http://msdn2.microsoft.com/es-es/library/ee1hzekz(VS.80).aspx" target="_blank"&gt;Análisis de código de las advertencias de código administrado&lt;/a&gt;. También podemos visitar: &lt;a href="http://msdn2.microsoft.com/es-es/library/ms229042(VS.80).aspx" target="_blank"&gt;Instrucciones de diseño para desarrollar bibliotecas de clases&lt;/a&gt;, para identificar algunos lineamientos en que se basa el análisis de código para&amp;nbsp;reconocer el uso de buenas prácticas.&lt;/p&gt; &lt;p&gt;Saludos,&lt;/p&gt;
&lt;br /&gt; Post cruzado &lt;a target="_blank" href="http://blogs.3devnet.com/blogs/default.aspx"&gt;3Dev Blogs&lt;/a&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=12789" width="1" height="1"&gt;</description><category domain="http://geeks.ms/blogs/sergiotarrillo/archive/tags/Visual+Studio/default.aspx">Visual Studio</category><category domain="http://geeks.ms/blogs/sergiotarrillo/archive/tags/Best+Practices/default.aspx">Best Practices</category></item><item><title>Descarga gratuita de Materiales de Entrenamiento y Presentaciones de .NET, Arquitectura, BI, y otros via 3Dev</title><link>http://geeks.ms/blogs/sergiotarrillo/archive/2007/02/28/11132.aspx</link><pubDate>Thu, 01 Mar 2007 00:45:28 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:11132</guid><dc:creator>Sergio Tarrillo</dc:creator><slash:comments>5</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/sergiotarrillo/rsscomments.aspx?PostID=11132</wfw:commentRss><comments>http://geeks.ms/blogs/sergiotarrillo/archive/2007/02/28/11132.aspx#comments</comments><description>&lt;p&gt;Hace tiempo que &lt;a href="http://blogs.3devnet.com/blogs/guino/default.aspx" target="_blank"&gt;Guino&lt;/a&gt; me comentó que iba actualizar la página de &lt;a href="http://www.3devnet.com/download.aspx" target="_blank"&gt;descargas de 3Dev&lt;/a&gt;. &lt;/p&gt; &lt;p&gt;Ahora &lt;a href="http://blogs.3devnet.com/blogs/guino/archive/2007/02/26/13967.aspx" target="_blank"&gt;que revivió&lt;/a&gt;, ha &lt;a href="http://blogs.3devnet.com/blogs/guino/archive/2007/02/28/14067.aspx" target="_blank"&gt;liberado los materiales&lt;/a&gt; de entrenamiento y presentaciones del año 2006, en la actual lista podrán encontrar:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;Curso de Arquitectura .NET y Mejores Practicas - Workshop&lt;/li&gt; &lt;li&gt;Curso Patrones de Diseño con ejemplos en C# - Workshop&lt;/li&gt; &lt;li&gt;Curso de Business Intelligence con SQL Server 2005 - Workshop&lt;/li&gt; &lt;li&gt;Curso Visual Studio Team System - Nivel 200 - One Day Workshop&lt;/li&gt; &lt;li&gt;Desarrollando Aplicaciones Windows&amp;nbsp;con Visual Studio 2005 - Hands-On Labs&lt;/li&gt; &lt;li&gt;Desarrollando Aplicaciones Web&amp;nbsp;con ASP.NET 2.0 - Hands-On Labs&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;La lista completa la encuentran en la sección de &lt;a href="http://www.3devnet.com/download.aspx" target="_blank"&gt;descargas de 3Dev&lt;/a&gt;. Veo que faltan algunas presentaciones, así que pronto se estara actualizando.&lt;/p&gt; &lt;p&gt;P.D.: Si tiene alguna pregunta, comentario o queja con los dos últimos HOLs que liste, me avisan ;).&lt;/p&gt; &lt;p&gt;Saludos,&lt;/p&gt;
&lt;br /&gt; Post cruzado &lt;a target="_blank" href="http://blogs.3devnet.com/blogs/default.aspx"&gt;3Dev Blogs&lt;/a&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=11132" width="1" height="1"&gt;</description><category domain="http://geeks.ms/blogs/sergiotarrillo/archive/tags/ASP.NET/default.aspx">ASP.NET</category><category domain="http://geeks.ms/blogs/sergiotarrillo/archive/tags/SQL+Server/default.aspx">SQL Server</category><category domain="http://geeks.ms/blogs/sergiotarrillo/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://geeks.ms/blogs/sergiotarrillo/archive/tags/Visual+Studio/default.aspx">Visual Studio</category><category domain="http://geeks.ms/blogs/sergiotarrillo/archive/tags/Windows+Forms/default.aspx">Windows Forms</category><category domain="http://geeks.ms/blogs/sergiotarrillo/archive/tags/Patrones/default.aspx">Patrones</category><category domain="http://geeks.ms/blogs/sergiotarrillo/archive/tags/Arquitectura/default.aspx">Arquitectura</category><category domain="http://geeks.ms/blogs/sergiotarrillo/archive/tags/Cursos/default.aspx">Cursos</category><category domain="http://geeks.ms/blogs/sergiotarrillo/archive/tags/Ado.NET/default.aspx">Ado.NET</category><category domain="http://geeks.ms/blogs/sergiotarrillo/archive/tags/Best+Practices/default.aspx">Best Practices</category></item><item><title>me canse de usar strings en Session, QueryString, Cache, AppSettings, Application, etc</title><link>http://geeks.ms/blogs/sergiotarrillo/archive/2007/02/17/10597.aspx</link><pubDate>Sat, 17 Feb 2007 08:28:04 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:10597</guid><dc:creator>Sergio Tarrillo</dc:creator><slash:comments>6</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/sergiotarrillo/rsscomments.aspx?PostID=10597</wfw:commentRss><comments>http://geeks.ms/blogs/sergiotarrillo/archive/2007/02/17/10597.aspx#comments</comments><description>&lt;p&gt;Como saben en todo desarrollo&amp;nbsp;web vamos a&amp;nbsp;hacer&amp;nbsp;uso de&amp;nbsp;variables de tipo&amp;nbsp;&lt;strong&gt;Session&lt;/strong&gt;, &lt;strong&gt;Cache&lt;/strong&gt;, o&amp;nbsp;&lt;strong&gt;Application&lt;/strong&gt;. Si enviamos variables por URL debemos recuperar con &lt;strong&gt;Request.QueryString&lt;/strong&gt;, las variables. Si tenemos variables de aplicación debemos leer el &lt;strong&gt;AppSettings&lt;/strong&gt; del web.config.&lt;/p&gt; &lt;p&gt;Hasta aquí no hay problema, por ejemplo, quieremos asignar una variable al&amp;nbsp;objeto&amp;nbsp;&lt;strong&gt;Session&lt;/strong&gt;:&lt;/p&gt; &lt;p&gt;&lt;font face="Courier New" color="#008000" size="2"&gt;&amp;nbsp;&amp;nbsp; Session["CodArea"] = 5;&lt;/font&gt;&lt;/p&gt; &lt;p&gt;Si vamos a pasar variables por la URL debemos hacer:&lt;/p&gt; &lt;p&gt;&lt;font face="Courier New" color="#008000" size="2"&gt;&amp;nbsp;&amp;nbsp; Response.Redirect("~/mostrarnoticiasportag.aspx?" +&lt;br&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; "CodArea=" + Session["CodArea"].ToString() +&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;"&amp;amp;TagNombre=" + ddlTags.SelectedValue,true);&lt;/font&gt;&lt;/p&gt; &lt;p&gt;Y si queremos recuperarlas tenemos que usar:&lt;/p&gt; &lt;p&gt;&lt;font face="Courier New" color="#008000" size="2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;Request.QueryString["TagNombre"], o Request.QueryString["CodArea"]&lt;/font&gt;&lt;/p&gt; &lt;p&gt;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 &lt;a href="http://es.wikipedia.org/wiki/Hard_code" target="_blank"&gt;hard code&lt;/a&gt;, y tener alguna manera de tener la lista de elementos en el &lt;strong&gt;IntellSense&lt;/strong&gt;, 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&amp;nbsp;muchas páginas, un error o cambio, los minutos pueden aumentar y ya se siente el efecto de estos cambios.&lt;/p&gt; &lt;p&gt;Lo que se me ocurrió fue usar clases de la siguiente manera:&lt;/p&gt; &lt;p&gt;&lt;font face="Courier New" color="#008000" size="2"&gt;&amp;nbsp;&amp;nbsp; public class NOTQuery&lt;br&gt;&amp;nbsp;&amp;nbsp; { &lt;br&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &lt;/font&gt;&lt;font face="Courier New" color="#008000" size="2"&gt;public static string CodArea&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; get { return "CodArea"; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&amp;nbsp;&lt;br&gt;&lt;/font&gt;&lt;font face="Courier New" color="#008000" size="2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public static string TagNombre&lt;br&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; get { return "TagNombre"; }&lt;br&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; }&amp;nbsp;&lt;br&gt;&lt;/font&gt;&lt;font face="Courier New" color="#008000" size="2"&gt;&amp;nbsp;&amp;nbsp; } &lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font face="Courier New" color="#008000" size="2"&gt;&amp;nbsp;&amp;nbsp; public class NOTSession&lt;br&gt;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public static string CodArea&lt;br&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; get { return "CodArea"; }&lt;br&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; }&lt;br&gt;&amp;nbsp;&amp;nbsp; }&lt;/font&gt; &lt;p&gt;Y ahora nuestro código de envió, sería de la siguiente manera: &lt;p&gt;&lt;font face="Courier New" color="#008000" size="2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Response.Redirect("~/not_mostrarnoticiasportag.aspx?" +&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; NOTQuery.CodArea + "=" + Session[NOTSession.CodArea].ToString() +&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; "&amp;amp;" + NOTQuery.TagNombre + "=" + ddlTags.SelectedValue,true);&lt;/font&gt; &lt;p&gt;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.&amp;nbsp;Noten que estas variables se puede usar tanto para enviar, asignar, o recuperar. &lt;p&gt;Así también podemos hacer para &lt;strong&gt;Cache&lt;/strong&gt;, &lt;strong&gt;Application&lt;/strong&gt;, y &lt;strong&gt;AppSettings&lt;/strong&gt;. 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. &lt;p&gt;Saludos,&lt;/p&gt;
&lt;br /&gt; Post cruzado &lt;a target="_blank" href="http://blogs.3devnet.com/blogs/default.aspx"&gt;3Dev Blogs&lt;/a&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=10597" width="1" height="1"&gt;</description><category domain="http://geeks.ms/blogs/sergiotarrillo/archive/tags/ASP.NET/default.aspx">ASP.NET</category><category domain="http://geeks.ms/blogs/sergiotarrillo/archive/tags/Best+Practices/default.aspx">Best Practices</category></item><item><title>Tips para usar el ObjectDataSource como fuente de datos</title><link>http://geeks.ms/blogs/sergiotarrillo/archive/2007/02/14/10484.aspx</link><pubDate>Thu, 15 Feb 2007 04:32:00 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:10484</guid><dc:creator>Sergio Tarrillo</dc:creator><slash:comments>5</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/sergiotarrillo/rsscomments.aspx?PostID=10484</wfw:commentRss><comments>http://geeks.ms/blogs/sergiotarrillo/archive/2007/02/14/10484.aspx#comments</comments><description>&lt;P&gt;Como ustedes saben ahora existen diversos&amp;nbsp;&lt;A href="http://msdn2.microsoft.com/es-es/library/ms227679(VS.80).aspx" target=_blank&gt;controles DataSource&lt;/A&gt; para el enlace a datos en una aplicación &lt;A href="http://www.asp.net/" target=_blank&gt;ASP.NET&lt;/A&gt;.&amp;nbsp;Ya hemos hablados de algunos de ellos: &lt;A href="http://geeks.ms/blogs/sergiotarrillo/archive/2007/01/25/9256.aspx" target=_blank&gt;ObjectDataSource&lt;/A&gt;, y &lt;A href="http://geeks.ms/blogs/sergiotarrillo/archive/2007/01/17/8822.aspx" target=_blank&gt;XmlDataSource&lt;/A&gt;. Pero en este post vamos hablar un poco más del control &lt;A href="http://msdn2.microsoft.com/es-es/library/system.web.ui.webcontrols.objectdatasource.aspx" target=_blank&gt;&lt;STRONG&gt;ObjectDataSource&lt;/STRONG&gt;&lt;/A&gt;.&lt;/P&gt;
&lt;P&gt;Si han estado usando un control &lt;STRONG&gt;GridView&lt;/STRONG&gt; enlazado a un control &lt;STRONG&gt;ObjectDataSource&lt;/STRONG&gt;, y han implementado el método eliminar en su componente de negocio, se habrán podido dar cuenta que no funciona el comando eliminar del &lt;STRONG&gt;GridView&lt;/STRONG&gt;. Depuramos y efectivamente el método si es llamado, pero el parámetro del código del registro que deseamos borrar contiene cero:&lt;/P&gt;
&lt;P&gt;&lt;IMG src="http://galeon.com/solocodigo/images/blog/2007/02_Febrero/14_NotPar.JPG"&gt;&lt;/P&gt;
&lt;P&gt;Ustedes dicen -pero que pasa, vuelven a ejecutar y nada, verifican que el parámetro del comando&amp;nbsp;eliminar del &lt;STRONG&gt;ObjectDataSource&lt;/STRONG&gt; sea igual al nombre de la columna, pero nada:&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" color=#800000 size=2&gt;&amp;nbsp;&amp;nbsp; &amp;lt;DeleteParameters&amp;gt; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;asp:Parameter Name="NOTCod" Type="Int32" /&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp; &amp;lt;/DeleteParameters&amp;gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;Volvemos a ejecutar pero nada, ejecutamos otra vez y nada (en este momento empiezan a silbar, y a&amp;nbsp;pedir su plata). Pero después que terminar de silbar, vamos por los detalles, de que esta pasando y porque no elimina.&lt;/P&gt;
&lt;P&gt;Lo que pasa es que el GridView no identifica el campo clave que&amp;nbsp;se usará como parámetro, por más que pongamos el mismo nombre. Lo que debemos hacer es, agregar la propiedad &lt;A href="http://msdn2.microsoft.com/es-es/library/system.web.ui.webcontrols.gridview.datakeynames(VS.80).aspx" target=_blank&gt;DataKeyNames&lt;/A&gt; al GridView:&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" color=#800000 size=2&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;DataKeyNames="NOTCod"&lt;/FONT&gt;&lt;FONT face="Courier New" color=#800000 size=2&gt;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;Con esto el GridView sabrá que esa será la columna con la clave principal, y esa será usada para llamar al método eliminar. Ojo no necesariamente el nombre del parámetro eliminar del &lt;STRONG&gt;ObjectDataSource&lt;/STRONG&gt; debe ser el mismo, por ejemplo yo puedo llamar a mi parámetro, en mi método, así:&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" color=#800000 size=2&gt;&amp;nbsp;&amp;nbsp; &amp;lt;DeleteParameters&amp;gt; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;asp:Parameter Name="pNOTCod" Type="Int32" /&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp; &amp;lt;/DeleteParameters&amp;gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;Pero en este caso debemos agregar una&amp;nbsp;propiedad al ObjectDataSource, &lt;A href="http://msdn2.microsoft.com/es-es/library/system.web.ui.webcontrols.objectdatasource.oldvaluesparameterformatstring(VS.80).aspx" target=_blank&gt;OldValuesParameterFormatString&lt;/A&gt;,&amp;nbsp;para que pueda cambiar el formato del string del parámetro pasado:&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" color=#800000 size=2&gt;&amp;nbsp;&amp;nbsp; OldValuesParameterFormatString="p{0}"&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;Con esto le decimos que tome el valor del campo seleccionado en el &lt;STRONG&gt;GridView&lt;/STRONG&gt;, &lt;U&gt;NOTCod&lt;/U&gt;, y cambie el formato a &lt;U&gt;pNOTCod&lt;/U&gt;, antes de pasarlo al método eliminar o actualizar. Esta propiedad sólo se aplica a las claves principales, es decir las que identificamos con la propiedad &lt;STRONG&gt;DataKeyNames&lt;/STRONG&gt; en el &lt;STRONG&gt;GridView&lt;/STRONG&gt;.&lt;/P&gt;
&lt;P&gt;Les gustaría saber como generar&amp;nbsp;automáticamente la propiedad&amp;nbsp;&lt;STRONG&gt;DataKeyNames&lt;/STRONG&gt;, con la clave de nuestro objeto de negocio?, o lo dejo para otro post *-), jeje, mejor lo cuento ahora, pero sólo para ustedes.&lt;/P&gt;
&lt;P&gt;Primero ubican su objeto de negocio, y la clave principal, y le agregamos el siguiente atributo, &lt;A href="http://msdn2.microsoft.com/es-es/library/system.componentmodel.dataobjectfieldattribute.dataobjectfieldattribute(vs.80).aspx" target=_blank&gt;DataObjectFieldAttribute&lt;/A&gt;, al atributo NOTCodigo de nuestra clase:&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" color=#008000 size=2&gt;&amp;nbsp;&amp;nbsp; [DataObjectField(true,true)]&lt;BR&gt;&amp;nbsp;&amp;nbsp; public Nullable&amp;lt;int&amp;gt; NOTCodigo&lt;BR&gt;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; get { return notCodigo; }&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; set { notCodigo = value; }&lt;BR&gt;&amp;nbsp;&amp;nbsp; }&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;Con esto le decimos que &lt;STRONG&gt;NOTCodigo&lt;/STRONG&gt;, será la clave principal, y además es de tipo Identity. Ahora cuando enlacen un &lt;STRONG&gt;GridView&lt;/STRONG&gt; a un &lt;STRONG&gt;ObjectDataSource&lt;/STRONG&gt;, la propiedad &lt;STRONG&gt;DataKeyNames&lt;/STRONG&gt; se generará automáticamente, siempre y cuando el método retorne una colección de objetos de este tipo.&lt;/P&gt;
&lt;P&gt;Lo que también podemos hacer, es agregar los siguientes atributos al componente de negocio, &lt;A href="http://msdn2.microsoft.com/es-es/library/system.componentmodel.dataobjectattribute(VS.80).aspx" target=_blank&gt;DataObjectAttribute&lt;/A&gt; y &lt;A href="http://msdn2.microsoft.com/es-es/library/system.componentmodel.dataobjectmethodattribute(VS.80).aspx" target=_blank&gt;DataObjectMethodAttribute&lt;/A&gt;:&lt;/P&gt;&lt;FONT face="Courier New" color=#008000 size=2&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp; [DataObject]&lt;BR&gt;&amp;nbsp;&amp;nbsp; public class NOTAgenteNoticia&lt;BR&gt;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; [DataObjectMethod(DataObjectMethodType.Select,true)]&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public static List&amp;lt;BONOT.BONoticia&amp;gt; Listar(int pAreCodigo)&lt;BR&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; {&amp;nbsp;&lt;BR&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; int nroNoticias =&amp;nbsp;int.Parse(NOTUtil.Settings("NOTNroNoticias"));&amp;nbsp;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; BLNOT.BLNoticia objBLNOT = new BLNOT.BLNoticia();&amp;nbsp;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return objBLNOT.ListarNoticias(pAreCodigo,nroNoticias);&amp;nbsp;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; [DataObjectMethod(DataObjectMethodType.Delete,true)]&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public static bool Eliminar(int pNOTCod)&lt;BR&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; BLNOT.BLNoticia objBLNOT = new BLNOT.BLNoticia();&amp;nbsp;&lt;BR&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return objBLNOT.Eliminar(pNOTCod);&amp;nbsp;&lt;BR&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; }&lt;/FONT&gt;&lt;FONT face="Courier New" color=#008000 size=2&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp; }&amp;nbsp;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;Con el atributo &lt;STRONG&gt;DataObject&lt;/STRONG&gt; agregado a nuestro componente de negocio, o la clase que se usa para conectar el &lt;STRONG&gt;FrontEnd&lt;/STRONG&gt; con los componentes de negocio, en mi caso agente, hacemos que sólo esta clase sea recocida para mostrar en las opciones del asistente para crear el &lt;STRONG&gt;ObjectDataSource&lt;/STRONG&gt;:&lt;/P&gt;
&lt;P&gt;&lt;IMG src="http://galeon.com/solocodigo/images/blog/2007/02_Febrero/14_ODSNot.JPG"&gt;&lt;/P&gt;
&lt;P&gt;Como pueden apreciar al marcar "Show only data components", sólo veremos las clases que tengan el atributo &lt;STRONG&gt;DataObject&lt;/STRONG&gt;, y no todo el montón de clases que normalmente salen. &lt;/P&gt;
&lt;P&gt;Con el atributo &lt;STRONG&gt;DataObjectMethod&lt;/STRONG&gt;, le decimos que reconozca a este método como Eliminar, o Insertar, dependiendo de la enumeración &lt;A href="http://msdn2.microsoft.com/es-es/library/system.componentmodel.dataobjectmethodtype(VS.80).aspx" target=_blank&gt;DataObjectMethodType&lt;/A&gt;, con sus posibles valores: Delete, Fill, Insert, Select, y Update, para las diversas operaciones que necesitemos hacer&amp;nbsp;hacia nuestra fuente de datos.&lt;/P&gt;
&lt;P&gt;También visitar:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;A href="http://www.spaanjaars.com/QuickDocId.aspx?quickdoc=390" target=_blank&gt;Using Attributes to Improve the Quality and Usability of Your Code Part 1 - Decorating Business Objects for Data Binding&lt;/A&gt; 
&lt;LI&gt;&lt;A href="http://www.microsoft.com/spanish/msdn/articulos/archivo/300106/voices/ASP2memroleman.mspx" target=_blank&gt;Administración de miembros y funciones de Microsoft ASP.NET 2.0 con IIS&lt;/A&gt;&lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;Saludos,&lt;/P&gt;&lt;BR&gt;Post cruzado&lt;img src="http://geeks.ms/aggbug.aspx?PostID=10484" width="1" height="1"&gt;</description><category domain="http://geeks.ms/blogs/sergiotarrillo/archive/tags/ASP.NET/default.aspx">ASP.NET</category><category domain="http://geeks.ms/blogs/sergiotarrillo/archive/tags/Ado.NET/default.aspx">Ado.NET</category><category domain="http://geeks.ms/blogs/sergiotarrillo/archive/tags/Best+Practices/default.aspx">Best Practices</category></item><item><title>URL Rewriting, URL Mapping en ASP.NET 1.X y 2.0</title><link>http://geeks.ms/blogs/sergiotarrillo/archive/2007/01/30/9467.aspx</link><pubDate>Tue, 30 Jan 2007 17:43:00 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:9467</guid><dc:creator>Sergio Tarrillo</dc:creator><slash:comments>1</slash:comments><description>&lt;p&gt;Holas!&lt;/p&gt;
&lt;p&gt;qué es URL Rewriting?, un ejemplo lo puede dejar más claro:&lt;/p&gt;
&lt;p&gt;Mis páginas de noticias son así: &lt;a href="http://www.misite.com/noticias/mostrarNoticia.aspx?codNOT=15"&gt;http://www.misite.com/noticias/mostrarNoticia.aspx?codNOT=15&lt;/a&gt;, ahora yo quiero generar un link así: &lt;a href="http://www.misite.com/noticias/show15.aspx"&gt;http://www.misite.com/noticias/show15.aspx&lt;/a&gt;. &lt;/p&gt;
&lt;p&gt;Quedo más claro?, como pueder ver la URL es más simple de recordar, y son un poco más estéticas, sobre todo si&amp;nbsp;hay&amp;nbsp;más de&amp;nbsp;un parametro&amp;nbsp;en URL en la original. Otra de las ventajas es generar un link permanente, imaginen que su carpeta cambio por alguna razón, que pasa con todos los usuarios que agregaron a sus favoritos o&amp;nbsp;algún tipo de bookmark,&amp;nbsp;el link&amp;nbsp;anterior. Y hay algunos otros usos que a ustedes se les pueda ocurrir ...&lt;/p&gt;
&lt;p&gt;En esta ocasión sólo mostraré los links que encontré, y en un posterior post, les cuento y detallo cual use en mi aplicación.&lt;/p&gt;
&lt;p&gt;En ASP.NET 2.0:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://pietschsoft.com/blog/Post.aspx?PostID=762"&gt;ASP.NET 2.0: URL Mapping with RegEx Support&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.codeproject.com/aspnet/urlrewrite.asp" target="_blank"&gt;URL rewrite for .NET 2.0&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.developerfusion.co.uk/show/5302/" target="_blank"&gt;Url Rewriting with Regex for ASP.NET 2.0&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://weblogs.asp.net/scottgu/archive/2005/11/14/430493.aspx" target="_blank"&gt;Url Mapper w/ Regex Support&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://weblogs.asp.net/scottgu/archive/2006/01/18/435870.aspx" target="_blank"&gt;UrlRewritingModule w/ Regular Expression Support for ASP.NET 2.0&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.developerland.com/CuttingEdge/ASPNet2/448.aspx" target="_blank"&gt;Url Rewriting with Regex for ASP.NET 2.0&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;&lt;a href="http://www.developer.com/net/asp/article.php/3581326" target="_blank"&gt;URL Mapping in ASP.NET 2.0&lt;/a&gt;&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://dotavery.com/blog/archive/2005/11/06/5890.aspx"&gt;ASP.NET 2.0 Url Rewriting crippled to the point of uselessness&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.aspnettutorials.com/tutorials/network/web-URL-aspnet2-csharp.aspx" target="_blank"&gt;Rewriting a URL on-the-fly using ASP.NET 2.0 and C#.NET&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.4invent.com/post73-URL-Rewriting-in-ASP.NET-2.0.aspx" target="_blank"&gt;URL Rewriting in ASP.NET 2.0&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;&lt;a href="http://blah.winsmarts.com/2006/05/12/the-definitive-guide-to-url-rewriting-in-aspnet.aspx" target="_blank"&gt;The Definitive Guide to URL Rewriting in ASP.NET&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;En ASP.NET 1.X:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://msdn2.microsoft.com/en-us/library/ms972974.aspx" target="_blank"&gt;URL Rewriting in ASP.NET&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;&lt;a href="http://www.microsoft.com/spanish/msdn/articulos/archivo/020604/voices/URLRewriting.asp" target="_blank"&gt;Reescritura de direcciones URL en ASP.NET (ASP.NET Technical Articles)&lt;/a&gt;&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.15seconds.com/issue/030522.htm" target="_blank"&gt;Rewrite.NET -- A URL Rewriting Engine for .NET&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.codeproject.com/aspnet/URLRewriter.asp" target="_blank"&gt;L Rewriting with ASP.NET&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.interact-sw.co.uk/iangblog/2004/01/12/shinyurl" target="_blank"&gt;URL Dogma&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://weblogs.asp.net/fmarguerie/archive/2003/12/24/45712.aspx" target="_blank"&gt;Boosting search engine results with URL rewriting&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://weblogs.asp.net/jasonsalas/archive/2003/12/14/43404.aspx" target="_blank"&gt;The new &amp;quot;in&amp;quot; thing for web development: get rid of the query string&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://weblogs.asp.net/fmarguerie/archive/2004/11/18/265719.aspx" target="_blank"&gt;ASP.NET HTTP module for URL redirections&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://west-wind.com/WebLog/posts/269.aspx"&gt;Making sense of ASP.Net Paths&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://weblogs.asp.net/jezell/archive/2004/03/15/90045.aspx" target="_blank"&gt;Fixing Microsoft&amp;#39;s Bugs: Url Rewriting&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a title="http://www.asp101.com/articles/matteo/urlrewriting/default.asp" href="http://www.asp101.com/articles/matteo/urlrewriting/default.asp"&gt;http://www.asp101.com/articles/matteo/urlrewriting/default.asp&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;Herramientas:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a title="http://urlrewriter.net/" href="http://urlrewriter.net/"&gt;http://urlrewriter.net/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a title="http://www.urlrewriting.net" href="http://www.urlrewriting.net/"&gt;http://www.urlrewriting.net&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;Saludos,&lt;/p&gt;&lt;br /&gt;Post cruzado&lt;img src="http://geeks.ms/aggbug.aspx?PostID=9467" width="1" height="1"&gt;</description><category domain="http://geeks.ms/blogs/sergiotarrillo/archive/tags/ASP.NET/default.aspx">ASP.NET</category><category domain="http://geeks.ms/blogs/sergiotarrillo/archive/tags/Best+Practices/default.aspx">Best Practices</category></item><item><title>Hard Code Off!</title><link>http://geeks.ms/blogs/sergiotarrillo/archive/2007/01/17/8811.aspx</link><pubDate>Wed, 17 Jan 2007 06:59:00 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:8811</guid><dc:creator>Sergio Tarrillo</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/sergiotarrillo/rsscomments.aspx?PostID=8811</wfw:commentRss><comments>http://geeks.ms/blogs/sergiotarrillo/archive/2007/01/17/8811.aspx#comments</comments><description>&lt;p&gt;Estaba realizando mis tareas cotidianas frente a la PC, trabajando obviamente, aunque no lo crean xD, y se me presento la siguiente reflexión,&amp;nbsp;la cual quise plasmar en un post, primero les contare el caso:&lt;/p&gt; &lt;p&gt;Tengo una entidad &lt;strong&gt;Area&lt;/strong&gt;: &lt;strong&gt;Codigo&lt;/strong&gt;, &lt;strong&gt;Nombre&lt;/strong&gt;, &lt;strong&gt;Orden&lt;/strong&gt;. La cual tienen los siguientes registros: &lt;font color="#800000"&gt;1, Area1, 1 - 2, Area2, 2 -&amp;nbsp;3, Area3, 3 y así hasta el Area5&lt;/font&gt;.&lt;/p&gt; &lt;p&gt;El campo &lt;strong&gt;Orden&lt;/strong&gt; es como como los registros son mostrados en el Sitio Web. Y se me presenta la necesidad de recuperar &lt;strong&gt;código&lt;/strong&gt; de &lt;strong&gt;Area&lt;/strong&gt;&amp;nbsp;del primer elemento. En mi caso estoy almacenando en una variable codArea, y fácilmente podría decir:&lt;/p&gt; &lt;p&gt;&lt;font face="Courier New" color="#008000" size="2"&gt;&amp;nbsp;&amp;nbsp; codArea = 1;&lt;/font&gt;&lt;/p&gt; &lt;p&gt;Tu sabes que el registro inicial esta en 1, obviamente porque tu estas desarrollando el proyecto, y como medida de "riesgo", piensas: "&lt;em&gt;creo que será difícil que cambien esta configuración así que no creo que haya problema que lo deje en 1&lt;/em&gt;".&lt;/p&gt; &lt;p&gt;Pero recordando las enseñanzas de mis jefes&amp;nbsp;en &lt;a href="http://www.3devnet.com/" target="_blank"&gt;3Dev&lt;/a&gt;, que siempre&amp;nbsp;priorizan el uso de buenas practicas en el desarrollo de proyectos, no lo hice.&lt;/p&gt; &lt;p&gt;Y es que, que&amp;nbsp;pasa si por alguna razón en un futuro, aunque parezca imposible, cambia&amp;nbsp;el orden y ahora tu primer registro es: 1, Area1, 2 - 2, Area2, 1. Es decir que ahora tu primer elemento tiene el código 2. O por alguna otra razón no se inserta con valor 1 el primer registro.&amp;nbsp;Vas a decirle a tu webmaster que detenga la aplicación unos momentos para&amp;nbsp;subir ese pequeño cambio, encimá le dices es pequeñito sólo una línea de código,&amp;nbsp;a:&lt;/p&gt; &lt;p&gt;&lt;font face="Courier New" color="#008000" size="2"&gt;&amp;nbsp;&amp;nbsp; codArea = 2;&lt;/font&gt;&lt;/p&gt; &lt;p&gt;Ese insignificante cambio de una línea de código,&amp;nbsp;en una&amp;nbsp;aplicación crítica&amp;nbsp;y tan sólo unos minutos,&amp;nbsp;puede costar mucho.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Moraleja&lt;/strong&gt;: No sean ociosos eviten el &lt;a href="http://es.wikipedia.org/wiki/Hard_code" target="_blank"&gt;Hard Code&lt;/a&gt;! Que por cierto es un &lt;a href="http://en.wikipedia.org/wiki/Anti-pattern" target="_blank"&gt;antipatrón&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;P.D.: Y si han echo &lt;a href="http://en.wikipedia.org/wiki/Hard_code" target="_blank"&gt;Hard Code&lt;/a&gt;, aún están a tiempo de cambiarlo :p, claro eso siempre y cuando no los hayan cambiado a ustedes :D.&lt;/p&gt; &lt;p&gt;P.D.2: Algún tiburón con más experiencia le ha encontrado alguna utilidad al Hard Code?&lt;/p&gt; &lt;p&gt;Saludos,&lt;/p&gt;
&lt;br /&gt; Post cruzado&lt;img src="http://geeks.ms/aggbug.aspx?PostID=8811" width="1" height="1"&gt;</description><category domain="http://geeks.ms/blogs/sergiotarrillo/archive/tags/ASP.NET/default.aspx">ASP.NET</category><category domain="http://geeks.ms/blogs/sergiotarrillo/archive/tags/Best+Practices/default.aspx">Best Practices</category></item><item><title>databindig a una enumeracion (enum)</title><link>http://geeks.ms/blogs/sergiotarrillo/archive/2007/01/07/8342.aspx</link><pubDate>Sun, 07 Jan 2007 06:24:52 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:8342</guid><dc:creator>Sergio Tarrillo</dc:creator><slash:comments>2</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/sergiotarrillo/rsscomments.aspx?PostID=8342</wfw:commentRss><comments>http://geeks.ms/blogs/sergiotarrillo/archive/2007/01/07/8342.aspx#comments</comments><description>&lt;p&gt;Holas!&lt;/p&gt; &lt;p&gt;Ya en un &lt;a href="http://geeks.ms/blogs/sergiotarrillo/archive/2006/12/22/7851.aspx" target="_blank"&gt;post&lt;/a&gt; del anio pasado xD, habíamos comentado como usar una estructura&amp;nbsp;&lt;a href="http://msdn2.microsoft.com/es-es/library/system.enum(VS.80).aspx" target="_blank"&gt;enumeración&lt;/a&gt; en el modelo de n-capas, específicamente cuando tenemos que usar valores constantes como estados de noticia, aprobado, sinrevisar, novalida, y así.&lt;/p&gt; &lt;p&gt;Pues generalmente estos mismos valores, en sí los contenidos, ya que sólo&amp;nbsp;los valores van a la base de datos, pero los contenidos son los que usamos y los que mostraremos. Como decía estos valores los necesitaremos en un &lt;strong&gt;ComboBox&lt;/strong&gt; o un &lt;strong&gt;DropDownList&lt;/strong&gt;, y es obvio que llenarlos manualmente se&amp;nbsp;perdería productividad al hacer algún cambio futuro en los estados de una noticia por ejemplo. Lo óptimo es enlazarlo directamente a la enumeración de tal manera que no tengo que preocuparme al realizar un cambio.&lt;/p&gt; &lt;p&gt;Encontré, una encontré la otra la adapte, dos formas de hacerlo: una usando &lt;strong&gt;System.Reflection&lt;/strong&gt;, y la otra no.&lt;/p&gt; &lt;p&gt;&lt;a href="http://www.paulstovell.net/Posts/Post.aspx?postId=424d9f02-c1d8-4b2f-920c-389f602c27f8"&gt;&lt;strong&gt;Método 01&lt;/strong&gt;&lt;/a&gt;: Este me parece interesante porque te da la posibilidad de poner una descripción que después se puede usar para presentar al usuario:&lt;/p&gt; &lt;p&gt;&lt;font face="Courier New" color="#008000" size="2"&gt;&amp;nbsp;&amp;nbsp; private List&amp;lt;EnumerationValue&amp;gt; ConvertEnumForBinding(System.Enum enumeration)&lt;br&gt;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; List&amp;lt;EnumerationValue&amp;gt; results = new List&amp;lt;EnumerationValue&amp;gt;(); &lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font face="Courier New" color="#008000" size="2"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; // Use reflection to see what values the enum provides&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; MemberInfo[] members = enumeration.GetType().GetMembers();&lt;br&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; foreach (MemberInfo member in members)&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; { &lt;/font&gt; &lt;p&gt;&lt;font face="Courier New" color="#008000" size="2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // See if the member has a Description attribute:&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; object[] descriptionAttributes =&amp;nbsp;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;member.GetCustomAttributes(typeof(DescriptionAttribute), true); &lt;/font&gt; &lt;p&gt;&lt;font face="Courier New" color="#008000" size="2"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (descriptionAttributes.Length &amp;gt; 0)&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; string description = &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; ((DescriptionAttribute)descriptionAttributes[0]).Description;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; string value = member.Name;&lt;br&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; results.Add(new EnumerationValue(description, value));&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; }&lt;br&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; } &lt;/font&gt; &lt;p&gt;&lt;font face="Courier New" color="#008000" size="2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return results;&lt;br&gt;&amp;nbsp;&amp;nbsp; }&lt;/font&gt; &lt;p&gt;Imaginemos que la enumeración sea la siguiente: &lt;p&gt;&lt;font face="Courier New" color="#008000" size="2"&gt;&amp;nbsp;&amp;nbsp; public enum EstadoNoticia&lt;br&gt;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; [Description("Sin Revisar")]&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SinRevisar = 1,&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; [Description("Publicada")]&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Publicada = 2,&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; [Description("No Valida")]&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; NoValida = 3&lt;br&gt;&amp;nbsp;&amp;nbsp; }&lt;/font&gt; &lt;p&gt;Para enlazarlo a un dropdownlist sería de la siguiente forma: &lt;p&gt;&lt;font face="Courier New" color="#008000" size="2"&gt;&amp;nbsp;&amp;nbsp; ddlEstNoticia.DataSource = ConvertEnumForBinding(new EstadoNoticia());&lt;br&gt;&amp;nbsp;&amp;nbsp; ddlEstNoticia.DataTextField = "DisplayText"&lt;br&gt;&amp;nbsp;&amp;nbsp; ddlEstNoticia.DataValueField = "Value"&lt;br&gt;&amp;nbsp;&amp;nbsp; ddlEstNoticia.DataBind();&lt;/font&gt; &lt;p&gt;Por cierto, la definición de &lt;strong&gt;EnumerationValue&lt;/strong&gt; es la siguiente: &lt;p&gt;&lt;font face="Courier New" color="#008000"&gt;&amp;nbsp;&amp;nbsp; public class EnumerationValue&lt;br&gt;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;private string _displayText;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;private object _value; &lt;/font&gt; &lt;p&gt;&lt;font face="Courier New" color="#008000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;public EnumerationValue()&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; { &lt;/font&gt; &lt;p&gt;&lt;font face="Courier New" color="#008000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;/font&gt; &lt;p&gt;&lt;font face="Courier New" color="#008000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public EnumerationValue(string displayText, object value)&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; _displayText = displayText;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; _value = value;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;/font&gt; &lt;p&gt;&lt;font face="Courier New" color="#008000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public string DisplayText&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; get { return _displayText; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;/font&gt; &lt;p&gt;&lt;font face="Courier New" color="#008000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public object Value&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; get { return _value; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&amp;nbsp;&amp;nbsp; } &lt;/font&gt; &lt;p&gt;Se me pueden ocurrir recuperar dos cosas, una el valor&amp;nbsp;entero o la enumeración misma: &lt;p&gt;En mi caso necesito la enumeración, que es la que pasaré a través de las capas: &lt;p&gt;&lt;font face="Courier New" color="#008000" size="2"&gt;&amp;nbsp;&amp;nbsp; EstadoNoticia val; &lt;/font&gt; &lt;p&gt;&lt;font face="Courier New" color="#008000" size="2"&gt;&amp;nbsp;&amp;nbsp; val = (EstadoNoticia)Enum.Parse(&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; typeof(EstadoNoticia), ddlEstNoticia.SelectedValue, true);&lt;/font&gt; &lt;p&gt;Y el &lt;strong&gt;Método 02&lt;/strong&gt;:  &lt;p&gt;&lt;font face="Courier New" color="#008000" size="2"&gt;&amp;nbsp;&amp;nbsp; private List&amp;lt;EnumerationValue&amp;gt; ConvertEnumForBinding2(System.Enum enumeration)&lt;br&gt;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; List&amp;lt;EnumerationValue&amp;gt; results = new List&amp;lt;EnumerationValue&amp;gt;(); &lt;/font&gt; &lt;p&gt;&lt;font face="Courier New" color="#008000" size="2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Type todos = enumeration.GetType(); &lt;/font&gt; &lt;p&gt;&lt;font face="Courier New" color="#008000" size="2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; foreach (string s in Enum.GetNames(todos))&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; { &lt;/font&gt; &lt;p&gt;&lt;font face="Courier New" color="#008000" size="2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; string value = Enum.Format(todos,Enum.Parse(todos, s), "d"); &lt;/font&gt; &lt;p&gt;&lt;font face="Courier New" color="#008000" size="2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; results.Add( new EnumerationValue(s,value));&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;/font&gt; &lt;p&gt;&lt;font face="Courier New" color="#008000" size="2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return results;&lt;br&gt;&amp;nbsp;&amp;nbsp; }&lt;/font&gt;  &lt;p&gt;En este caso el &lt;strong&gt;DisplayText&lt;/strong&gt; será el valor de la enumeración por ejemplo "SinRevisar", y el &lt;strong&gt;Value&lt;/strong&gt; será el valor numérico. Algo que rescatar en este segundo método es la forma de &lt;a href="http://blogs.msdn.com/tims/archive/2004/04/02/106310.aspx" target="_blank"&gt;convertir un string a una enumeración&lt;/a&gt;. Además también se podría usar el método&amp;nbsp;&lt;strong&gt;IsDefined&lt;/strong&gt; para comprobar si el string existe como enumeración. Para ver todos los métodos de una enumeración &lt;a href="http://msdn2.microsoft.com/es-es/library/system.enum_members(VS.80).aspx" target="_blank"&gt;ver aquí&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;P.D.: En este ejemplo, por fines didácticos se muestra como si todo se hiciera en una sola capa, pero en un modelo en capas se encapsularía el método de traer los estados, por ejemplo:&lt;/p&gt; &lt;p&gt;&lt;font face="Courier New" color="#008000" size="2"&gt;&amp;nbsp;&amp;nbsp; ddlEstNoticia.DataSource = NOTAgente.ListarEstadosNoticia();&lt;/font&gt;&lt;/p&gt; &lt;p&gt;Saludos,&lt;/p&gt;
&lt;br /&gt; Post cruzado&lt;img src="http://geeks.ms/aggbug.aspx?PostID=8342" width="1" height="1"&gt;</description><category domain="http://geeks.ms/blogs/sergiotarrillo/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://geeks.ms/blogs/sergiotarrillo/archive/tags/Ado.NET/default.aspx">Ado.NET</category><category domain="http://geeks.ms/blogs/sergiotarrillo/archive/tags/Best+Practices/default.aspx">Best Practices</category></item><item><title>iniciando un valor enum a null? ( .NET)</title><link>http://geeks.ms/blogs/sergiotarrillo/archive/2006/12/22/7851.aspx</link><pubDate>Fri, 22 Dec 2006 18:58:48 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:7851</guid><dc:creator>Sergio Tarrillo</dc:creator><slash:comments>2</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/sergiotarrillo/rsscomments.aspx?PostID=7851</wfw:commentRss><comments>http://geeks.ms/blogs/sergiotarrillo/archive/2006/12/22/7851.aspx#comments</comments><description>&lt;p&gt;Es de hecho que muchas veces usaremos &lt;strong&gt;enum&lt;/strong&gt;, para grupos de código, y es una buena práctica hacerlo. Y es que es útil a simple vista, cuando usamos un mensajes en Windows Forms, con la enumeración &lt;strong&gt;MessageBoxButtons&lt;/strong&gt;, elegimos cuantos botones deseamos que tenga la ventana de diálogo. Además que también sirve como filtro y ayuda a protegerse de un input indeseado del usuario. También hay la opción de que un valor de una&amp;nbsp;&lt;a href="http://msdn2.microsoft.com/es-es/library/sbbt4032(VS.80).aspx" target="_blank"&gt;enumeración&lt;/a&gt; tenga opciones múltiples,&amp;nbsp;lo hace manejandolo como&amp;nbsp;bits,&amp;nbsp;para eso usamos el atributo &lt;a href="http://msdn2.microsoft.com/es-es/library/system.flagsattribute(VS.80).aspx" target="_blank"&gt;Flags&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;Ahora pero que pasa si quiere iniciar la variable &lt;strong&gt;enum&lt;/strong&gt; en&amp;nbsp;null, y es lo mismo que pasa cuando queremos iniciar una fecha en null. Sobre todo en el manejo de capas, para pasar variables entre capas muchas veces se debe colocar una fecha a la mala, aunque no uses la variable y aunque no es un problema no es lo ideal.&lt;/p&gt; &lt;p&gt;Y es así&amp;nbsp;que&amp;nbsp;surgen&amp;nbsp;&lt;a href="http://msdn2.microsoft.com/es-es/library/system.nullable(VS.80).aspx" target="_blank"&gt;nullable types&lt;/a&gt;, en un post &lt;a href="http://blogs.3devnet.com/blogs/starrillo/archive/2006/06/01/191.aspx" target="_blank"&gt;anterior&lt;/a&gt;&amp;nbsp;ya hemos hablado de ellos. Ahora, como usamos los nullable types en el manejo de capas, pues&amp;nbsp;lo pueden encontrar usando el &lt;a href="http://msdn.microsoft.com/msdnmag/issues/06/12/ServiceStation/Default.aspx?loc=es" target="_blank"&gt;Web Service Software Factory&lt;/a&gt;. En &lt;a href="http://www.gotdotnet.com/" target="_blank"&gt;gotdotnet&lt;/a&gt; podemos encontrar unos HOLs de como usar el &lt;a href="http://www.gotdotnet.com/codegallery/codegallery.aspx?id=6fde9247-53a8-4879-853d-500cd2d97a83" target="_blank"&gt;Service Factory&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;Ah por cierto si comparamos un tipo&amp;nbsp;valor con null, siempre será falso, ya que un tipo valor nunca es null. Es por eso que se&amp;nbsp;hace necesario el usar &lt;strong&gt;nullable types&lt;/strong&gt;. También se puede usar &lt;a href="http://msdn2.microsoft.com/es-es/library/ah19swz4(VS.80).aspx" target="_blank"&gt;struct&lt;/a&gt; con nullable, pero hay unos artificios que tienes que hacer.&lt;/p&gt; &lt;p&gt;Ahora veamos como lo usaría la enumeración &lt;strong&gt;Mes&lt;/strong&gt;:&lt;/p&gt; &lt;p&gt;&lt;font face="Courier New" color="#008000"&gt;&amp;nbsp;&amp;nbsp; Nullable&amp;lt;Mes&amp;gt; m2 = null;&lt;br&gt;&amp;nbsp;&amp;nbsp; Console.WriteLine("m2 {0}", (m2.HasValue) ? "no es nulo" : "es nulo");&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp; m2 = Mes.Febrero; &lt;br&gt;&amp;nbsp;&amp;nbsp; if (m2 != null)&lt;br&gt;&amp;nbsp;&amp;nbsp; {&amp;nbsp;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Console.WriteLine("el valor de m2 es: {0}", (int)m2);&lt;br&gt;&amp;nbsp;&amp;nbsp; }&lt;/font&gt;&lt;/p&gt; &lt;p&gt;Obviamente que una enumeración Mes, parece del curso de estructura de datos, pero ya en un ambiente real, podríamos usar una enumeración para un post o noticia, es decir noPublicada, Publicada, Spam, etc. De esa manera en todo mi sistema de capas&amp;nbsp;no tengo porque recordar que código era el estado de noticia publicada, para eso uso una enumeración. Pero al final en la base de datos lo que quiero es el código es decir el (int).&lt;/p&gt; &lt;p&gt;Saludos,&lt;/p&gt;
&lt;br /&gt; Post cruzado&lt;img src="http://geeks.ms/aggbug.aspx?PostID=7851" width="1" height="1"&gt;</description><category domain="http://geeks.ms/blogs/sergiotarrillo/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://geeks.ms/blogs/sergiotarrillo/archive/tags/Best+Practices/default.aspx">Best Practices</category></item><item><title>typeof vs if... y el limpiado (clear) de controles</title><link>http://geeks.ms/blogs/sergiotarrillo/archive/2006/12/14/7518.aspx</link><pubDate>Thu, 14 Dec 2006 19:01:00 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:7518</guid><dc:creator>Sergio Tarrillo</dc:creator><slash:comments>9</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/sergiotarrillo/rsscomments.aspx?PostID=7518</wfw:commentRss><comments>http://geeks.ms/blogs/sergiotarrillo/archive/2006/12/14/7518.aspx#comments</comments><description>&lt;P&gt;leyendo el post de &lt;A href="http://geeks.ms/blogs/jberrocal/default.aspx" target=_blank&gt;JuanFco&lt;/A&gt;, &lt;A href="http://geeks.ms/blogs/jberrocal/archive/2006/12/14/limpiar-informacion-de-los-controles-textbox-s-rapidamente.aspx" target=_blank&gt;Limpiar informacion de los controles (TextBox's) Rapidamente&lt;/A&gt;, y debido a que&amp;nbsp;mi comentario se puso muy técnico, aproveche para hacer un post.&lt;/P&gt;
&lt;P&gt;Cuanto tenía que hacer este tipo de cosas, limpiar masivamente&amp;nbsp;usaba el mismo código pero con la comparación distinta, que me paso un amigo en un proyecto: &lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" color=#008000&gt;if ( c.GetType() == typeof(TextBox) ) {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; c.Text = "";&lt;BR&gt;}&lt;/FONT&gt; 
&lt;P&gt;Según la definición de "&lt;STRONG&gt;is&lt;/STRONG&gt;" &amp;lt;&lt;A href="http://msdn2.microsoft.com/es-es/library/scekt9xw(VS.80).aspx"&gt;http://msdn2.microsoft.com/es-es/library/scekt9xw(VS.80).aspx&lt;/A&gt;&amp;gt; realiza una conversión para comprobar si "c" es del tipo TextBox (según lo que interprete, salvo que el "y" sea conclusión y no conjunción :S). Parece que tiene más utilidad cuando vas a realizar conversiones y quieres comprobar si ese tipo es el que tu quieres. 
&lt;P&gt;Estuve probando los tiempos de diferencia y sólo en casos muy extremos hay ligera diferencia donde "&lt;STRONG&gt;is&lt;/STRONG&gt;" toma unas milesimas de segundo más que "&lt;STRONG&gt;typeof&lt;/STRONG&gt;". 
&lt;P&gt;Y cómo todos ustedes se deben estar preguntando entonces, que uso &lt;STRONG&gt;typeof&lt;/STRONG&gt; o &lt;STRONG&gt;is&lt;/STRONG&gt;?, pués ya iba a terminar de enviar el comentario, y lanzar una idea de sentido común, y era que &lt;STRONG&gt;is&lt;/STRONG&gt; podría reconocer herencia de clases. Y nada le puse manos a la obra, y mi sentido común tenia razón, &lt;STRONG&gt;is&lt;/STRONG&gt; reconoce herencia: 
&lt;P&gt;Falso, de toda falsedad: &lt;FONT face="Courier New" color=#008000&gt;( textBox1.GetType() == typeof(Control) )&lt;/FONT&gt; 
&lt;P&gt;Comprobado, &lt;STRONG&gt;is&lt;/STRONG&gt; reconoce herencia: &lt;FONT face="Courier New" color=#008000&gt;( textBox1 is Control )&lt;/FONT&gt; 
&lt;P&gt;Saludos,&lt;/P&gt;&lt;BR&gt;Post cruzado&lt;img src="http://geeks.ms/aggbug.aspx?PostID=7518" width="1" height="1"&gt;</description><category domain="http://geeks.ms/blogs/sergiotarrillo/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://geeks.ms/blogs/sergiotarrillo/archive/tags/Best+Practices/default.aspx">Best Practices</category></item><item><title>tip ASP.NET: reducir el tamanio de las paginas Web generadas</title><link>http://geeks.ms/blogs/sergiotarrillo/archive/2006/11/20/6607.aspx</link><pubDate>Mon, 20 Nov 2006 15:44:00 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:6607</guid><dc:creator>Sergio Tarrillo</dc:creator><slash:comments>3</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/sergiotarrillo/rsscomments.aspx?PostID=6607</wfw:commentRss><comments>http://geeks.ms/blogs/sergiotarrillo/archive/2006/11/20/6607.aspx#comments</comments><description>&lt;P&gt;leyendo a &lt;A href="http://ecuador.latindevelopers.net/blogs/edgarsanchez/default.aspx" target=_blank&gt;Edgar Sánchez&lt;/A&gt;, me encontre con un post interesante: &lt;A href="http://ecuador.latindevelopers.net/blogs/edgarsanchez/archive/2006/11/13/Consejos-para-reducir-el-tama_F100_o-de-las-p_E100_ginas-Web-en-ASP.NET.aspx" target=_blank&gt;Consejos para reducir el tamaño de las páginas Web en ASP.NET&lt;/A&gt;.&lt;/P&gt;
&lt;P&gt;Y como menciona el &lt;A href="http://20.targetprocess.com/2006/11/aspnet-performance-reducing-size-of.html" target=_blank&gt;post fuente&lt;/A&gt;, hay algunas cosas que son obvias, pero también es obvio que muy pocas veces lo aplicamos. &lt;/P&gt;
&lt;P&gt;Algunas ya las recomendaba en las charlas, otras aún no, pero será hora de&amp;nbsp;hacer un tasklist&amp;nbsp;de mejores prácticas&amp;nbsp;para reducir el tamanio de del HTML generado.&lt;/P&gt;
&lt;P&gt;Si alguién tiene mas tips, los deja en los comentarios.&lt;/P&gt;
&lt;P&gt;P.D.: Si es que por ahi hay un tiempito, y si los comentarios lo ameritan, haré un howto aplicando y comprobando las reglas mencionadas.&lt;/P&gt;
&lt;P&gt;Saludos,&lt;/P&gt;&lt;BR&gt;Post cruzado desde &lt;A href="http://blogs.3devnet.com/blogs/starrillo/default.aspx"&gt;starrillo blog&lt;/A&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=6607" width="1" height="1"&gt;</description><category domain="http://geeks.ms/blogs/sergiotarrillo/archive/tags/ASP.NET/default.aspx">ASP.NET</category><category domain="http://geeks.ms/blogs/sergiotarrillo/archive/tags/Best+Practices/default.aspx">Best Practices</category></item><item><title>cadenas de conexion desde .NET para SQL Server 2005</title><link>http://geeks.ms/blogs/sergiotarrillo/archive/2006/11/16/cadenas-de-conexion-desde-net-para-sql-server-2005.aspx</link><pubDate>Thu, 16 Nov 2006 06:02:00 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:6377</guid><dc:creator>Sergio Tarrillo</dc:creator><slash:comments>40</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/sergiotarrillo/rsscomments.aspx?PostID=6377</wfw:commentRss><comments>http://geeks.ms/blogs/sergiotarrillo/archive/2006/11/16/cadenas-de-conexion-desde-net-para-sql-server-2005.aspx#comments</comments><description>&lt;p&gt;&lt;b&gt;&lt;span style="color:red;"&gt;[2010-Abr-30] NOTA&lt;/span&gt;&lt;/b&gt;: Si est&amp;aacute;n recibiendo el error: &amp;quot;&lt;i&gt;Error mientras se establec&amp;iacute;a la conexi&amp;oacute;n con el servidor. Al conectar 
con SQL Server 2005, el error se puede producir porque la configuraci&amp;oacute;n 
predeterminada de SQL Server no admite conexiones remotas&lt;/i&gt;&amp;quot;. Por favor, revisen la siguiente entrada: &lt;a target="_blank" title="habilitando (o administrando) las conexiones remotas en SQL Server 2005" href="http://geeks.ms/blogs/sergiotarrillo/archive/2006/11/27/6779.aspx"&gt;habilitando (o administrando) las conexiones remotas en SQL Server 
2005&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;si es que estamos usando SQLExpress, y estamos creando una aplicaci&amp;oacute;n .NET para el acceso a datos, hay que tener algunas consideraciones adicionales&amp;nbsp;a la hora de conectarnos a la base de datos.&lt;/p&gt;
&lt;p&gt;Dentro de las aplicaciones Windows, con VS2005,&amp;nbsp;hay la opci&amp;oacute;n de agregar un &amp;Iacute;tem SQL Database, pero s&amp;oacute;lo est&amp;aacute; disponible si has instalado SQLExpress. En este caso la cadena de conexi&amp;oacute;n ha&amp;nbsp;cambiado ligeramente. Como nos mantenemos actualizados? visitando: &lt;a title="http://www.connectionstrings.com/" href="http://www.connectionstrings.com/"&gt;http://www.connectionstrings.com/&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Aqu&amp;iacute; pondr&amp;eacute; algunos res&amp;uacute;menes de las cadenas para SQL Server 2005, desde .NET:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;b&gt;Seguridad Est&amp;aacute;ndar&lt;br /&gt;&lt;/b&gt;&amp;quot;Data Source=Aron1; Initial Catalog=pubs; User Id=myUsername; Password=myPassword;&amp;quot; 
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Conexi&amp;oacute;n Segura&lt;br /&gt;&lt;/b&gt;&amp;quot;Data Source=Aron1; Initial Catalog=pubs; Integrated Security=SSPI;&amp;quot; 
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Conexi&amp;oacute;n via IP&lt;/b&gt;&lt;br /&gt;&amp;quot;Data Source=190.190.200.100,1433; Network Library=DBMSSOCN; Initial Catalog=pubs; User ID=myUsername; Password=myPassword;&amp;quot; 
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Adjuntando una base de datos, para conectarnos a SQL Express&lt;/b&gt; (caso mencionado arriba)&lt;br /&gt;&amp;quot;Server=.\SQLExpress; AttachDbFilename=|DataDirectory|mydbfile.mdf; Database=dbname; Trusted_Connection=Yes;&amp;quot; &lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Ahora con respecto&amp;nbsp;a las conexiones hay algunas cosas que&amp;nbsp;hay que tener en cuenta, y mejores pr&amp;aacute;cticas que aplicar:&lt;/p&gt;
&lt;p&gt;En el caso 01 y 03, &amp;nbsp;la conexi&amp;oacute;n al contener el usuario y password, hace que este sea altamente inseguro, imaginemos en el hipot&amp;eacute;tico de los casos que alguien tiene acceso a la cadena&amp;nbsp;conexi&amp;oacute;n, tendr&amp;aacute; autom&amp;aacute;ticamente el login de SQL, bueno las cosas que pueda hacer depender&amp;aacute; del usuario que la encontr&amp;oacute;. En estos casos hay ciertas pr&amp;aacute;cticas que debemos seguir, como es la encriptaci&amp;oacute;n de archivos de configuraci&amp;oacute;n, que es generalmente donde se guardan las conexiones, aunque algunos prefieran guardarlo en el Regedit:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.developer.com/net/vb/article.php/3500906" target="_blank"&gt;Encrypt Connection Strings in VS 2005 .config Files&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://davidhayden.com/blog/dave/archive/2005/11/17/2572.aspx" target="_blank"&gt;Encrypt Connection Strings AppSettings and Web.Config in ASP.NET 2.0 - Security Best Practices&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://msdn2.microsoft.com/en-gb/library/dx0f3cf2.aspx" target="_blank"&gt;How to: Secure Connection Strings When Using Data Source Controls&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.ondotnet.com/pub/a/dotnet/2005/02/15/encryptingconnstring.html" target="_blank"&gt;Encrypting Connection Strings in Web.config&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Con respecto a la cadena de conexi&amp;oacute;n para SQLExpress, he recibido algunas consultas sobre donde se debe colocar el archivo, en la ra&amp;iacute;z de la aplicaci&amp;oacute;n o en el bin?, ya que ha estado generando algunos&amp;nbsp;problemillas. En el&amp;nbsp;&lt;a href="http://geeks.ms/blogs/sergiotarrillo/archive/2006/10/29/5373.aspx" target="_blank"&gt;post&lt;/a&gt; que hice usando SQL Express, el&amp;nbsp;asistente genero la ruta absoluta del archivo, lo ideal es trabajar con la relativa para hacer que la aplicaci&amp;oacute;n sea portable. Para m&amp;aacute;s detalles podemos revisar los siguientes post del equipo de &lt;a href="http://blogs.msdn.com/smartclientdata/default.aspx" target="_blank"&gt;Smart Client&lt;/a&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://blogs.msdn.com/smartclientdata/archive/2005/08/26/456886.aspx" target="_blank"&gt;Working with local databases&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://blogs.msdn.com/smartclientdata/archive/2005/07/25/443034.aspx" target="_blank"&gt;Customizing the connection string for TableAdapters&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Saludos,&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;Post cruzado desde &lt;a href="http://blogs.3devnet.com/blogs/starrillo/default.aspx"&gt;starrillo blog&lt;/a&gt;&lt;/p&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=6377" width="1" height="1"&gt;</description><category domain="http://geeks.ms/blogs/sergiotarrillo/archive/tags/ASP.NET/default.aspx">ASP.NET</category><category domain="http://geeks.ms/blogs/sergiotarrillo/archive/tags/SQL+Server/default.aspx">SQL Server</category><category domain="http://geeks.ms/blogs/sergiotarrillo/archive/tags/Visual+Studio/default.aspx">Visual Studio</category><category domain="http://geeks.ms/blogs/sergiotarrillo/archive/tags/Ado.NET/default.aspx">Ado.NET</category><category domain="http://geeks.ms/blogs/sergiotarrillo/archive/tags/Best+Practices/default.aspx">Best Practices</category></item><item><title>Server.Transfer o Response.Redirect, para enviar a los usuarios a otra pagina?</title><link>http://geeks.ms/blogs/sergiotarrillo/archive/2006/09/30/4070.aspx</link><pubDate>Sat, 30 Sep 2006 17:58:00 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:4070</guid><dc:creator>Sergio Tarrillo</dc:creator><slash:comments>12</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/sergiotarrillo/rsscomments.aspx?PostID=4070</wfw:commentRss><comments>http://geeks.ms/blogs/sergiotarrillo/archive/2006/09/30/4070.aspx#comments</comments><description>&lt;p&gt;&lt;font size="2" face="Verdana"&gt;Ninguno &lt;img src="http://foros.solocodigo.com/html/emoticons/biggrin.gif" width="20" height="20" alt="" /&gt;, si sólo deseamos pasar un usuario a otro página y no vamos a cambiar el destino dinámicamente solo debemos usar &amp;lt;a href=&amp;quot;http://tu_link&amp;quot;&amp;gt;tu Link&amp;lt;/a&amp;gt;.&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font size="2" face="Verdana"&gt;Es que, hay algo que se debe entender y debe&amp;nbsp;quedar claro, no porque ahora tengamos muchos controles de servidor, debemos usarlos todos, cada uno tiene su función y si no necesitamos procesamiento o alguna acción del lado del servidor, no hay porque usarlos, recuerden que al desarrollar aplicaciones web&amp;nbsp;hay consideraciones mínimas que debemos tener para que la experiencia del usuario al navegar en nuestro sitio web sea la mejor.&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font size="2" face="Verdana"&gt;Ahora, que hacemos si deseamos enviar al usuario a otra página, podemos&amp;nbsp;usar un link, como el mostrado arriba. Si nuestro link será dinámico, si usar un control HyperLink o si queremos asignar programáticamente nuestros links podríamos usar Response.Redirect. La idea de Server.Transfer digamos que no es un reenviar propiamente dicho, sino un reenviar y pero mantener la información de la página origen.&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font size="2" face="Verdana"&gt;Pero veamos un caso, el cual nació a través de una mail que me enviaron, y que es el origen de este post:&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Verdana"&gt;&lt;font size="2"&gt;&lt;u&gt;Caso&lt;/u&gt;: &lt;em&gt;Veras Sergio, estoy en el capitulo de los “Themes”, lo que quiero hacer es que el usuario pueda elegir en el “dropdownlist” el color de “theme” que desea aplicar a una segunda página, cuando el usuario elija el color del “theme” lo REDIRECCIONO a una segunda página que tiene unos objetos que tomaran el color del “theme”&lt;/em&gt;.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Verdana"&gt;&lt;font size="2"&gt;&lt;u&gt;Los problemas que tengo&lt;/u&gt;&lt;em&gt;:&lt;/em&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;&lt;font size="2" face="Verdana"&gt;Si utilizo&amp;nbsp; Server.Transfer(&amp;quot;pagina2.aspx&amp;quot;) La barra de navegación del navegador (URL)&amp;nbsp; NOOOO MUESTRA la dirección de la página,&amp;nbsp; sino que se queda con la direccion de la primera. El color del “theme” SI funciona y se aplica a los objetos.&lt;/font&gt;&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;&lt;font size="2" face="Verdana"&gt;Si utilizo&amp;nbsp; Response.Redirect(&amp;quot;pagina2.aspx&amp;quot;) La barra de navegación del navegador (URL)&amp;nbsp; SIIIII MUESTRA la dirección de la página,&amp;nbsp; PERO El color del “theme” NOOOOOO funciona y por lo tanto los objetos se quedan con el color por default que tienen.&lt;/font&gt;&lt;/em&gt;&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;&lt;font size="2" face="Verdana"&gt;Ejecute el código enviado y pues si, ocurría lo que se&amp;nbsp;mencionaba, pero examinemos el código de la página origen:&lt;/font&gt;&lt;/p&gt;
&lt;blockquote style="MARGIN-RIGHT:0px;" dir="ltr"&gt;
&lt;p&gt;&lt;font size="2"&gt;&lt;font face="Courier New"&gt;&lt;font color="#0000ff"&gt;Protected&lt;/font&gt; &lt;font color="#0000ff"&gt;Sub&lt;/font&gt; DropDownList1_SelectedIndexChanged( &lt;font color="#0000ff"&gt;... &lt;/font&gt;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/font&gt;&lt;/font&gt;&lt;font size="2" face="Courier New"&gt;Server.Transfer(&lt;font color="#800000"&gt;&amp;quot;pagina1.aspx&amp;quot;&lt;/font&gt;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/font&gt;&lt;font size="2"&gt;&lt;font face="Courier New"&gt;&lt;font color="#008000"&gt;&amp;#39;Response.Redirect(&amp;quot;pagina1.aspx&amp;quot;) &lt;br /&gt;&lt;/font&gt;&lt;font color="#0000ff"&gt;End&lt;/font&gt; &lt;font color="#0000ff"&gt;Sub&lt;font face="Verdana"&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;&lt;font size="2" face="Verdana"&gt;Además hay un combo que contiene los valores: Azul, Verde, y Rojo. Al seleccionar un valor del combo se muestra el contenido de la otra página, el código que usa es el siguiente:&lt;/font&gt;&lt;/p&gt;
&lt;blockquote style="MARGIN-RIGHT:0px;" dir="ltr"&gt;
&lt;p&gt;&lt;font size="2"&gt;&lt;font face="Courier New"&gt;&lt;font color="#0000ff"&gt;Sub&lt;/font&gt; Page_PreInit(&lt;font color="#0000ff"&gt;ByVal&lt;/font&gt; sender &lt;font color="#0000ff"&gt;As&lt;/font&gt; &lt;font color="#0000ff"&gt;Object&lt;/font&gt;, &lt;font color="#0000ff"&gt;ByVal&lt;/font&gt; e &lt;font color="#0000ff"&gt;As&lt;/font&gt; EventArgs)&lt;br /&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;&lt;font face="Courier New"&gt;&amp;nbsp;&amp;nbsp; Page.Theme = Request(&lt;font color="#800000"&gt;&amp;quot;menucolor&amp;quot;&lt;/font&gt;)&lt;br /&gt;&lt;font color="#0000ff"&gt;End&lt;/font&gt; &lt;font color="#0000ff"&gt;Sub&lt;font face="Verdana"&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;&lt;font size="2" face="Verdana"&gt;Efectivamente este código funciona, pero porque no funciona cuando comento el Server y descomento el Response? &lt;img src="http://forums.asp.net/emoticons/emotion-42.gif" width="19" height="19" alt="" /&gt;, misterios sin resolver? &lt;img src="http://forums.asp.net/emoticons/emotion-43.gif" width="19" height="19" alt="" /&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font size="2" face="Verdana"&gt;A ver primeros examinemos porque funciona, y después&amp;nbsp;porque no funciona con Response.Redirect:&lt;/font&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;font size="2" face="Verdana"&gt;Lo que hace un Server.Transfer, es transferir el actual contexto a una página destino, pero solo se muestra la página destino. La ventaja esta en que se puede recuperar los valores del form, y controles de la página de origen [URL01].&lt;/font&gt;&lt;/li&gt;
&lt;li&gt;&lt;font size="2" face="Verdana"&gt;Request(&amp;quot;menucolor&amp;quot;), porqué devuelve el color?, si solo ponemos el nombre del control?. Lo que esta pasando es como si hubiera colocado un boton html &lt;u&gt;submit&lt;/u&gt;, y hubiéramos enviado todo el form, es por eso que al hacer Request(&amp;quot;menucolor&amp;quot;), nos devuelve el valor seleccionado del control generado en html, un SELECT. Si por ejemplo agregáramos un control label y quiséramos recuperar la propiedad Text, no podríamos porque este genera una etiqueta html &lt;u&gt;SPAN&lt;/u&gt;, en cambio con un control TextBox si se podría recuperar la propiedad Text, porque el TextBox genera un control &lt;u&gt;INPUT&lt;/u&gt; de tipo text.&lt;/font&gt;&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;&lt;font size="2" face="Verdana"&gt;Pero como funcionaría esto, usando Response.Redirect?&lt;/font&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;font size="2" face="Verdana"&gt;Al usar Response.Redirect, lo que pasa es como si hubiéramos colocado un link, y hubiéramos pulsado el link [URL02], la ventaja esta en que se puede hacer programáticamente.&lt;/font&gt;&lt;/li&gt;
&lt;li&gt;&lt;font size="2" face="Verdana"&gt;Ahora en este caso si queremos que cuando se cambie el combo se vaya a la otra página usamos Response.Redirect, en caso contrario podríamos usar un HyperLink, el cuál&amp;nbsp;sería programáticamente,&amp;nbsp;se cambiaría la&amp;nbsp;propiedad NavigateUrl, dependiendo que seleccione en el combo, después usando el link iríamos a la otra página. Esta última opción daría como ventaja que podríamos usar las propiedades un link, como target, entre otras.&lt;/font&gt;&lt;/li&gt;
&lt;li&gt;&lt;font size="2" face="Verdana"&gt;Vamos hacerlo directamente en el combo, enviando valores directamente por la URL:&lt;/font&gt;&lt;/li&gt;&lt;/ul&gt;
&lt;blockquote style="MARGIN-RIGHT:0px;" dir="ltr"&gt;
&lt;p&gt;&lt;font size="2"&gt;&lt;font face="Courier New"&gt;&lt;font color="#0000ff"&gt;Protected&lt;/font&gt; &lt;font color="#0000ff"&gt;Sub&lt;/font&gt; DropDownList1_SelectedIndexChanged(&lt;font color="#0000ff"&gt;...&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size="2" face="Courier New"&gt;)&lt;br /&gt;&amp;nbsp;&amp;nbsp; &lt;/font&gt;&lt;font size="2"&gt;&lt;font face="Courier New"&gt;&lt;font color="#008000"&gt;&amp;#39;Server.Transfer(&amp;quot;pagina1.aspx&amp;quot;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;Response.Redirect(&lt;font color="#800000"&gt;&amp;quot;pagina1.aspx?colortema=&amp;quot;&lt;/font&gt; + menucolor.Text)&lt;/font&gt;&lt;/font&gt;&lt;font color="#0000ff"&gt;&lt;br /&gt;&lt;font size="2" face="Courier New"&gt;End&lt;/font&gt;&lt;/font&gt;&lt;font face="Verdana"&gt;&lt;font size="2"&gt;&lt;font face="Courier New"&gt; &lt;font color="#0000ff"&gt;Sub&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;/blockquote&gt;
&lt;ul&gt;
&lt;li&gt;&lt;font size="2" face="Verdana"&gt;Y para recuperar las variables en la página destino sería de la siguiente manera:&lt;/font&gt;&lt;/li&gt;&lt;/ul&gt;
&lt;blockquote style="MARGIN-RIGHT:0px;" dir="ltr"&gt;
&lt;p&gt;&lt;font face="Courier New"&gt;&lt;font size="2"&gt;&lt;font color="#0000ff"&gt;Protected&lt;font color="#000000"&gt; &lt;/font&gt;Sub&lt;/font&gt; Page_PreInit(&lt;font color="#0000ff"&gt;...&lt;/font&gt;)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Page.Theme = Request.QueryString(&lt;font color="#800000"&gt;&amp;quot;colortema&amp;quot;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;&lt;font face="Courier New"&gt;)&lt;br /&gt;&lt;font color="#0000ff"&gt;End&lt;/font&gt; &lt;font color="#0000ff"&gt;Sub&lt;font face="Verdana"&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;/blockquote&gt;
&lt;ul&gt;
&lt;li&gt;&lt;font size="2" face="Verdana"&gt;Podríamos usar también directamente Request(&amp;quot;colortema&amp;quot;), pero QueryString, es más específico para variables en la URL, ya que nos puede devolver en un arreglo de strings todas las variables de la URL, o el número de variables enviadas por la URL.&lt;/font&gt;&lt;/li&gt;
&lt;li&gt;&lt;font size="2" face="Verdana"&gt;Con Response.Redirect, la url que aparece en el navegador es la de la página destino, y no de la página origen como si es el caso con Server.Transfer.&lt;/font&gt;&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;&lt;font size="2" face="Verdana"&gt;Mas sobre Server.Transfer vs. Response.Redirect, &lt;/font&gt;&lt;a href="http://search.live.com/results.aspx?q=Response.Redirect+Server.Transfer&amp;amp;src=IE-SearchBox"&gt;&lt;font size="2" face="Verdana"&gt;aquí&lt;/font&gt;&lt;/a&gt;&lt;font size="2" face="Verdana"&gt;. Pero un debate interesante es el &lt;/font&gt;&lt;a href="http://geekswithblogs.net/caustin/archive/2005/09/28/55417.aspx"&gt;&lt;font size="2" face="Verdana"&gt;siguiente&lt;/font&gt;&lt;/a&gt;&lt;font size="2" face="Verdana"&gt;, y una definición de ellos &lt;/font&gt;&lt;a href="http://weblogs.asp.net/jgalloway/archive/2004/07/21/189547.aspx"&gt;&lt;font size="2" face="Verdana"&gt;acá&lt;/font&gt;&lt;/a&gt;&lt;font size="2" face="Verdana"&gt;.&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font size="2" face="Verdana"&gt;P.D.: Pediría que si en el futuro tengan dudas,&amp;nbsp;en primera instancia&amp;nbsp;las envíen&amp;nbsp;a los foros, muchos de los temas ya fueron tocados por otra persona en otros post, y solo es cuestión de buscar y revisar la solución. Muchas veces es difícil, para mi, contestar rápidamente los mails de consulta, en cambio en un foro, hay muchos usuarios que podrían resolver la duda, además que hay mas variedad de opiniones. Tenemos&amp;nbsp;foros muy buenos en espaniol, como el del Guille: &lt;/font&gt;&lt;a href="http://foros.elguille.info/"&gt;&lt;font size="2" face="Verdana"&gt;http://foros.elguille.info&lt;/font&gt;&lt;/a&gt;&lt;font size="2" face="Verdana"&gt;, y los de solocodigo: &lt;/font&gt;&lt;a href="http://foros.solocodigo.com/index.php?showforum=169"&gt;&lt;font size="2" face="Verdana"&gt;http://foros.solocodigo.com/index.php?showforum=169&lt;/font&gt;&lt;/a&gt;&lt;font size="2" face="Verdana"&gt;.&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font size="2" face="Verdana"&gt;Referencias:&lt;/font&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;font size="2" face="Verdana"&gt;[URL02]: &lt;/font&gt;&lt;a href="http://msdn2.microsoft.com/es-es/library/x3x8t37x.aspx"&gt;&lt;font size="2" face="Verdana"&gt;Redirigir a los usuarios a otra página&lt;/font&gt;&lt;/a&gt;&lt;font size="2" face="Verdana"&gt;.&lt;/font&gt;&lt;/li&gt;
&lt;li&gt;&lt;font size="2" face="Verdana"&gt;[URL01]: &lt;/font&gt;&lt;a href="http://www.odetocode.com/Articles/421.aspx"&gt;&lt;font size="2" face="Verdana"&gt;Design Considerations for Cross Page Post Backs in ASP.NET 2.0&lt;/font&gt;&lt;/a&gt;&lt;font size="2" face="Verdana"&gt;.&lt;/font&gt;&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;&lt;font size="2" face="Verdana"&gt;Saludos,&lt;/font&gt;&lt;/p&gt;&lt;br /&gt;Post cruzado desde &lt;a href="http://blogs.3devnet.com/blogs/starrillo/default.aspx"&gt;starrillo blog&lt;/a&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=4070" width="1" height="1"&gt;</description><category domain="http://geeks.ms/blogs/sergiotarrillo/archive/tags/ASP.NET/default.aspx">ASP.NET</category><category domain="http://geeks.ms/blogs/sergiotarrillo/archive/tags/Best+Practices/default.aspx">Best Practices</category></item></channel></rss>