﻿<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0">
  <channel>
    <title>Subgurim.NET</title>
    <link>http://www.subgurim.net</link>
    <description>Blog ASP.NET 2.0 con C# en castellano</description>
    <ttl>1200</ttl>
    <language>es</language>
    <generator>RSS.Subgurim.NET 1.1</generator>
    <item>
      <title>Hacer un RadioButton dentro de un Repeater</title>
      <description>Estos últimos días me he estado peleando con una cosilla algo rara en Todoexpertos. Y es que a veces ASP.NET tiene algunas cosas que te dan ganas de tirarte de los pelos... o tirarle de los pelos a &lt;a href="http://weblogs.asp.net/scottgu/" target="_blank" rel="nofollow"&gt;ScottGu&lt;/a&gt; (aunque no tenga muchos).&lt;br /&gt;&lt;br /&gt;Mi objetivo era bien sencillo. En lugar de utilizar un control RadioButtonList, lo que yo quería era generar diferentes RadioButtons usando el control Repeater, de modo que cuando seleccionas en cualquier RadioButton, el que estaba seleccionado previamente (si lo había) se deseleccionase, y sólo quedara uno.&lt;br /&gt;&lt;br /&gt;Esto es algo bastante típico y muy sencillo de llevar a cabo, sin más que ponerle a todos los RadioButton el mismo &amp;quot;GroupName&amp;quot;, que se acaba convirtiendo en el atributo &amp;quot;name&amp;quot; en HTML.&lt;br /&gt;&lt;br /&gt;Pero ahora viene el problema, y es que al estar dentro de un Repeater, ASP.NET va generando un prefijo único al name (al igual que hace con el ID), de modo que no es posible que todos tengan el mismo name, por mucho GroupName que especifiques.&lt;br /&gt;&lt;br /&gt;Tan sencillo como lo quería, tan sencillo como ASP.NET hacía la puñeta.&lt;br /&gt;&lt;br /&gt;Pero bueno, menos mal que javascript y yo somos bastante amigos y pronto Googleé una solución que no tuve más que modificar a mi gusto. &lt;br /&gt;&lt;br /&gt;La función javascript que utilicé es el siguiente:&lt;br /&gt;&lt;br style="font-style: italic;" /&gt;&lt;span style="font-style: italic;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; function SetUniqueRadioButton(nameregex, rid)&lt;/span&gt;&lt;br style="font-style: italic;" /&gt;&lt;span style="font-style: italic;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/span&gt;&lt;br style="font-style: italic;" /&gt;&lt;span style="font-style: italic;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; re = new RegExp(nameregex);&lt;/span&gt;&lt;br style="font-style: italic;" /&gt;&lt;span style="font-style: italic;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; rb = document.getElementById(rid);&lt;/span&gt;&lt;br style="font-style: italic;" /&gt;&lt;span style="font-style: italic;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; var inputs = document.getElementsByTagName('input');&lt;/span&gt;&lt;br style="font-style: italic;" /&gt;&lt;span style="font-style: italic;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; for(i = 0; i &amp;lt; inputs.length; i++)&lt;/span&gt;&lt;br style="font-style: italic;" /&gt;&lt;span style="font-style: italic;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/span&gt;&lt;br style="font-style: italic;" /&gt;&lt;span style="font-style: italic;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; elm = inputs[i]&lt;/span&gt;&lt;br style="font-style: italic;" /&gt;&lt;span style="font-style: italic;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (elm.type == 'radio')&lt;/span&gt;&lt;br style="font-style: italic;" /&gt;&lt;span style="font-style: italic;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/span&gt;&lt;br style="font-style: italic;" /&gt;&lt;span style="font-style: italic;"&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; if (re.test(elm.name))&lt;/span&gt;&lt;br style="font-style: italic;" /&gt;&lt;span style="font-style: italic;"&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; {&lt;/span&gt;&lt;br style="font-style: italic;" /&gt;&lt;span style="font-style: italic;"&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;&amp;nbsp;&amp;nbsp; elm.checked = false;&lt;/span&gt;&lt;br style="font-style: italic;" /&gt;&lt;span style="font-style: italic;"&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; }&lt;/span&gt;&lt;br style="font-style: italic;" /&gt;&lt;span style="font-style: italic;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;br style="font-style: italic;" /&gt;&lt;span style="font-style: italic;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;br style="font-style: italic;" /&gt;&lt;span style="font-style: italic;"&gt;&amp;nbsp; &lt;/span&gt;&lt;br style="font-style: italic;" /&gt;&lt;span style="font-style: italic;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; rb.checked = true;&lt;/span&gt;&lt;br style="font-style: italic;" /&gt;&lt;span style="font-style: italic;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Y al radiobutton hay que ponerle esto dentro de su atributo &amp;quot;onclick&amp;quot;:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;onclick=&amp;quot;SetUniqueRadioButton('Repeater1.*', '&amp;quot; + RadioButton1.ClientID + &amp;quot;')&amp;quot;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Como vemos, por una parte le estamos pasando una expresión regular, y por otra el Identificador que Javascript sabrá leer.&lt;br /&gt;&lt;br /&gt;Lo que hace la función javascript es leer todos los elementos &amp;quot;input&amp;quot; de la página, se asegura de que sean de type &amp;quot;radio&amp;quot; y, de ser así, que cumplan la expresión regular. Siempre se le pone el checked=false, para, posteriormente, poner el checked=true a nuestro RadioButton.&lt;br /&gt;&lt;br /&gt;Ya sé la pregunta... ¿qué narices representa la expresión regular? Lo único que representa es el prefijo que el simpático de ASP.NET le va a poner a todo elemento que esté dentro del Repeater1. No tenéis más que poner el identificador del Repeater y ya está &lt;img src="http://www.subgurim.net/javascript/Obout/Editor_data/ed_icons/emoticons/hot.gif" /&gt;&lt;br /&gt;&lt;br /&gt;Espero que os sea útil.&lt;br /&gt;</description>
      <link>http://www.subgurim.net/Articulos/ajax-y-javascript/176/hacer-un-radiobutton-dentro-de-un-repeater.aspx</link>
      <pubDate>Mon, 05 May 2008 19:10:02 GMT</pubDate>
      <guid>http://www.subgurim.net/Articulos/ajax-y-javascript/176/hacer-un-radiobutton-dentro-de-un-repeater.aspx</guid>
    </item>
    <item>
      <title>iWhere: aplicación para Facebook</title>
      <description>Durante estas semanitas he estado trabajando en mis ratos libres en una aplicación muy chula para Facebook.&lt;br /&gt;&lt;br /&gt;Bueno, lo de chula lo digo yo, jeje.&lt;br /&gt;&lt;br /&gt;En realidad no se trata de una aplicación para Facebook sólo, sino que mi intención era usar &amp;quot;TodasLasCosasNuevas&amp;quot; que se me ocurrían, como todo tipo de mejoras de ASP.NET 3.5: expresiones lambda, el uso de &amp;quot;var&amp;quot;, inicializadores, LINQ para SQL, y demás cosillas que han dejado una respetable cosecha de potenciales artículos para este blog.&lt;br /&gt;&lt;br /&gt;En cuanto a programar para Facebook, he usado el &lt;a href="http://www.codeplex.com/FacebookToolkit" target="_blank" rel="nofollow"&gt;Facebook Developer Toolkit&lt;/a&gt;, en detrimento del &lt;a href="http://www.codeplex.com/FacebookNET" target="_blank" rel="nofollow"&gt;Facebook.NET&lt;/a&gt;. Prácticamente ambos hacen lo mismo, y por lo único por lo que me he decidido por el primero es porque tenían más descargas, más visitas y más actualizaciones (aunque eso no significa apenas nada).&lt;br /&gt;&lt;br /&gt;Lo único que tengo claro es que programar aplicaciones para Facebook usando el Toolkit es absolutamente sencillo. Apenas un par de cambios con respecto a programar en ASP.NET y ya está.&lt;br /&gt;&lt;br /&gt;En cuanto a la aplicación en sí, se trata de dar a conocer a tus amigos de dónde eres, sin más que elegir un punto en el mapa. Cuando has indicado de dónde eres, puedes ver de dónde son tus amigos en un mapa... obviamente un &lt;a href="http://googlemaps.subgurim.net/" target="_blank" rel="nofollow"&gt;mapa de Google&lt;/a&gt;, y así he aprovechado para utilizar mi propio control de &lt;a href="http://googlemaps.subgurim.net/" target="_blank" rel="nofollow"&gt;GoogleMaps para ASP.NET&lt;/a&gt; porque desde ya mismo comienzo con una nueva versión (por cierto, todavía estoy dudando en si sacar una pequeña nueva versión 2.8 o hacer un gran cambio con la versión 3.0).&lt;br /&gt;&lt;br /&gt;Por cierto... no he dicho la url de la aplicación, ¿no? Podéis accederla desde &lt;a href="http://apps.facebook.com/iwheere/" target="_blank" rel="nofollow"&gt;http://apps.facebook.com/iwheere/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Sí, tiene repetida la letra &amp;quot;e&amp;quot; porque Facebook requiere que la url de sus aplicaciones tenga más de 6 letras. Además es case sensitive... manda narices... en PHP tenía que estar hecho el Facebook ese, jaja.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Si queréis me podéis añadir como amigo (buscad a Subgurim) &lt;img src="http://www.subgurim.net/javascript/Obout/Editor_data/ed_icons/emoticons/smile.gif" /&gt;&lt;br /&gt;</description>
      <link>http://www.subgurim.net/Articulos/asp-net-3-5/175/iwhere-aplicacion-para-facebook.aspx</link>
      <pubDate>Mon, 05 May 2008 18:45:11 GMT</pubDate>
      <guid>http://www.subgurim.net/Articulos/asp-net-3-5/175/iwhere-aplicacion-para-facebook.aspx</guid>
    </item>
    <item>
      <title>Validar varios RadioButton</title>
      <description>Seguro que hay alguna forma de hacerlo más fácil, pero yo no la he encontrado... así que me puse manos a la obra y lo he hecho yo mismo... he de confesar que me gusta demasiado hacer las cosas por mí mismo, aunque ya esté hecho, simplemente por el hecho de aprender, por tener un control 100% de lo que sucede... y por haberlo hecho yo, jeje &lt;img src="http://www.subgurim.net/javascript/Obout/Editor_data/ed_icons/emoticons/angry.gif" /&gt;&lt;br /&gt;&lt;br /&gt;El caso es el siguiente: tenemos varios &lt;span style="font-weight: bold;"&gt;RadioButton &lt;/span&gt;diferentes, todos ellos pertenecientes al mismo GroupName, de modo que hacer click sobre uno de ellos implica que se desmarque el previamente elegido. &lt;br /&gt;&lt;br /&gt;Por ejemplo eso lo tenemos en Todoexpertos.com, cuando un usuario finaliza y puntúa la pregunta al experto puede darle una puntuación de 0 a 5 y para eso usamos 6 &lt;span style="font-weight: bold;"&gt;RadioButton&lt;/span&gt;'s, y &lt;span style="font-style: italic;"&gt;no queremos hacerlo&lt;/span&gt; usando el &lt;span style="font-weight: bold;"&gt;RadioButtonList&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Hasta ahora marcábamos por defecto una puntuación de 3 sobre 5... pero decidimos obligar al usuario a elegir una puntuación. Para ello requeríamos verificar, al hacer click sobre un Button, que se hubiera elegido una de las opciones.&lt;br /&gt;&lt;br /&gt;Lo primero que se viene a la cabeza es usar un RequiredFieldValidator, pero yo no encontré la forma de hacerlo para &lt;span style="font-weight: bold;"&gt;RadioButton&lt;/span&gt;'s separados... así que me puse manos a la obra con un pequeño Javascript.&lt;br /&gt;&lt;br /&gt;Os muestro el Javascript que lo utiliza, comentándolo sobre la marcha.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;/span&gt;&lt;br style="font-style: italic;" /&gt;&lt;span style="font-style: italic;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;br style="font-style: italic;" /&gt;&lt;span style="font-style: italic;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Valida que alguno de los elementos del mismo &amp;quot;groupname&amp;quot; haya sido elegido&lt;/span&gt;&lt;br style="font-style: italic;" /&gt;&lt;span style="font-style: italic;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; function validateRadioButtonList(groupname, message)&lt;/span&gt;&lt;br style="font-style: italic;" /&gt;&lt;span style="font-style: italic;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/span&gt;&lt;br style="font-style: italic;" /&gt;&lt;span style="font-style: italic;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Recogemos todos los elementos &amp;quot;input&amp;quot; de nuestra página&lt;/span&gt;&lt;br style="font-style: italic;" /&gt;&lt;span style="font-style: italic;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; var inputs = document.getElementsByTagName(&amp;quot;input&amp;quot;);&lt;/span&gt;&lt;br style="font-style: italic;" /&gt;&lt;span style="font-style: italic;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; var hasItems = false;&lt;/span&gt;&lt;br style="font-style: italic;" /&gt;&lt;span style="font-style: italic;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;br style="font-style: italic;" /&gt;&lt;span style="font-style: italic;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Recorremos cada uno de los elementos, &lt;/span&gt;&lt;br style="font-style: italic;" /&gt;&lt;span style="font-style: italic;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; for (var i = 0; i &amp;lt; inputs.length; i++)&lt;/span&gt;&lt;br style="font-style: italic;" /&gt;&lt;span style="font-style: italic;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/span&gt;&lt;br style="font-style: italic;" /&gt;&lt;span style="font-style: italic;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // y seleccionamos si hay alguno de tipo &amp;quot;radio&amp;quot;&lt;/span&gt;&lt;br style="font-style: italic;" /&gt;&lt;span style="font-style: italic;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (inputs[i].type == 'radio')&lt;/span&gt;&lt;br style="font-style: italic;" /&gt;&lt;span style="font-style: italic;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/span&gt;&lt;br style="font-style: italic;" /&gt;&lt;span style="font-style: italic;"&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;&amp;nbsp;&amp;nbsp; // Verificamos que ese RadioButton pertenece al groupname especificado&lt;/span&gt;&lt;br style="font-style: italic;" /&gt;&lt;span style="font-style: italic;"&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;&amp;nbsp;&amp;nbsp; var name = inputs[i].name;&lt;/span&gt;&lt;br style="font-style: italic;" /&gt;&lt;span style="font-style: italic;"&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;&amp;nbsp;&amp;nbsp; var isFromGroup = (name.lastIndexOf(groupname) + groupname.length ) == name.length;&lt;/span&gt;&lt;br style="font-style: italic;" /&gt;&lt;span style="font-style: italic;"&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;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;br style="font-style: italic;" /&gt;&lt;span style="font-style: italic;"&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;&amp;nbsp;&amp;nbsp; // En de encontrar un RadioButton con el groupname...&lt;/span&gt;&lt;br style="font-style: italic;" /&gt;&lt;span style="font-style: italic;"&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;&amp;nbsp;&amp;nbsp; if (isFromGroup)&lt;/span&gt;&lt;br style="font-style: italic;" /&gt;&lt;span style="font-style: italic;"&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;&amp;nbsp;&amp;nbsp; {&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;br style="font-style: italic;" /&gt;&lt;span style="font-style: italic;"&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Marcamos que lo hemos encontrado&lt;/span&gt;&lt;br style="font-style: italic;" /&gt;&lt;span style="font-style: italic;"&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; hasItems = true;&lt;/span&gt;&lt;br style="font-style: italic;" /&gt;&lt;span style="font-style: italic;"&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;br style="font-style: italic;" /&gt;&lt;span style="font-style: italic;"&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Si hay alguno checkeado, devolver true&lt;/span&gt;&lt;br style="font-style: italic;" /&gt;&lt;span style="font-style: italic;"&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (inputs[i].checked)&lt;/span&gt;&lt;br style="font-style: italic;" /&gt;&lt;span style="font-style: italic;"&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/span&gt;&lt;br style="font-style: italic;" /&gt;&lt;span style="font-style: italic;"&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return true;&lt;/span&gt;&lt;br style="font-style: italic;" /&gt;&lt;span style="font-style: italic;"&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;br style="font-style: italic;" /&gt;&lt;span style="font-style: italic;"&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;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;br style="font-style: italic;" /&gt;&lt;span style="font-style: italic;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;br style="font-style: italic;" /&gt;&lt;span style="font-style: italic;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;br style="font-style: italic;" /&gt;&lt;span style="font-style: italic;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;br style="font-style: italic;" /&gt;&lt;span style="font-style: italic;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;br style="font-style: italic;" /&gt;&lt;span style="font-style: italic;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (hasItems)&lt;/span&gt;&lt;br style="font-style: italic;" /&gt;&lt;span style="font-style: italic;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/span&gt;&lt;br style="font-style: italic;" /&gt;&lt;span style="font-style: italic;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Si llegamos aquí es que hemos encontrado &lt;/span&gt;&lt;br style="font-style: italic;" /&gt;&lt;span style="font-style: italic;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // RadioButton's con el groupname, pero ninguno checkeado&lt;/span&gt;&lt;br style="font-style: italic;" /&gt;&lt;span style="font-style: italic;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (!message) message = 'Debes elegir una opción';&lt;/span&gt;&lt;br style="font-style: italic;" /&gt;&lt;span style="font-style: italic;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; alert(message);&lt;/span&gt;&lt;br style="font-style: italic;" /&gt;&lt;span style="font-style: italic;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return false;&lt;/span&gt;&lt;br style="font-style: italic;" /&gt;&lt;span style="font-style: italic;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;br style="font-style: italic;" /&gt;&lt;span style="font-style: italic;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; else&lt;/span&gt;&lt;br style="font-style: italic;" /&gt;&lt;span style="font-style: italic;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/span&gt;&lt;br style="font-style: italic;" /&gt;&lt;span style="font-style: italic;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Si llegamos aquí es que no hemos encontrado&lt;/span&gt;&lt;br style="font-style: italic;" /&gt;&lt;span style="font-style: italic;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // ningún RadioButton con el groupname buscado&lt;/span&gt;&lt;br style="font-style: italic;" /&gt;&lt;span style="font-style: italic;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return true;&lt;/span&gt;&lt;br style="font-style: italic;" /&gt;&lt;span style="font-style: italic;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;br style="font-style: italic;" /&gt;&lt;span style="font-style: italic;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;br style="font-style: italic;" /&gt;&lt;span style="font-style: italic;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;br style="font-style: italic;" /&gt;&lt;span style="font-style: italic;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/script&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Eso en cuanto al javascript. Un ejemplo que lo use:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;RadioButton.aspx&lt;br /&gt;&lt;br style="font-style: italic;" /&gt;&lt;/span&gt;&lt;span style="font-style: italic;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;div&amp;gt;&lt;/span&gt;&lt;br style="font-style: italic;" /&gt;&lt;span style="font-style: italic;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;div&amp;gt;&lt;/span&gt;&lt;br style="font-style: italic;" /&gt;&lt;span style="font-style: italic;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;asp:RadioButton ID=&amp;quot;RadioButton1&amp;quot; runat=&amp;quot;server&amp;quot; GroupName=&amp;quot;SubgurimTest&amp;quot; Text=&amp;quot;RadioButton1&amp;quot; /&amp;gt;&lt;/span&gt;&lt;br style="font-style: italic;" /&gt;&lt;span style="font-style: italic;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/div&amp;gt;&lt;/span&gt;&lt;br style="font-style: italic;" /&gt;&lt;span style="font-style: italic;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;div&amp;gt;&lt;/span&gt;&lt;br style="font-style: italic;" /&gt;&lt;span style="font-style: italic;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;asp:RadioButton ID=&amp;quot;RadioButton2&amp;quot; runat=&amp;quot;server&amp;quot; GroupName=&amp;quot;SubgurimTest&amp;quot; Text=&amp;quot;RadioButton2&amp;quot; /&amp;gt;&lt;/span&gt;&lt;br style="font-style: italic;" /&gt;&lt;span style="font-style: italic;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/div&amp;gt;&lt;/span&gt;&lt;br style="font-style: italic;" /&gt;&lt;span style="font-style: italic;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;div&amp;gt;&lt;/span&gt;&lt;br style="font-style: italic;" /&gt;&lt;span style="font-style: italic;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;asp:RadioButton ID=&amp;quot;RadioButton3&amp;quot; runat=&amp;quot;server&amp;quot; GroupName=&amp;quot;SubgurimTest&amp;quot; Text=&amp;quot;RadioButton3&amp;quot; /&amp;gt;&lt;/span&gt;&lt;br style="font-style: italic;" /&gt;&lt;span style="font-style: italic;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/div&amp;gt;&lt;/span&gt;&lt;br style="font-style: italic;" /&gt;&lt;span style="font-style: italic;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;div&amp;gt;&lt;/span&gt;&lt;br style="font-style: italic;" /&gt;&lt;span style="font-style: italic;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;asp:Button ID=&amp;quot;Button1&amp;quot; runat=&amp;quot;server&amp;quot; Text=&amp;quot;Button&amp;quot; OnClientClick=&amp;quot;if (!validateRadioButtonList('SubgurimTest')) return false;&amp;quot;&lt;/span&gt;&lt;br style="font-style: italic;" /&gt;&lt;span style="font-style: italic;"&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;&amp;nbsp;&amp;nbsp; OnClick=&amp;quot;Button1_Click&amp;quot; /&amp;gt;&lt;/span&gt;&lt;br style="font-style: italic;" /&gt;&lt;span style="font-style: italic;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/div&amp;gt;&lt;/span&gt;&lt;br style="font-style: italic;" /&gt;&lt;span style="font-style: italic;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;div&amp;gt;&lt;/span&gt;&lt;br style="font-style: italic;" /&gt;&lt;span style="font-style: italic;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;asp:Label ID=&amp;quot;Label1&amp;quot; runat=&amp;quot;server&amp;quot; Text=&amp;quot;Label&amp;quot;&amp;gt;&amp;lt;/asp:Label&amp;gt;&lt;/span&gt;&lt;br style="font-style: italic;" /&gt;&lt;span style="font-style: italic;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/div&amp;gt;&lt;/span&gt;&lt;br style="font-style: italic;" /&gt;&lt;span style="font-style: italic;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/div&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;RadioButton.aspx.cs&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-style: italic;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; protected void Button1_Click(object sender, EventArgs e)&lt;/span&gt;&lt;br style="font-style: italic;" /&gt;&lt;span style="font-style: italic;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/span&gt;&lt;br style="font-style: italic;" /&gt;&lt;span style="font-style: italic;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; string message = string.Empty;&lt;/span&gt;&lt;br style="font-style: italic;" /&gt;&lt;br style="font-style: italic;" /&gt;&lt;span style="font-style: italic;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (RadioButton1.Checked)&lt;/span&gt;&lt;br style="font-style: italic;" /&gt;&lt;span style="font-style: italic;"&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;&amp;nbsp;&amp;nbsp; message = &amp;quot;RadioButton1&amp;quot;;&lt;/span&gt;&lt;br style="font-style: italic;" /&gt;&lt;span style="font-style: italic;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (RadioButton2.Checked)&lt;/span&gt;&lt;br style="font-style: italic;" /&gt;&lt;span style="font-style: italic;"&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;&amp;nbsp;&amp;nbsp; message = &amp;quot;RadioButton2&amp;quot;;&lt;/span&gt;&lt;br style="font-style: italic;" /&gt;&lt;span style="font-style: italic;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (RadioButton3.Checked)&lt;/span&gt;&lt;br style="font-style: italic;" /&gt;&lt;span style="font-style: italic;"&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;&amp;nbsp;&amp;nbsp; message = &amp;quot;RadioButton3&amp;quot;;&lt;/span&gt;&lt;br style="font-style: italic;" /&gt;&lt;span style="font-style: italic;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;br style="font-style: italic;" /&gt;&lt;span style="font-style: italic;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Label1.Text = message;&lt;/span&gt;&lt;br style="font-style: italic;" /&gt;&lt;span style="font-style: italic;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Vemos que tenemos tres &lt;span style="font-weight: bold;"&gt;RadioButton&lt;/span&gt;'s cuyo GroupName es &amp;quot;SubgurimTest&amp;quot;. Posteriormente tenemos un Button que maneja un evento OnClick cualquiera, y un OnClientClick así:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if (!validateRadioButtonList('SubgurimTest')) return false;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;De forma que vemos claramente que si no se valida el Grupo de &lt;span style="font-weight: bold;"&gt;RadioButton&lt;/span&gt;'s, no se debe seguir con el Post.&lt;br /&gt;&lt;br /&gt;Espero que os sea de utilidad, incluso si sabéis una forma mucho más sencilla de hacerlo &lt;img src="http://www.subgurim.net/javascript/Obout/Editor_data/ed_icons/emoticons/grin.gif" /&gt;&lt;br /&gt;&lt;br /&gt;</description>
      <link>http://www.subgurim.net/Articulos/ajax-y-javascript/174/validar-varios-radiobutton.aspx</link>
      <pubDate>Thu, 17 Apr 2008 18:56:39 GMT</pubDate>
      <guid>http://www.subgurim.net/Articulos/ajax-y-javascript/174/validar-varios-radiobutton.aspx</guid>
    </item>
    <item>
      <title>Google vs el RewritePath de ASP.NET</title>
      <description>ASP.NET no es perfecto. Y punto.&lt;br /&gt;&lt;br /&gt;Uno de los peores errores que se pueden tener, son aquellos que no ves. Aquellos que no te enteras si quiera de que están sucediendo. Aquellos que cuando te enteres que están sucediendo, no entiendas qué está pasando ni por qué.&lt;br /&gt;&lt;br /&gt;Esto es lo que sucede cuando GoogleBot (y muchos otros rastreadores como Yahoo Slurp) visitan algunas de tus páginas ASP.NET a las que has aplicado el RewritePath. Por ejemplo, si usas &lt;a href="http://msdn2.microsoft.com/en-us/library/ms972974.aspx" target="_blank" rel="nofollow"&gt;este famoso Url Rewriter&lt;/a&gt; es casi seguro que te está afectando el problema (yo siempre aconsejo el &lt;a href="http://www.urlrewriting.net/en/Default.aspx" target="_blank" rel="nofollow"&gt;UrlRewritingNET&lt;/a&gt;).&lt;br /&gt;&lt;br /&gt;Lo que sucede es que ASP.NET, según quién le esté visitando, devuelve una cosa y otra. En el caso de que le visiten algunos de los crawlers buscadores más importantes cuando usamos el RewritePath, ASP.NET puede devolver &amp;quot;paths&amp;quot; que apuntan &amp;quot;muy hacia abajo&amp;quot;. Por ejemplo, puede darse el caso de que estemos en www.subgurim.net/default.aspx, y ASP.NET devuelva enlaces con &amp;quot;../../&amp;quot;, con lo que salta un feo error.&lt;br /&gt;&lt;br /&gt;Tras darle muchas vueltas y conseguir soluciones feas, y dado que los buscadores no tienen la culpa y ASP.NET no tiene pinta de querer solucionar el error, la mejor solución que he encontrado es usar el directorio App_Browsers, añadiéndole los archivos que tenéis más abajo de forma que &amp;quot;engañamos&amp;quot; a ASP.NET para que nos devuelva un código bueno.&lt;br /&gt;&lt;br /&gt;ASí que la solución es fácil, añades esos archivos al directorio web.config y todo solucionado.&lt;br /&gt;&lt;br /&gt;&lt;a href="../../Upload/app_browsers.rar"&gt;Descargar App_Browsers&lt;/a&gt;&lt;br /&gt;</description>
      <link>http://www.subgurim.net/Articulos/asp-net-general/173/google-vs-el-rewritepath-de-asp-net.aspx</link>
      <pubDate>Fri, 04 Apr 2008 19:51:16 GMT</pubDate>
      <guid>http://www.subgurim.net/Articulos/asp-net-general/173/google-vs-el-rewritepath-de-asp-net.aspx</guid>
    </item>
    <item>
      <title>Averiguar el valor del "compilation debug"</title>
      <description>Ya hemos hablado de la importancia del &lt;a href="http://twitter.com/rchamorro" target="_blank" rel="nofollow"&gt;ge&lt;/a&gt;n&lt;a href="http://twitter.com/joplaal" target="_blank" rel="nofollow"&gt;te&lt;/a&gt; a la que no le hace mucha gracia ni jugar con el machine.config ni con el deploymente retail. De hecho, es bastante habitual no tener acceso al machine.config (sobre todo en servidores compartidos).&lt;br /&gt;&lt;br /&gt;De forma que lo que queremos es asegurarnos de que siempre que no no nos encontremos en desarrollo (es decir que estemos en localhost) nuestro debug sea false.&lt;br /&gt;&lt;br /&gt;Pues ahí va el código autoexplicativo:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;br style="font-style: italic;" /&gt;&lt;span style="font-style: italic;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// Define si se puede tener activado el debug&lt;/span&gt;&lt;br style="font-style: italic;" /&gt;&lt;span style="font-style: italic;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;br style="font-style: italic;" /&gt;&lt;span style="font-style: italic;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; protected bool CanDebug()&lt;/span&gt;&lt;br style="font-style: italic;" /&gt;&lt;span style="font-style: italic;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/span&gt;&lt;br style="font-style: italic;" /&gt;&lt;span style="font-style: italic;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (!Request.Url.DnsSafeHost.Equals(&amp;quot;localhost&amp;quot;))&lt;/span&gt;&lt;br style="font-style: italic;" /&gt;&lt;span style="font-style: italic;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/span&gt;&lt;br style="font-style: italic;" /&gt;&lt;span style="font-style: italic;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Si no estoy en localhost...&lt;/span&gt;&lt;br style="font-style: italic;" /&gt;&lt;br style="font-style: italic;" /&gt;&lt;span style="font-style: italic;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Cogemos el elemento system/compiltation, donde se encuentra el atributo &amp;quot;debug&amp;quot;&lt;/span&gt;&lt;br style="font-style: italic;" /&gt;&lt;span style="font-style: italic;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; System.Configuration.ConfigurationSection section =&lt;/span&gt;&lt;br style="font-style: italic;" /&gt;&lt;span style="font-style: italic;"&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;&amp;nbsp;&amp;nbsp; System.Configuration.ConfigurationManager.GetSection(&amp;quot;system.web/compilation&amp;quot;) as&lt;/span&gt;&lt;br style="font-style: italic;" /&gt;&lt;span style="font-style: italic;"&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;&amp;nbsp;&amp;nbsp; System.Configuration.ConfigurationSection;&lt;/span&gt;&lt;br style="font-style: italic;" /&gt;&lt;br style="font-style: italic;" /&gt;&lt;span style="font-style: italic;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (section == null)&lt;/span&gt;&lt;br style="font-style: italic;" /&gt;&lt;span style="font-style: italic;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/span&gt;&lt;br style="font-style: italic;" /&gt;&lt;span style="font-style: italic;"&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;&amp;nbsp;&amp;nbsp; // En caso de no existir, el valor por defecto es debug = false&lt;/span&gt;&lt;br style="font-style: italic;" /&gt;&lt;span style="font-style: italic;"&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;&amp;nbsp;&amp;nbsp; return true;&lt;/span&gt;&lt;br style="font-style: italic;" /&gt;&lt;span style="font-style: italic;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;br style="font-style: italic;" /&gt;&lt;span style="font-style: italic;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; else&lt;/span&gt;&lt;br style="font-style: italic;" /&gt;&lt;span style="font-style: italic;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/span&gt;&lt;br style="font-style: italic;" /&gt;&lt;span style="font-style: italic;"&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;&amp;nbsp;&amp;nbsp; // En caso de existir la sección y su atributo &amp;quot;debug&amp;quot;, debemos asegurarnos de que sea false&lt;/span&gt;&lt;br style="font-style: italic;" /&gt;&lt;span style="font-style: italic;"&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;&amp;nbsp;&amp;nbsp; return !Convert.ToBoolean(section.ElementInformation.Properties[&amp;quot;debug&amp;quot;].Value);&lt;/span&gt;&lt;br style="font-style: italic;" /&gt;&lt;span style="font-style: italic;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;br style="font-style: italic;" /&gt;&lt;span style="font-style: italic;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;br style="font-style: italic;" /&gt;&lt;span style="font-style: italic;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; else&lt;/span&gt;&lt;br style="font-style: italic;" /&gt;&lt;span style="font-style: italic;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/span&gt;&lt;br style="font-style: italic;" /&gt;&lt;span style="font-style: italic;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Si estoy en localhost puedo tener el debug como quiera.&lt;/span&gt;&lt;br style="font-style: italic;" /&gt;&lt;span style="font-style: italic;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return true;&lt;/span&gt;&lt;br style="font-style: italic;" /&gt;&lt;span style="font-style: italic;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;br style="font-style: italic;" /&gt;&lt;span style="font-style: italic;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;De este modo averiguaremos si nuestro valor de &amp;quot;debug&amp;quot; es el correcto, tanto si estamos en localhost como si no.&lt;br /&gt;&lt;br /&gt;El modo de esar esta información queda a gusto de cada uno, pero una opción &amp;quot;bestia&amp;quot; sería la de poner este código en algún lugar que seguro vayamos a visitar:&lt;br /&gt;&lt;br style="font-style: italic;" /&gt;&lt;span style="font-style: italic;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (!CanDebug())&lt;/span&gt;&lt;br style="font-style: italic;" /&gt;&lt;span style="font-style: italic;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; throw new Exception(&amp;quot;No se puede tener activado el debug&amp;quot;);&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;</description>
      <link>http://www.subgurim.net/Articulos/asp-net-general/172/averiguar-el-valor-del-compilation-debug.aspx</link>
      <pubDate>Fri, 04 Apr 2008 19:15:35 GMT</pubDate>
      <guid>http://www.subgurim.net/Articulos/asp-net-general/172/averiguar-el-valor-del-compilation-debug.aspx</guid>
    </item>
    <item>
      <title>HttpModule: AntiSpamModule</title>
      <description>Nunca me gustan las definiciones de conceptos tan técnicos como es el caso del &lt;span style="font-weight: bold;"&gt;HttpModule&lt;/span&gt;. Primero porque no sé definir bien las cosas, y segundo porque aunque lo supiera definir bien, lo que más aclara sigue siendo un buen ejemplo.&lt;br /&gt;&lt;br /&gt;Para que nos hagamos a una idea, con los HttpModule's vamos a poder manejar eventos que&amp;nbsp; suceden antes que el Pre_Init de la página. Esperando que no se me olvide ninguno, y sin entrar a comentar qué sucede en cada uno de ellos, este es el orden en que se ejecutan dicho eventos:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;&lt;font size="2"&gt;BeginRequest&lt;/font&gt;&lt;/li&gt;&lt;li&gt;&lt;font size="2"&gt;AuthenticateRequest&lt;/font&gt;&lt;/li&gt;&lt;li&gt;&lt;font size="2"&gt;PostAuthenticateRequest&lt;/font&gt;&lt;/li&gt;&lt;li&gt;&lt;font size="2"&gt;PostAuthorizeRequest&lt;/font&gt;&lt;/li&gt;&lt;li&gt;&lt;font size="2"&gt;ResolveRequestCache&lt;/font&gt;&lt;/li&gt;&lt;li&gt;&lt;font size="2"&gt;PostResolveRequestCache&lt;/font&gt;&lt;/li&gt;&lt;li&gt;&lt;font size="2"&gt;PostMapRequestHandler&lt;/font&gt;&lt;/li&gt;&lt;li&gt;&lt;font size="2"&gt;AcquireRequestState&lt;/font&gt;&lt;/li&gt;&lt;li&gt;&lt;font size="2"&gt;PostAcquireRequestState&lt;/font&gt;&lt;/li&gt;&lt;li&gt;&lt;font size="2"&gt;PreRequestHandlerExecute&lt;/font&gt;&lt;/li&gt;&lt;/ol&gt;&lt;font size="2"&gt;Bien utilizados los HttpModules son muy útiles.&lt;br /&gt;&lt;br /&gt;Todo muy bonito y todo muy bien... pero hasta el momento he dicho todo pero no he dicho nada. Vamos con un ejemplo, pero además un ejemplo muy útil: el AntiSpammer. &lt;br /&gt;&lt;br /&gt;Desde hace tiempo vengo teniendo problemas en los foros de algunas de mis Webs. Algunos robots Spammers escribían diariamente &amp;quot;basura&amp;quot;. Analizándolo a grandes rasgos, lo que hacen estos robots es hacer peticiones POST a una url definida con unos campos definidos. Hasta ahora había probado varios métodos,&lt;/font&gt; como cambiar el nombre de los Textbox (y por tanto cambiaba el identificador de los campos o cambiar el nombre de la página (con lo que el robot ya no lo enviaba al sitio correcto).&lt;br /&gt;&lt;br /&gt;Ninguno de esos métodos me funcionaba, pues los robots eran inteligentes... o simplemente&amp;nbsp; cogían los &amp;quot;Id&amp;quot; de todos los &amp;quot;input type text&amp;quot; y mandaban la basura con su nombre. Bueno, no lo sé, cuando algún día decida hacerme spammer lo analizaré mejor &lt;img src="http://www.subgurim.net/javascript/Obout/Editor_data/ed_icons/emoticons/angry.gif" /&gt;.&lt;br /&gt;&lt;br /&gt;La cuestión es que lo único que realmente me ha funcionado ha sido o poner un Captcha (los odio) o permitir únicamente la inserción a usuarios registrados... pero ninguna de las dos soluciones me gusta.&lt;br /&gt;&lt;br /&gt;Así que con la &amp;quot;inspiración&amp;quot; de resolver ese problema, he hecho este &lt;span style="font-weight: bold;"&gt;HttpModule&lt;/span&gt;. &lt;br /&gt;&lt;br /&gt;Hacer un &lt;span style="font-weight: bold;"&gt;HttpModule &lt;/span&gt;es mucho más sencillo de lo que se piensa. Lo primero es crear una clase con la Interfaz &amp;quot;IHttpModule&amp;quot;, la cual te obliga a tener dos métodos: &amp;quot;Init&amp;quot; y &amp;quot;Dispose&amp;quot;.&lt;br /&gt;&lt;br /&gt;En el método &amp;quot;Init&amp;quot; se recoge un parámetro del tipo &amp;quot;HttpApplication&amp;quot;, desde el cual se tiene acceso a todas las variables típicas que se tienen desde una Página .aspx cualquiera. En nuesgtro ejemplo nos va a interesar recoger el Request, el Response.&lt;br /&gt;&lt;br /&gt;Vayamos con el código, y pasamos a explicar qué vamos a hacer para tratar de evitar el Spam:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;AntiSpamModule.cs&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;using System;&lt;/span&gt;&lt;br style="font-style: italic;" /&gt;&lt;span style="font-style: italic;"&gt;using System.Web;&lt;/span&gt;&lt;br style="font-style: italic;" /&gt;&lt;br style="font-style: italic;" /&gt;&lt;span style="font-style: italic;"&gt;namespace Subgurim.Tools&lt;/span&gt;&lt;br style="font-style: italic;" /&gt;&lt;span style="font-style: italic;"&gt;{&lt;/span&gt;&lt;br style="font-style: italic;" /&gt;&lt;span style="font-style: italic;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public class AntiSpamModule : IHttpModule&lt;/span&gt;&lt;br style="font-style: italic;" /&gt;&lt;span style="font-style: italic;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/span&gt;&lt;br style="font-style: italic;" /&gt;&lt;span style="font-style: italic;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public void Init(HttpApplication app)&lt;/span&gt;&lt;br style="font-style: italic;" /&gt;&lt;span style="font-style: italic;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/span&gt;&lt;br style="font-style: italic;" /&gt;&lt;span style="font-style: italic;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; app.BeginRequest += new EventHandler(AntiSpamFilter);&lt;/span&gt;&lt;br style="font-style: italic;" /&gt;&lt;span style="font-style: italic;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;br style="font-style: italic;" /&gt;&lt;br style="font-style: italic;" /&gt;&lt;span style="font-style: italic;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; private void AntiSpamFilter(object sender, EventArgs e)&lt;/span&gt;&lt;br style="font-style: italic;" /&gt;&lt;span style="font-style: italic;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/span&gt;&lt;br style="font-style: italic;" /&gt;&lt;span style="font-style: italic;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; HttpResponse response = &lt;/span&gt;&lt;span style="font-style: italic;"&gt;((HttpApplication)sender)&lt;/span&gt;&lt;span style="font-style: italic;"&gt;.Response;&lt;/span&gt;&lt;br style="font-style: italic;" /&gt;&lt;span style="font-style: italic;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; HttpRequest request = ((HttpApplication)sender).Request;&lt;/span&gt;&lt;br style="font-style: italic;" /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // 1.- Me me están mandando datos mediante POST&lt;/span&gt;&lt;br style="font-style: italic;" /&gt;&lt;span style="font-style: italic;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // 2.- La llamada no proviene de ninguna otra página&lt;/span&gt;&lt;br style="font-style: italic;" /&gt;&lt;span style="font-style: italic;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // 3.- La llamada proviene de otra página, pero que no está dentro de mi dominio&lt;/span&gt;&lt;br style="font-style: italic;" /&gt;&lt;span style="font-style: italic;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if ((request.Form.Count &amp;gt; 0) &amp;amp;&amp;amp; &lt;/span&gt;&lt;br style="font-style: italic;" /&gt;&lt;span style="font-style: italic;"&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ((request.UrlReferrer == null) || &lt;/span&gt;&lt;br style="font-style: italic;" /&gt;&lt;span style="font-style: italic;"&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (!request.UrlReferrer.Authority.Equals(request.Url.Authority, StringComparison.InvariantCultureIgnoreCase))))&lt;/span&gt;&lt;br style="font-style: italic;" /&gt;&lt;span style="font-style: italic;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/span&gt;&lt;br style="font-style: italic;" /&gt;&lt;span style="font-style: italic;"&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;&amp;nbsp;&amp;nbsp; try&lt;/span&gt;&lt;br style="font-style: italic;" /&gt;&lt;span style="font-style: italic;"&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;&amp;nbsp;&amp;nbsp; {&lt;/span&gt;&lt;br style="font-style: italic;" /&gt;&lt;span style="font-style: italic;"&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; response.End();&lt;/span&gt;&lt;br style="font-style: italic;" /&gt;&lt;span style="font-style: italic;"&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;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;br style="font-style: italic;" /&gt;&lt;span style="font-style: italic;"&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;&amp;nbsp;&amp;nbsp; catch (System.Threading.ThreadAbortException ex)&lt;/span&gt;&lt;br style="font-style: italic;" /&gt;&lt;span style="font-style: italic;"&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;&amp;nbsp;&amp;nbsp; {&lt;/span&gt;&lt;br style="font-style: italic;" /&gt;&lt;span style="font-style: italic;"&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // No hacer nada&lt;/span&gt;&lt;br style="font-style: italic;" /&gt;&lt;span style="font-style: italic;"&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;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;br style="font-style: italic;" /&gt;&lt;span style="font-style: italic;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;br style="font-style: italic;" /&gt;&lt;span style="font-style: italic;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;br style="font-style: italic;" /&gt;&lt;br style="font-style: italic;" /&gt;&lt;span style="font-style: italic;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public void Dispose()&lt;/span&gt;&lt;br style="font-style: italic;" /&gt;&lt;span style="font-style: italic;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/span&gt;&lt;br style="font-style: italic;" /&gt;&lt;span style="font-style: italic;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;br style="font-style: italic;" /&gt;&lt;span style="font-style: italic;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;En el método Init vamos a indicar que cuando se lance el evento &amp;quot;BeginRequest&amp;quot; (el primero de todos) se llame al método AntiSpamFilter.&lt;br /&gt;&lt;br /&gt;Dentro del AntiSpamFilter recogemos (vemos que es muy sencillo) el Response y el Request, y aquí es donde trataremos de localizar a los robots Spammers con tres sencillas reglas:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Me me están mandando datos mediante POST&lt;/li&gt;&lt;li&gt;La llamada no proviene de ninguna otra página&lt;/li&gt;&lt;li&gt;La llamada proviene de otra página, pero que no está dentro de mi dominio&lt;/li&gt;&lt;/ol&gt;En caso de ser así, haremos, sin contemplaciones un Response.End(), con lo que paramos el ciclo de vida, y de ahí no pasa nadie. Nos sólo evitamos que nos Spammeen, sino que le estamos ahorrando a nuestro servidor un montón de cosas.&lt;br /&gt;&lt;br /&gt;Ponemos un &lt;a target="_self" href="http://www.subgurim.net/Articulos/csharp/110/introduccion-al-control-de-errores-try-catch-finally.aspx"&gt;try - catch&lt;/a&gt; para manejar el ThreadAbortException, que se lanza siempre que se hace un Response.End.&lt;br /&gt;&lt;br /&gt;En lugar de un Response.End, podría ser buena idea lanzar una HttpException 404, engañando al robot haciéndole creer que la página no existe.&lt;br /&gt;&lt;br /&gt;Ya tenemos programado nuestro &lt;span style="font-weight: bold;"&gt;HttpModule&lt;/span&gt;... como véis es muy sencillo y no tiene otra historia que un clase implementando una interfaz.&lt;br /&gt;&lt;br /&gt;Ahora nos queda configurar nuestra aplicación para que, en cada llamada, ejecute ese &lt;span style="font-weight: bold;"&gt;HttpModule&lt;/span&gt;. Como siempre, lo haremos desde nuestro web.config. Dentro del elemento System.Web debemos poner el elemento httpModules:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;system.web&amp;gt;&lt;/span&gt;&lt;br style="font-style: italic;" /&gt;&lt;span style="font-style: italic;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;httpModules&amp;gt;&lt;/span&gt;&lt;br style="font-style: italic;" /&gt;&lt;span style="font-style: italic;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;add name=&amp;quot;AntiSpamModule&amp;quot; type=&amp;quot;Subgurim.Tools.AntiSpamModule&amp;quot;/&amp;gt;&lt;/span&gt;&lt;br style="font-style: italic;" /&gt;&lt;span style="font-style: italic;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/httpModules&amp;gt;&lt;/span&gt;&lt;br style="font-style: italic;" /&gt;&lt;span style="font-style: italic;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/system.web&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Con &amp;quot;name&amp;quot; con el nombre de la clase y type con el namespace (si está dentro del directorio App_Code) o el nombre del assembly si lo tienes en otro proyecto.&lt;br /&gt;&lt;br /&gt;OJO: esas tres reglas básicas no han sido testeadas al 100%. Debería funcionar sin problemas, pero no sé, por ejemplo, si los robots de los buscadores (como GoogleBot o YahooSlurp) utilizan o utilizarán llamadas POST con parámetros para indexar mejor los contenidos... vamos, que me lavo las manos de lo malo que pueda ocurriros &lt;img src="http://www.subgurim.net/javascript/Obout/Editor_data/ed_icons/emoticons/tongue.gif" /&gt; (aunque repito que a mí me ha funcionado sin problemas).&lt;br /&gt;</description>
      <link>http://www.subgurim.net/Articulos/asp-net-general/171/httpmodule-antispammodule.aspx</link>
      <pubDate>Fri, 04 Apr 2008 17:25:04 GMT</pubDate>
      <guid>http://www.subgurim.net/Articulos/asp-net-general/171/httpmodule-antispammodule.aspx</guid>
    </item>
    <item>
      <title>Introducci&amp;#243;n a la conexi&amp;#243;n a bases de datos</title>
      <description>En este videotutorial hago una introducción a la conexión a bases de datos en ASP.NET.&lt;br&gt;&lt;br&gt;Su nivel es muy básico, por lo que está dirigido a los programadores que se están iniciando.&lt;br&gt;&lt;br&gt;En el videotutorial se creará una base de datos con SQLServer Express con una sencilla tabla de sólo dos registros. Además se crean 2 procedimientos almacenados, uno de inserción y otro de selección.&lt;br&gt;&lt;br&gt;Posteriormente se configurará un SqlDataSource con ambos procedimientos almacenados, con un Detailsview para la inserción de datos y un Gridview para mostrarlos.&lt;br&gt;&lt;br&gt;

&lt;div align="center"&gt;
&lt;object width="425" height="355"&gt;&lt;param name="movie" value="http://www.youtube.com/v/Zs68eGj19Fs&amp;rel=1"&gt;&lt;/param&gt;&lt;param name="wmode" value="transparent"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/Zs68eGj19Fs&amp;rel=1" type="application/x-shockwave-flash" wmode="transparent" width="425" height="355"&gt;&lt;/embed&gt;&lt;/object&gt;
&lt;/div&gt;

&lt;br&gt;</description>
      <link>http://www.subgurim.net/Articulos/ado-net-y-acceso-a-datos/170/introduccion-a-la-conexion-a-bases-de-datos.aspx</link>
      <pubDate>Wed, 20 Feb 2008 00:00:58 GMT</pubDate>
      <guid>http://www.subgurim.net/Articulos/ado-net-y-acceso-a-datos/170/introduccion-a-la-conexion-a-bases-de-datos.aspx</guid>
    </item>
    <item>
      <title>Ajax UrlTester</title>
      <description>&lt;div style="padding: 5px; text-align: center; font-weight: bold;"&gt;&lt;a href="http://www.subgurim.net/Upload/ajaxpagetester_%282%29.zip"&gt;DESCARGAR CÓDIGO&lt;/a&gt;
&lt;/div&gt;

&lt;br&gt;Todo webmaster que se precie debe seguir una regla de oro básica: cuando realizas un cambio en la Web, &lt;i&gt;debes visitar las páginas donde se han hecho los cambios para comprobar que todo va correcto&lt;/i&gt;.&lt;br&gt;&lt;br&gt;Esto, aparentemente tan lógico y trivial, no es tan sencillo como parece. Si estamos hablando de una o dos páginas no hay problema, pero hay ocasiones en que los cambios realizados son complejos y pueden implicar 20, 30 o 40 páginas.&lt;br&gt;&lt;br&gt;Con esta idea en mente, y sin buscar antes en Google por si había ya algo parecido (de hecho aún no lo he mirado y no sé si lo haré), se me ocurrió hacer un script que visitara las páginas y me diera, al menos, una mínima información sobre el estado de las páginas que yo quiera.&lt;br&gt;&lt;br&gt;Hay muchas opciones posibles. Por ejemplo podríamos usar un &lt;a href="http://www.subgurim.net/Articulos/csharp/139/regex-webclient-mi-primer-spider.aspx"&gt;spider&lt;/a&gt;. Pero como ya escribí un artículo muy similar y me apetecía usar Ajax y Javascript, decidí utilizar el &lt;a href="http://www.subgurim.net/articulos/ajax-y-javascript/54/ajax-a-pelo-xmlhttprequest.aspx"&gt;XMLHttpRequest&lt;/a&gt;.&lt;br&gt;&lt;br&gt;Básicamente, la funcionalidad del script consiste en visitar las páginas que yo le configuro usando el &lt;a href="http://www.subgurim.net/articulos/ajax-y-javascript/54/ajax-a-pelo-xmlhttprequest.aspx"&gt;XMLHttpRequest&lt;/a&gt;, y éste me dará el Status y el StatusCode de cada una de esas páginas.&lt;br&gt;&lt;br&gt;Como ya sabréis, si la página funciona correctamente, devolverá un StatusCode "200" y un Status "OK". Si no existe la página devolverá un "404 - Page Not Found" y si hay un error devolverá "500 - Internal Server Error". Es poca información, pero nos viene perfecto para dar un repaso rápido a una gran cantidad de páginas.&lt;br&gt;&lt;br&gt;Además de esta funcionalidad básica, el script "maquilla" los resultados devueltos, indicando, por ejemplo, cuando comienza y termina un test, o coloreando en rojo todo aquello que no sea un "200 - OK".&lt;br&gt;&lt;br&gt;Lo he metido todo en un .ASCX en lugar de un .dll, porque a mí me suele ser más cómodo, sobretodo en cosas de administración tan pequeñitas.&lt;br&gt;&lt;br&gt;&lt;br&gt;Ahora vayamos al grano, mostrando un poquito del código básico:&lt;br&gt;&lt;br&gt;El .ascx.cs tiene dos métodos centrales el "AddJavascriptCore" y el "AddJavascriptTest". Veamos el primero de ellos:&lt;br&gt;&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;i&gt; private void AddJavascriptCore()&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; string js = string.Format(&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;br&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;br&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;// Simplemente devuelve una variable "XMLHttpRequest" válida para IE y FF&lt;br&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;// It simply returns an XMLHttpRequest variable, valid for IE and FF&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; function CreateXmlHttp()&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;&amp;nbsp; try&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;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;&amp;nbsp;&amp;nbsp; xmlHttp = new ActiveXObject('Msxml2.XMLHTTP');&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;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; catch(e)&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;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;&amp;nbsp;&amp;nbsp; try&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;&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; xmlHttp = new ActiveXObject('Microsoft.XMLHTTP');&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;&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; catch(oc)&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;&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; xmlHttp = null;&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;&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;&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; if(!xmlHttp &amp;amp;&amp;amp; typeof XMLHttpRequest != 'undefined')&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;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;&amp;nbsp;&amp;nbsp; xmlHttp = new XMLHttpRequest();&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;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return xmlHttp;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }}&lt;br&gt;&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;// Se llama al empezar el test, y muestra el mensaje de inicio&lt;br&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;// It's called at the beginning of the test and returns a start message&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; function BeginTest()&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;&amp;nbsp; var panel = document.getElementById('{0}');&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; panel.appendChild(document.createTextNode('BEGIN TEST'));&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; panel.appendChild(document.createElement('br'));&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }}&lt;br&gt;&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;// Controlamos cuándo se ha llamado a todas las páginas&lt;br&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;// We control when are tested all the pages&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; function SubstractCount()&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;&amp;nbsp; i--;&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; if (i==0)&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;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;&amp;nbsp;&amp;nbsp; var panel = document.getElementById('{0}');&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;&amp;nbsp;&amp;nbsp; panel.appendChild(document.createTextNode('END TEST'));&lt;br&gt;&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;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }}&lt;br&gt;&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;// Recoge la variable XMLHttpRequest y maneja la función que se ejecutará cuando la llamada termine.&lt;br&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;// Get the XMLHttpRequestVariable and hands the function that is going to execute when the call ends.&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; function SendTest(ajaxRequest)&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;&amp;nbsp; var xmlHttp = CreateXmlHttp();&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; xmlHttp.onreadystatechange = function() {{Test(ajaxRequest, xmlHttp)}};&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; xmlHttp.open('GET', ajaxRequest, true);&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; xmlHttp.send('');&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }}&lt;br&gt;&lt;br&gt;&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;// Cuando termine la llamada, se crean los elementos DOM y se muestra el resultado&lt;br&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;// When the call ends, the DOM elements are created and the results are shown&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; function Test(ajaxRequest, xmlHttp)&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;&amp;nbsp; if(xmlHttp.readyState == 4)&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;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;&amp;nbsp;&amp;nbsp; var panel = document.getElementById('{0}');&lt;br&gt;&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;&amp;nbsp;&amp;nbsp; var item = document.createElement('div');&lt;br&gt;&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;&amp;nbsp;&amp;nbsp; var ajaxUrlRequest =document.createElement('a');&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;&amp;nbsp;&amp;nbsp; ajaxUrlRequest.href= ajaxRequest;&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;&amp;nbsp;&amp;nbsp; ajaxUrlRequest.target= '_blank';&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;&amp;nbsp;&amp;nbsp; ajaxUrlRequest.appendChild(document.createTextNode(ajaxRequest));&lt;br&gt;&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;&amp;nbsp;&amp;nbsp; item.appendChild(ajaxUrlRequest);&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;&amp;nbsp;&amp;nbsp; item.appendChild(document.createTextNode(': ' + xmlHttp.status + ' - ' + xmlHttp.statusText));&lt;br&gt;&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;&amp;nbsp;&amp;nbsp; var color = 'blue';&lt;br&gt;&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;&amp;nbsp;&amp;nbsp; if (xmlHttp.status != '200') color = 'red';&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; item.setAttribute('style', 'color:' + color);&lt;br&gt;&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;&amp;nbsp;&amp;nbsp; panel.appendChild(item);&lt;br&gt;&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;&amp;nbsp;&amp;nbsp; SubstractCount();&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;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }}&lt;br&gt;", pnlTesterResults.ClientID);&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;// Registra el script. Se usa ASP.NET AJAX, pero en lugar de ésta puedes usar el ClientManager.&lt;br&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;// Registers the script. Here is used ASP.NET AJAX, but you can use the ClientManager instead&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ScriptManager.RegisterClientScriptBlock(this, this.GetType(), "Subgurim_AjaxPageTester_AddJavascriptCore", js, true);&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/i&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;br&gt;&lt;br&gt;En cuanto al método "AddJavascriptTest", es mucho más sencillo, pues sólo se encarga de inicializar variables y llamar al método para cada una de las páginas.&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;i&gt;private System.Collections.Specialized.StringCollection urlList = new System.Collections.Specialized.StringCollection();&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public System.Collections.Specialized.StringCollection UrlList&lt;br&gt;&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 urlList; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; set { urlList = value; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; private void AddJavascriptTest()&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; StringBuilder sb = new StringBuilder();&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (null != UrlList)&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;&amp;nbsp; sb.AppendFormat("var i = {0};", UrlList.Count);&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; sb.Append("BeginTest();");&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; foreach (string url in UrlList)&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;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;&amp;nbsp;&amp;nbsp; sb.AppendFormat("SendTest('{0}');", url);&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;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ScriptManager.RegisterStartupScript(this, this.GetType(), "Subgurim_AjaxPageTester_AddJavascriptTest", sb.ToString(), true);&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/i&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;Así pues, tras registrar el control en cualquier página .aspx, lo utilizaremos del siguiente modo:&lt;br&gt;&lt;br&gt;&amp;nbsp;&lt;i&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Añade las url que quieras comprobar. Deben estar en el mismo dominio que esta página.&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Add the URL that you want to test. They should be in the same domain that this page.&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; AjaxPageTester1.UrlList.Add("/default.aspx");&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; AjaxPageTester1.UrlList.Add("/login.aspx");&lt;/i&gt;

&lt;div style="padding: 5px; text-align: center; font-weight: bold;"&gt;&lt;br&gt;&lt;a href="http://www.subgurim.net/Upload/ajaxpagetester_%282%29.zip"&gt;DESCARGAR CÓDIGO&lt;/a&gt;
&lt;/div&gt;</description>
      <link>http://www.subgurim.net/Articulos/ajax-y-javascript/169/ajax-urltester.aspx</link>
      <pubDate>Wed, 23 Jan 2008 18:16:38 GMT</pubDate>
      <guid>http://www.subgurim.net/Articulos/ajax-y-javascript/169/ajax-urltester.aspx</guid>
    </item>
    <item>
      <title>A&amp;#241;adir una cookie f&amp;#225;cilmente con Javascript</title>
      <description>&lt;i&gt;(Ve aquí si lo que te interesa son las &lt;a href="http://www.subgurim.net/articulos/asp-net-general/93/cookies-en-asp-net.aspx"&gt;cookies en ASP.NET&lt;/a&gt;)&lt;/i&gt;&lt;br&gt;&lt;br&gt;Hay muchas formas de escribir una cookie usando javascript. Yo he utilizado funciones que realmente consiguen lo que quieres, pero feas y complejas de leer.&lt;br&gt;&lt;br&gt;El otro día me tope con una función extremadamente simple que cumple el objetivo que queremos el 95% de veces: una cookie con una clave, un valor y una fecha de caducidad.&lt;br&gt;&lt;br&gt;&lt;i&gt;function writeLightCookie(n, v, d)&lt;br&gt;{&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; document.cookie = n + "=" + v + ";expires=" + d;&lt;br&gt;}&lt;/i&gt;&lt;br&gt;&lt;br&gt;Donde "n" es el nombre o clave de la cookie, "v" es su valor, y "d" su fecha de caducidad.&lt;br&gt;&lt;br&gt;Usarlo es también muy sencillo. Por ejemplo vamos a añadir una cookie que expire en un día:&lt;br&gt;&lt;br&gt;&lt;i&gt;var exp = new Date();&lt;br&gt;var expDays = 1;&lt;br&gt;exp.setTime(exp.getTime() + (expDays*24*60*60*1000));&lt;br&gt;&lt;/i&gt;&lt;i&gt;writeLightCookie('nombreDeLaCookie', 'ValorDeLaCookie' , &lt;/i&gt;&lt;i&gt;exp&lt;/i&gt;&lt;i&gt;);&lt;/i&gt;&lt;br&gt;</description>
      <link>http://www.subgurim.net/Articulos/ajax-y-javascript/168/anadir-una-cookie-facilmente-con-javascript.aspx</link>
      <pubDate>Fri, 14 Dec 2007 19:06:32 GMT</pubDate>
      <guid>http://www.subgurim.net/Articulos/ajax-y-javascript/168/anadir-una-cookie-facilmente-con-javascript.aspx</guid>
    </item>
    <item>
      <title>Regex Evaluator: un iGadget para expresiones regulares</title>
      <description>Hace tiempo, las expresiones regulares me parecían infernales: ¡no había por donde cogerlas!&lt;br /&gt;&lt;br /&gt;Como siempre suele pasarme en estos casos, no entenderlas hería mi honor &lt;img src="http://www.subgurim.net/images/smilies/1015-burlon.gif" /&gt;, así que me puse manos a la obra... ¡ahora no puedo vivir sin ellas! Se han convertido en parte imprescindible, y las uso bastante, allá donde un &amp;quot;indexOf&amp;quot; o un &amp;quot;Replace&amp;quot; de un string normal se queda corto.&lt;br /&gt;&lt;br /&gt;Ya he escrito sobre expresiones regulares en un par de artículos&lt;span id="ctl00_ContentPlaceHolder1_Articulos1_DataList1_ctl06_TextoLabel" style="width: 100%; font-size: 13px;"&gt; (introducción a expresiones regulares y Cómo trabajar las expresiones regulares en ASP.NET), además, uno de mis proyectos OpenSource (&lt;a href="http://www.codeplex.com/improvementkit" target="_blank" rel="nofollow"&gt;Improvement Kit&lt;/a&gt;), está basado justamente en su uso.&lt;br /&gt;&lt;br /&gt;El asunto es que cuando trabajas con expresiones regulares, es bastante común tener que comprobar su correcto funcionamiento, porque a partir de cierta complejidad es prácticamente imposible que aciertes a la primera &lt;img src="http://www.subgurim.net/images/smilies/1064-escaqueo2.gif" /&gt;.&lt;br /&gt;&lt;br /&gt;Hasta ahora yo trabajaba con el programa que indico en el artículo ya mencionado introducción a expresiones regulares (llamado Expresso). Es un programa muy potente y sencillo de usar, pero no es gratuito... además tampoco es un programa Web, algo hacia lo que tiende prácticamente todo.&lt;br /&gt;&lt;br /&gt;Por tanto, dado que me estoy aficionando a hacer iGadgets por doquier, decidí hacer un iGadget de expresiones regulares. Para los que no sepáis lo que es un iGadget, se trata de los Gadgets que te puedes instalar en la página principal de Google... para los que no sepáis que es un Gadget (¡¡deberíais saberlo!!), son pequeñas aplicaciones que ofrecen pequeñas funcionalidad muy sencillas de usar.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://fusion.google.com/add?moduleurl=http%3A//hosting.gmodules.com/ig/gadgets/file/110878398003115064868/RegexEvaluator.xml" target="_blank" rel="nofollow"&gt;Puedes instalártelo en tu página principal de Google desde aquí&lt;/a&gt;.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;</description>
      <link>http://www.subgurim.net/Articulos/ajax-y-javascript/167/regex-evaluator-un-igadget-para-expresiones-regulares.aspx</link>
      <pubDate>Thu, 13 Dec 2007 18:21:28 GMT</pubDate>
      <guid>http://www.subgurim.net/Articulos/ajax-y-javascript/167/regex-evaluator-un-igadget-para-expresiones-regulares.aspx</guid>
    </item>
  </channel>
</rss>