<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss version="2.0">
  <channel>
    <title>www.Devjoker.com</title>
    <link>http://www.devjoker.com/asp/feeds.aspx</link>
    <description>Web dedicada a la informatica y programación en general, .NET en particular.</description>
    <language>es-ES</language>
    <atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/devjoker" /><feedburner:info xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" uri="devjoker" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><item>
      <title>MAP 2012 - MAP (Microsoft Active Professional)</title>
      <link>/contenidos/articulos/509/MAP-2012--MAP-Microsoft-Active-Professional.aspx</link>
      <description>&lt;p&gt;El pasado día 22 de febrero recibí un correo de Microsoft notificándome que la excelente noticia de que Microsoft me ha reconocido como MAP 2012. &lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;&lt;em&gt;Microsoft Active Professional (MAP) es una distinción otorgada a no más del &lt;strong&gt;5% de los Profesionales de IT &lt;/strong&gt;cuya dedicación durante el último año sobresalió sobre el resto de sus colegas.&amp;nbsp; Reconoce el tiempo y esfuerzo que dichos profesionales invirtieron en &lt;strong&gt;mantenerse actualizados y capacitarse en tecnologías Microsoft&lt;/strong&gt;, demostrando su esmero por estar &lt;strong&gt;siempre en contacto con los últimos avances de nuestra tecnología&lt;/strong&gt;. &lt;/em&gt;&lt;/p&gt;&lt;/blockquote&gt; &lt;a href="http://devjoker.com/images/UploadFiles/Windows-Live-Writer/bc09a66052f8_C28F/image_4.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://devjoker.com/images/UploadFiles/Windows-Live-Writer/bc09a66052f8_C28F/image_thumb_1.png" width="340" height="390"&gt;&lt;/a&gt; &lt;p&gt;Este reconocimiento es para mí una inmensa alegría que quiero compartir con vosotros,&amp;nbsp; y una motivación para seguir intentando mejorar cada día.&lt;/p&gt; &lt;p&gt;Saludos, DJK!&lt;/p&gt;</description>
      <guid>/contenidos/articulos/509/MAP-2012--MAP-Microsoft-Active-Professional.aspx</guid>
      <pubDate>Fri, 24 Feb 2012 14:06:22 GMT</pubDate>
    </item>
    <item>
      <title>Tempo.js, motor de renderizaci&amp;oacute;n de plantillas HTML con JSON. Ejemplo con ASP.NET</title>
      <link>/contenidos/articulos/508/Tempojs-motor-de-renderizacioacuten-de-plantillas-HTML-con-JSON-Ejemplo-con-ASPNET.aspx</link>
      <description>&lt;p&gt;Tempo es una librería javascript que nos va a permitir renderizar datos en formato JSON sobre plantillas de HTML. Renderizar los datos sobre plantillas de HTML nos va a permitir separar completamente la presentación de la lógica necesaria para la obtención de los datos.&lt;/p&gt; &lt;p&gt;Vamos a verlo con un ejemplo. Para serializar objetos .NET a JSON vamos a utilizar la librería &lt;a href="http://devjoker.com/contenidos/Articulos/505/JSONNET-Mejorando-la-serializacioacuten-JSON-con-NET.aspx"&gt;JSON.NET&lt;/a&gt;., &lt;a href="http://jquery.com/"&gt;jQuery&lt;/a&gt; como librería Ajax y &lt;a href="http://tempojs.com/"&gt;Tempo.js&lt;/a&gt; para las plantillas HTML.&lt;/p&gt; &lt;p&gt;Realizamos los siguientes pasos:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;Con Visual Studio 2010 creamos un nuevo sitio web. Añadimos una página aspx, Home.aspx.&lt;/li&gt; &lt;li&gt;Añadimos la referencias a jQuery y JSON.NET, preferiblemente utilizando &lt;a href="http://nuget.org/"&gt;nuget&lt;/a&gt;.&lt;/li&gt; &lt;li&gt;Añadimos la referencia a Tempo.js, lamentablemente en estos momentos no existe un package de nuget para Tempo.js, por lo que tendremos que descargar manualmente la librería y añadir los archivos tempo.js y tempo.min.js manualmente a nuestro sitio.&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;Para poder realizar nuestro ejemplo lo primero es, sobre App_Code, crear una clase persona , que será el objeto que devolveremos en JSON.&lt;/p&gt;&lt;pre class="code"&gt;&lt;span style="color: blue"&gt;using &lt;/span&gt;System;
&lt;span style="color: blue"&gt;using &lt;/span&gt;System.Collections.Generic;
&lt;span style="color: blue"&gt;using &lt;/span&gt;System.Linq;
&lt;span style="color: blue"&gt;using &lt;/span&gt;System.Web;


&lt;span style="color: blue"&gt;public class &lt;/span&gt;&lt;span style="color: #2b91af"&gt;Persona
&lt;/span&gt;{
    &lt;span style="color: blue"&gt;public &lt;/span&gt;Persona(&lt;span style="color: blue"&gt;string &lt;/span&gt;nombre, &lt;span style="color: blue"&gt;string &lt;/span&gt;apellidos, &lt;span style="color: #2b91af"&gt;DateTime &lt;/span&gt;fechaNacimiento)
    {
        Id = &lt;span style="color: #2b91af"&gt;Guid&lt;/span&gt;.NewGuid();
        Nombre = nombre;
        Apellidos = apellidos;
        FechaNacimiento = fechaNacimiento;
    }

    &lt;span style="color: blue"&gt;public &lt;/span&gt;&lt;span style="color: #2b91af"&gt;Guid &lt;/span&gt;Id { &lt;span style="color: blue"&gt;get&lt;/span&gt;; &lt;span style="color: blue"&gt;set&lt;/span&gt;; }
    &lt;span style="color: blue"&gt;public string &lt;/span&gt;Nombre { &lt;span style="color: blue"&gt;get&lt;/span&gt;; &lt;span style="color: blue"&gt;set&lt;/span&gt;; }
    &lt;span style="color: blue"&gt;public string &lt;/span&gt;Apellidos { &lt;span style="color: blue"&gt;get&lt;/span&gt;; &lt;span style="color: blue"&gt;set&lt;/span&gt;; }
    &lt;span style="color: blue"&gt;public &lt;/span&gt;&lt;span style="color: #2b91af"&gt;DateTime &lt;/span&gt;FechaNacimiento { &lt;span style="color: blue"&gt;get&lt;/span&gt;; &lt;span style="color: blue"&gt;set&lt;/span&gt;; }

}
&lt;/pre&gt;La clase es sencilla, pero hemos incluido un campo DateTime que nos va a dar problemas. Lo hemos hecho a proposito para ilustrar&amp;nbsp; el modo de trabajar con fechas en JSON … 
&lt;p&gt;Ahora creamos un handler que nos devolverá una colección de personas. Este handler es el que invocaremos desde la página Home.aspx para mostrar los datos&lt;/p&gt;&lt;pre class="code"&gt;&lt;span style="background: yellow"&gt;&amp;lt;%&lt;/span&gt;&lt;span style="color: blue"&gt;@ &lt;/span&gt;&lt;span style="color: maroon"&gt;WebHandler &lt;/span&gt;&lt;span style="color: red"&gt;Language&lt;/span&gt;&lt;span style="color: blue"&gt;="C#" &lt;/span&gt;&lt;span style="color: red"&gt;Class&lt;/span&gt;&lt;span style="color: blue"&gt;="PersonasDataHandler" &lt;/span&gt;&lt;span style="background: yellow"&gt;%&amp;gt;

&lt;/span&gt;&lt;span style="color: blue"&gt;using &lt;/span&gt;System;
&lt;span style="color: blue"&gt;using &lt;/span&gt;System.Web;
&lt;span style="color: blue"&gt;using &lt;/span&gt;System.Collections.Generic;

&lt;span style="color: blue"&gt;public class &lt;/span&gt;&lt;span style="color: #2b91af"&gt;PersonasDataHandler &lt;/span&gt;: &lt;span style="color: #2b91af"&gt;IHttpHandler &lt;/span&gt;{
    
    &lt;span style="color: blue"&gt;public void &lt;/span&gt;ProcessRequest (&lt;span style="color: #2b91af"&gt;HttpContext &lt;/span&gt;context) {
        context.Response.ContentType = &lt;span style="color: #a31515"&gt;"application/json"&lt;/span&gt;;


        &lt;span style="color: blue"&gt;var &lt;/span&gt;personas = &lt;span style="color: blue"&gt;new  &lt;/span&gt;&lt;span style="color: #2b91af"&gt;List&lt;/span&gt;&amp;lt;&lt;span style="color: #2b91af"&gt;Persona&lt;/span&gt;&amp;gt;();
        &lt;span style="color: blue"&gt;for &lt;/span&gt;(&lt;span style="color: blue"&gt;int &lt;/span&gt;i = 0; i &amp;lt; 500; i++)
        {
            personas.Add(&lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;Persona&lt;/span&gt;(&lt;span style="color: #a31515"&gt;"Nombre " &lt;/span&gt;+ i, &lt;span style="color: #a31515"&gt;"Apellido " &lt;/span&gt;+ i, &lt;span style="color: #2b91af"&gt;DateTime&lt;/span&gt;.Now.AddDays(i*(-1))));
        }

        &lt;span style="color: blue"&gt;var &lt;/span&gt;json = Newtonsoft.Json.&lt;span style="color: #2b91af"&gt;JsonConvert&lt;/span&gt;.&lt;strong&gt;SerializeObject&lt;/strong&gt;(personas, &lt;br&gt;                                                               &lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;&lt;strong&gt;CultureDateTimeConverter&lt;/strong&gt;&lt;/span&gt;(CurrentCulture));
        context.Response.Write(json);

    }
    
    &lt;span style="color: blue"&gt;public &lt;/span&gt;System.Globalization.&lt;span style="color: #2b91af"&gt;CultureInfo &lt;/span&gt;CurrentCulture { 
        &lt;span style="color: blue"&gt;get &lt;/span&gt;{
            &lt;span style="color: blue"&gt;return &lt;/span&gt;System.Threading.&lt;span style="color: #2b91af"&gt;Thread&lt;/span&gt;.CurrentThread.CurrentUICulture;
        } 
    }
    
    &lt;span style="color: blue"&gt;public bool &lt;/span&gt;IsReusable {
        &lt;span style="color: blue"&gt;get &lt;/span&gt;{
            &lt;span style="color: blue"&gt;return false&lt;/span&gt;;
        }
    }

}
&lt;/pre&gt;
&lt;p&gt;Fijémonos en que a la hora de serializar la colección de personas, utilizamos una de las sobrecargas del método &lt;em&gt;SerializeObject&lt;/em&gt;, pasándole un converter que va a indicar al serializador como deben serializarse las fechas. &lt;/p&gt;
&lt;p&gt;Trabajar con fechas y JSON representa un problema, que básicamente se resume en que la especificación de JSON no define un formato de fecha. La librería JSON.NET nos permite modificar como se serializan las fechas a través de esta sobrecarga y un conjunto de convertidores (clases derivadas de &lt;em&gt;DateTimeConverterBase&lt;/em&gt;). Si queremos saber mas sobre este problema recomiendo el siguiente enlace :&lt;a title="http://james.newtonking.com/archive/2009/02/20/good-date-times-with-json-net.aspx" href="http://james.newtonking.com/archive/2009/02/20/good-date-times-with-json-net.aspx"&gt;http://james.newtonking.com/archive/2009/02/20/good-date-times-with-json-net.aspx&lt;/a&gt; del propio James Newton-King (autor de JSON.NET)&lt;/p&gt;
&lt;p&gt;Personalmente opino que&amp;nbsp; siempre que sea posible, deberíamos enviar el dato como texto al navegador ¿porque? por simplicidad (&lt;a href="http://es.wikipedia.org/wiki/Principio_KISS"&gt;principio KISS&lt;/a&gt;). Bueno, dicho esto creamos un converter especifico para nuestras intenciones, permitimos modificar el formato de salida a través de un objeto &lt;em&gt;CultureInfo. &lt;/em&gt;Al igual que hicimos con &lt;em&gt;Persona&lt;/em&gt;,crearemos las clase sobre App_Code.&lt;/p&gt;&lt;pre class="code"&gt;&lt;span style="color: blue"&gt;using &lt;/span&gt;System;
&lt;span style="color: blue"&gt;using &lt;/span&gt;System.Collections.Generic;
&lt;span style="color: blue"&gt;using &lt;/span&gt;System.Linq;
&lt;span style="color: blue"&gt;using &lt;/span&gt;System.Web;
&lt;span style="color: blue"&gt;using &lt;/span&gt;Newtonsoft.Json.Converters;
&lt;span style="color: blue"&gt;using &lt;/span&gt;System.Globalization;


&lt;span style="color: blue"&gt;public class &lt;/span&gt;&lt;span style="color: #2b91af"&gt;CultureDateTimeConverter &lt;/span&gt;: &lt;span style="color: #2b91af"&gt;DateTimeConverterBase
&lt;/span&gt;{
    &lt;span style="color: #2b91af"&gt;CultureInfo &lt;/span&gt;_culture = &lt;span style="color: blue"&gt;null&lt;/span&gt;;
    &lt;span style="color: blue"&gt;public &lt;/span&gt;CultureDateTimeConverter(&lt;span style="color: #2b91af"&gt;CultureInfo &lt;/span&gt;culture)
    {
        _culture = culture;
    }


    &lt;span style="color: blue"&gt;public override object &lt;/span&gt;ReadJson&lt;br&gt;   (Newtonsoft.Json.&lt;span style="color: #2b91af"&gt;JsonReader &lt;/span&gt;reader, &lt;span style="color: #2b91af"&gt;Type &lt;/span&gt;objectType, &lt;span style="color: blue"&gt;object &lt;/span&gt;existingValue, Newtonsoft.Json.&lt;span style="color: #2b91af"&gt;JsonSerializer &lt;/span&gt;serializer)
    {
        &lt;span style="color: blue"&gt;throw new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;NotImplementedException&lt;/span&gt;();
    }

    &lt;span style="color: blue"&gt;public override void &lt;/span&gt;WriteJson&lt;br&gt;   (Newtonsoft.Json.&lt;span style="color: #2b91af"&gt;JsonWriter &lt;/span&gt;writer, &lt;span style="color: blue"&gt;object &lt;/span&gt;value, Newtonsoft.Json.&lt;span style="color: #2b91af"&gt;JsonSerializer &lt;/span&gt;serializer)
    {
        &lt;span style="color: blue"&gt;string &lt;/span&gt;dateStringValue=&lt;span style="color: #a31515"&gt;""&lt;/span&gt;;
        &lt;span style="color: blue"&gt;if &lt;/span&gt;(value &lt;span style="color: blue"&gt;is &lt;/span&gt;&lt;span style="color: #2b91af"&gt;DateTime&lt;/span&gt;)
        {
            &lt;span style="color: #2b91af"&gt;DateTime &lt;/span&gt;dateTime = (&lt;span style="color: #2b91af"&gt;DateTime&lt;/span&gt;)value;
            &lt;span style="color: #2b91af"&gt;DateTime &lt;/span&gt;utcDateTime = dateTime.ToUniversalTime();
            dateStringValue = dateTime.ToString(_culture);
        }
        &lt;span style="color: blue"&gt;else
        &lt;/span&gt;{
            &lt;span style="color: blue"&gt;if &lt;/span&gt;(value &lt;span style="color: blue"&gt;is &lt;/span&gt;&lt;span style="color: #2b91af"&gt;DateTimeOffset&lt;/span&gt;)
            {
                &lt;span style="color: #2b91af"&gt;DateTimeOffset &lt;/span&gt;dateTimeOffset = (&lt;span style="color: #2b91af"&gt;DateTimeOffset&lt;/span&gt;)value;
                &lt;span style="color: #2b91af"&gt;DateTimeOffset &lt;/span&gt;utcDateTimeOffset = dateTimeOffset.ToUniversalTime();
                dateStringValue = dateTimeOffset.ToString(_culture);
                
            }
            &lt;span style="color: blue"&gt;throw new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;Exception&lt;/span&gt;(&lt;span style="color: #a31515"&gt;"Expected date object value."&lt;/span&gt;);
        }        
        writer.WriteValue(dateStringValue );        
    }
}
&lt;/pre&gt;
&lt;p&gt;Dejamos el método &lt;em&gt;ReadJson&lt;/em&gt; como no implementado, ya que no lo necesitamos (¿segregación de interfaces?si).&lt;/p&gt;
&lt;p&gt;Bien, ahora que ya tenemos todos los elementos solo nos falta la página.&lt;/p&gt;&lt;pre class="code"&gt;&lt;span style="background: yellow"&gt;&amp;lt;%&lt;/span&gt;&lt;span style="color: blue"&gt;@ &lt;/span&gt;&lt;span style="color: maroon"&gt;Page &lt;/span&gt;&lt;span style="color: red"&gt;Language&lt;/span&gt;&lt;span style="color: blue"&gt;="C#" &lt;/span&gt;&lt;span style="color: red"&gt;AutoEventWireup&lt;/span&gt;&lt;span style="color: blue"&gt;="true" &lt;/span&gt;&lt;span style="color: red"&gt;CodeFile&lt;/span&gt;&lt;span style="color: blue"&gt;="Home.aspx.cs" &lt;/span&gt;&lt;span style="color: red"&gt;Inherits&lt;/span&gt;&lt;span style="color: blue"&gt;="Home" &lt;/span&gt;&lt;span style="background: yellow"&gt;%&amp;gt;

&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;lt;!&lt;/span&gt;&lt;span style="color: maroon"&gt;DOCTYPE &lt;/span&gt;&lt;span style="color: red"&gt;html &lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;
&amp;lt;&lt;/span&gt;&lt;span style="color: maroon"&gt;html&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;
&amp;lt;&lt;/span&gt;&lt;span style="color: maroon"&gt;head &lt;/span&gt;&lt;span style="color: red"&gt;runat&lt;/span&gt;&lt;span style="color: blue"&gt;="server"&amp;gt;
    &amp;lt;&lt;/span&gt;&lt;span style="color: maroon"&gt;title&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon"&gt;title&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;
    &amp;lt;&lt;/span&gt;&lt;span style="color: maroon"&gt;style &lt;/span&gt;&lt;span style="color: red"&gt;type&lt;/span&gt;&lt;span style="color: blue"&gt;="text/css"&amp;gt;
        &lt;/span&gt;&lt;span style="color: maroon"&gt;.hidden
        &lt;/span&gt;{
            &lt;span style="color: red"&gt;display&lt;/span&gt;: &lt;span style="color: blue"&gt;none&lt;/span&gt;;
        }
    &lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon"&gt;style&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;
    &amp;lt;&lt;/span&gt;&lt;span style="color: maroon"&gt;script &lt;/span&gt;&lt;span style="color: red"&gt;src&lt;/span&gt;&lt;span style="color: blue"&gt;="Scripts/jquery-1.4.1.min.js" &lt;/span&gt;&lt;span style="color: red"&gt;type&lt;/span&gt;&lt;span style="color: blue"&gt;="text/javascript"&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon"&gt;script&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;
    &amp;lt;&lt;/span&gt;&lt;span style="color: maroon"&gt;script &lt;/span&gt;&lt;span style="color: red"&gt;src&lt;/span&gt;&lt;span style="color: blue"&gt;="Scripts/tempo.min.js" &lt;/span&gt;&lt;span style="color: red"&gt;type&lt;/span&gt;&lt;span style="color: blue"&gt;="text/javascript"&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon"&gt;script&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;
    &amp;lt;&lt;/span&gt;&lt;span style="color: maroon"&gt;script &lt;/span&gt;&lt;span style="color: red"&gt;type&lt;/span&gt;&lt;span style="color: blue"&gt;="text/javascript"&amp;gt;
        &lt;/span&gt;$(document).ready(&lt;span style="color: blue"&gt;function &lt;/span&gt;() {
            &lt;span style="color: blue"&gt;var &lt;/span&gt;url = &lt;span style="color: maroon"&gt;'&lt;/span&gt;&lt;span style="background: yellow; color: maroon"&gt;&amp;lt;%&lt;/span&gt;&lt;span style="color: maroon"&gt;:VirtualPathUtility.ToAbsolute("~/Handlers/PersonasDataHandler.ashx") &lt;/span&gt;&lt;span style="background: yellow; color: maroon"&gt;%&amp;gt;&lt;/span&gt;&lt;span style="color: maroon"&gt;'&lt;/span&gt;;
            $.getJSON(url, &lt;span style="color: blue"&gt;function &lt;/span&gt;(jsonData) {
                Tempo.prepare(&lt;span style="color: maroon"&gt;"template"&lt;/span&gt;).render(jsonData);
                $(&lt;span style="color: maroon"&gt;"#template"&lt;/span&gt;).removeClass(&lt;span style="color: maroon"&gt;"hidden"&lt;/span&gt;);
            });
        });
    
    &lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon"&gt;script&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;
&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon"&gt;head&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;
&amp;lt;&lt;/span&gt;&lt;span style="color: maroon"&gt;body&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;
    &amp;lt;&lt;/span&gt;&lt;span style="color: maroon"&gt;form &lt;/span&gt;&lt;span style="color: red"&gt;id&lt;/span&gt;&lt;span style="color: blue"&gt;="form1" &lt;/span&gt;&lt;span style="color: red"&gt;runat&lt;/span&gt;&lt;span style="color: blue"&gt;="server"&amp;gt;
    &amp;lt;&lt;/span&gt;&lt;span style="color: maroon"&gt;div&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;
        &amp;lt;&lt;/span&gt;&lt;span style="color: maroon"&gt;ol &lt;/span&gt;&lt;span style="color: red"&gt;id&lt;/span&gt;&lt;span style="color: blue"&gt;="template" &lt;/span&gt;&lt;span style="color: red"&gt;class&lt;/span&gt;&lt;span style="color: blue"&gt;="hidden"&amp;gt;
            &amp;lt;&lt;/span&gt;&lt;span style="color: maroon"&gt;li &lt;/span&gt;&lt;span style="color: red"&gt;data-template&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;
                &amp;lt;&lt;/span&gt;&lt;span style="color: maroon"&gt;h3&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;
                    &lt;/span&gt;{{Id}}&lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon"&gt;h3&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;
                &amp;lt;&lt;/span&gt;&lt;span style="color: maroon"&gt;p&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;
                    &lt;/span&gt;{{Nombre}}, {{Apellidos|truncate 25}}&lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon"&gt;p&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;
                &amp;lt;&lt;/span&gt;&lt;span style="color: maroon"&gt;p&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;
                    &lt;/span&gt;nacido el {{FechaNacimiento}}&lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon"&gt;p&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;
            &amp;lt;/&lt;/span&gt;&lt;span style="color: maroon"&gt;li&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;
            &amp;lt;&lt;/span&gt;&lt;span style="color: maroon"&gt;li &lt;/span&gt;&lt;span style="color: red"&gt;data-template-fallback&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;
            &lt;/span&gt;Error, Javascript necesario para visualizar la página!&lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon"&gt;li&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;
        &amp;lt;/&lt;/span&gt;&lt;span style="color: maroon"&gt;ol&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;
    &amp;lt;/&lt;/span&gt;&lt;span style="color: maroon"&gt;div&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;
    &amp;lt;/&lt;/span&gt;&lt;span style="color: maroon"&gt;form&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;
&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon"&gt;body&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;
&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon"&gt;html&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;
&lt;/span&gt;&lt;/pre&gt;
&lt;p&gt;La página es muy sencilla, y sin duda el elemento mas interesante es el template de Tempo.js. En realidad se trata de HTML normal, en el que insertamos marcas que el motor de renderizado identifica - &lt;a href="http://tempojs.com/#html"&gt;http://tempojs.com/#html&lt;/a&gt; - y que va a sustituir los datos obtenidos del servidor.&lt;/p&gt;&lt;pre class="code"&gt;&lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon"&gt;ol &lt;/span&gt;&lt;span style="color: red"&gt;id&lt;/span&gt;&lt;span style="color: blue"&gt;="template" &lt;/span&gt;&lt;span style="color: red"&gt;class&lt;/span&gt;&lt;span style="color: blue"&gt;="hidden"&amp;gt;
    &amp;lt;&lt;/span&gt;&lt;span style="color: maroon"&gt;li &lt;/span&gt;&lt;span style="color: red"&gt;data-template&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;
        &amp;lt;&lt;/span&gt;&lt;span style="color: maroon"&gt;h3&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;
            &lt;/span&gt;{{Id}}&lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon"&gt;h3&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;
        &amp;lt;&lt;/span&gt;&lt;span style="color: maroon"&gt;p&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;
            &lt;/span&gt;{{Nombre}}, {{Apellidos|truncate 25}}&lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon"&gt;p&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;
        &amp;lt;&lt;/span&gt;&lt;span style="color: maroon"&gt;p&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;
            &lt;/span&gt;nacido el {{FechaNacimiento}}&lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon"&gt;p&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;
    &amp;lt;/&lt;/span&gt;&lt;span style="color: maroon"&gt;li&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;
    &amp;lt;&lt;/span&gt;&lt;span style="color: maroon"&gt;li &lt;/span&gt;&lt;span style="color: red"&gt;data-template-fallback&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;
    &lt;/span&gt;Error, Javascript necesario para visualizar la página!&lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon"&gt;li&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;
&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon"&gt;ol&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;
&lt;/span&gt;&lt;/pre&gt;
&lt;p&gt;Fijémonos en la marca de &lt;em&gt;{{Apellidos}}, &lt;/em&gt;posee un marcado especial &lt;em&gt;truncate&lt;/em&gt; que le indica que debe truncar el dato cuando este exceda de 25 posiciones. Tempo.js posee un buen número de marcadores y filtros que nos van a permitir formatear nuestros datos cómodamente – &lt;a title="http://tempojs.com/#filter-functions" href="http://tempojs.com/#filter-functions"&gt;http://tempojs.com/#filter-functions&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Tempo.js también nos permite anidar plantillar, plantillar condicionales,&amp;nbsp; definir platillas de error para cuando el navegador no dispone de soporte para JavaScript … os recomiendo que echéis un vistazo a la web para que veáis la lista completa de funcionalidades. &lt;a href="http://tempojs.com/"&gt;http://tempojs.com/&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;Bien, pues solo nos falta comentar el script de inicialización de página, en el que activamos Tempo.js y vamos al servidor para obtener los datos en formato JSON.&lt;/p&gt;&lt;pre class="code"&gt;&lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon"&gt;script &lt;/span&gt;&lt;span style="color: red"&gt;type&lt;/span&gt;&lt;span style="color: blue"&gt;="text/javascript"&amp;gt;
    &lt;/span&gt;$(document).ready(&lt;span style="color: blue"&gt;function &lt;/span&gt;() {
        &lt;span style="color: blue"&gt;var &lt;/span&gt;url = &lt;span style="color: maroon"&gt;'&lt;/span&gt;&lt;span style="background: yellow; color: maroon"&gt;&amp;lt;%&lt;/span&gt;&lt;span style="color: maroon"&gt;:VirtualPathUtility.ToAbsolute("~/Handlers/PersonasDataHandler.ashx") &lt;/span&gt;&lt;span style="background: yellow; color: maroon"&gt;%&amp;gt;&lt;/span&gt;&lt;span style="color: maroon"&gt;'&lt;/span&gt;;
        $.getJSON(url, &lt;span style="color: blue"&gt;function &lt;/span&gt;(jsonData) {
            Tempo.prepare(&lt;span style="color: maroon"&gt;"template"&lt;/span&gt;).render(jsonData);
            $(&lt;span style="color: maroon"&gt;"#template"&lt;/span&gt;).removeClass(&lt;span style="color: maroon"&gt;"hidden"&lt;/span&gt;);
        });
    });    
&lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon"&gt;script&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;
&lt;/span&gt;&lt;/pre&gt;
&lt;p&gt;Activar Tempo.js es muy sencillo, solo debemos llamar al método prepare y posteriormente renderizar los datos.&lt;/p&gt;&lt;pre class="code"&gt;Tempo.prepare(&lt;span style="color: maroon"&gt;"template"&lt;/span&gt;).render(jsonData);&lt;/pre&gt;
&lt;p&gt;El programa en ejecucion queda de la siguiente forma … Bonito lo que se dice bonito no lo hemos hecho … pero …&lt;/p&gt;
&lt;p&gt;&lt;a href="http://devjoker.com/images/UploadFiles/Windows-Live-Writer/Tempo.js-motor-de-renderizacin-de-JSON_A691/image_2.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://devjoker.com/images/UploadFiles/Windows-Live-Writer/Tempo.js-motor-de-renderizacin-de-JSON_A691/image_thumb.png" width="374" height="323"&gt;&lt;/a&gt;&lt;br&gt;Como ya hicimos en el post anterior hemos subido el código a SkyDrive para que podáis descargarlo. Este es el enlace: &lt;a href="https://skydrive.live.com/#cid=20A9C248301397B3&amp;amp;id=20A9C248301397B3%21143"&gt;https://skydrive.live.com/#cid=20A9C248301397B3&amp;amp;id=20A9C248301397B3%21143&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;br&gt;Finalmente solo decir que Tempo.js no es la única librería de este tipo que existe, pero si me ha parecido muy fácil de utilizar, por lo que os invito a utilizar los comentarios para contar vuestras experiencias con otras librerías de este estilo.&lt;/p&gt;
&lt;p&gt;Saludos, &lt;/p&gt;
&lt;p&gt;DJK!&lt;/p&gt;</description>
      <guid>/contenidos/articulos/508/Tempojs-motor-de-renderizacioacuten-de-plantillas-HTML-con-JSON-Ejemplo-con-ASPNET.aspx</guid>
      <pubDate>Wed, 22 Feb 2012 14:38:40 GMT</pubDate>
    </item>
    <item>
      <title>Saeed Malekpour, un programador web condenado a la pena de muerte</title>
      <link>/contenidos/articulos/507/Saeed-Malekpour-un-programador-web-condenado-a-la-pena-de-muerte.aspx</link>
      <description>&lt;p&gt;&lt;a href="http://devjoker.com/images/UploadFiles/Windows-Live-Writer/6bd8669b23d5_95C6/image_2.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://devjoker.com/images/UploadFiles/Windows-Live-Writer/6bd8669b23d5_95C6/image_thumb.png" width="637" height="247"&gt;&lt;/a&gt; &lt;p&gt;En muchos países se intentan incriminar a los programadores del uso que se dan sus programas por los usuarios. No hay que ir muy lejos para comprobar casos como &lt;strong&gt;ManolitoP2P o Megaupload&lt;/strong&gt;. Sin embargo, en algunos casos o países se pueden llegar a extremos realmente graves como el caso que está ocurriendo recientemente en Irán. &lt;p&gt;&lt;strong&gt;Saeed Malekpour&lt;/strong&gt; es un desarrollador web de origen iraní que se enfrenta a una inminente ejecución de su condena de pena de muerte. Su delito no ha sido otro que desarrollar una aplicación que permitía subir y compartir imágenes por los usuarios. Estas imágenes fueron utilizadas para compartir fotografías pornográficas y por ello fue arrestado. Hace unos meses un jurado lo declaró culpable con la tremenda condena de la pena de muerte.&lt;br&gt;Este programador de &lt;strong&gt;36 años de edad&lt;/strong&gt;, aunque es de origen iraní, cambió su residencia a Canadá en el 2005 donde trabajó como diseñador web en este país. En 2008 visitó a su padre a Irán por motivos de salud de este y entonces fue cuando se le arrestó. Tanto el gobierno de Canadá como Amnistía Internacional ha pedido su liberación. &lt;p&gt;Muchos partidarios de Malekpour han creado páginas en Facebook para pedir su liberación. Sin embargo, el tiempo se acaba y se acerca la inminente ejecución de este desarrollador. Es lamentable como, a parte de la pena de muerte de los que supongo que muchos estaremos en desacuerdo sea cual sea el delito, se criminaliza a desarrolladores simplemente por el contenido que se puede llegar a gestionar con las aplicaciones. Para los que queráis estar más informados sobre este caso os invito a visitar el blog que cito que solicita &lt;strong&gt;la libertad de Saeed Malekpour - &lt;/strong&gt;&lt;a href="http://freesaeedmalekpour.wordpress.com/"&gt;http://freesaeedmalekpour.wordpress.com/&lt;/a&gt;. &lt;p&gt;Copiado de:&lt;a title="http://www.genbetadev.com/actualidad/saeed-malekpour-un-programador-web-condenado-a-la-pena-de-muerte" href="http://www.genbetadev.com/actualidad/saeed-malekpour-un-programador-web-condenado-a-la-pena-de-muerte"&gt;http://www.genbetadev.com/actualidad/saeed-malekpour-un-programador-web-condenado-a-la-pena-de-muerte&lt;/a&gt;</description>
      <guid>/contenidos/articulos/507/Saeed-Malekpour-un-programador-web-condenado-a-la-pena-de-muerte.aspx</guid>
      <pubDate>Mon, 20 Feb 2012 10:40:02 GMT</pubDate>
    </item>
    <item>
      <title>Como mejorar la usabilidad de un listado maestro-detalle con jQuery y Ajax</title>
      <link>/contenidos/articulos/506/Como-mejorar-la-usabilidad-de-un-listado-maestro-detalle-con-jQuery-y-Ajax.aspx</link>
      <description>&lt;p&gt;En este articulo vamos a ver como podemos mejorar muchísimo la experiencia de usuario de nuestros aburridos listados de datos. Habitualmente cuando incluimos un listado en una aplicación,incluimos un enlace que permite acceder al detalle de cada fila.&amp;nbsp; &lt;/p&gt; &lt;p&gt;Está forma de actuar, aún siendo perfectamente correcta, deteriora la experiencia que el usuario tiene al interactuar con nuestra aplicación. En su lugar, una buena técnica es cargar los datos adicionales a través de ajax y mostrarlos en su contexto. En este articulo explicamos como incluir dinámicamente una nueva fila a nuestro listado y cargar en ella el detalle, reutilizando además las páginas existentes.&lt;/p&gt; &lt;p&gt;Para realizar el ejemplo debemos crear un proyecto de tipo WebSite que estará compuesto por los siguientes elementos:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;Dos WebForms,&lt;em&gt; Default.aspx&lt;/em&gt; y&lt;em&gt; page2.aspx&lt;/em&gt;. Son las páginas del listado y el detalle.  &lt;li&gt;Una hoja de estilo, &lt;em&gt;site.css&lt;/em&gt;.  &lt;li&gt;Tres imágenes, que por simplicidad deben llamarse: logo1.jpg, logo2.jpg y logo3.jpg.&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;Por supuesto debemos añadir la referencia a &lt;a href="http://jquery.com/"&gt;jQuery&lt;/a&gt; con &lt;a href="http://nuget.org/"&gt;nuGet&lt;/a&gt;. El proyecto debería parecerse a esto …&lt;/p&gt; &lt;p&gt;&lt;a href="http://devjoker.com/images/UploadFiles/Windows-Live-Writer/Detalle-de-un-listado-con-jQuery_C08E/image_8.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto; padding-top: 0px" title="image" border="0" alt="image" src="http://devjoker.com/images/UploadFiles/Windows-Live-Writer/Detalle-de-un-listado-con-jQuery_C08E/image_thumb_3.png" width="120" height="244"&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;Empezaremos por lo más fácil, el contenido del archivo &lt;em&gt;site.css&lt;/em&gt;, es el siguiente:&lt;/p&gt;&lt;pre class="code"&gt;&lt;span style="color: maroon"&gt;.red&lt;/span&gt;{&lt;span style="color: red"&gt;color&lt;/span&gt;:&lt;span style="color: blue"&gt;red&lt;/span&gt;}
&lt;span style="color: maroon"&gt;.content&lt;/span&gt;{&lt;span style="color: red"&gt;display&lt;/span&gt;:&lt;span style="color: blue"&gt;none&lt;/span&gt;}
&lt;span style="color: maroon"&gt;table&lt;/span&gt;, &lt;span style="color: maroon"&gt;th&lt;/span&gt;, &lt;span style="color: maroon"&gt;td &lt;/span&gt;{&lt;span style="color: red"&gt;border&lt;/span&gt;:&lt;span style="color: blue"&gt;1px groove grey &lt;/span&gt;}    
&lt;span style="color: maroon"&gt;.table-content&lt;/span&gt;{&lt;span style="color: red"&gt;width&lt;/span&gt;:&lt;span style="color: blue"&gt;750px &lt;/span&gt;}
&lt;span style="color: maroon"&gt;.logo&lt;/span&gt;{&lt;span style="color: red"&gt;float&lt;/span&gt;:&lt;span style="color: blue"&gt;left&lt;/span&gt;}
&lt;span style="color: maroon"&gt;.logo-text&lt;/span&gt;{}
&lt;/pre&gt;
&lt;p&gt;Ahora vamos a la primera página &lt;em&gt;Default.aspx&lt;/em&gt;, es la página que muestra el listado&lt;/p&gt;&lt;pre class="code"&gt;&lt;span style="background: yellow"&gt;&amp;lt;%&lt;/span&gt;&lt;span style="color: blue"&gt;@ &lt;/span&gt;&lt;span style="color: maroon"&gt;Page &lt;/span&gt;&lt;span style="color: red"&gt;Language&lt;/span&gt;&lt;span style="color: blue"&gt;="C#" &lt;/span&gt;&lt;span style="color: red"&gt;AutoEventWireup&lt;/span&gt;&lt;span style="color: blue"&gt;="true" &lt;/span&gt;&lt;span style="color: red"&gt;CodeFile&lt;/span&gt;&lt;span style="color: blue"&gt;="Default.aspx.cs" &lt;/span&gt;&lt;span style="color: red"&gt;Inherits&lt;/span&gt;&lt;span style="color: blue"&gt;="_Default" &lt;/span&gt;&lt;span style="background: yellow"&gt;%&amp;gt;

&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;lt;!&lt;/span&gt;&lt;span style="color: maroon"&gt;DOCTYPE &lt;/span&gt;&lt;span style="color: red"&gt;html &lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;
&amp;lt;&lt;/span&gt;&lt;span style="color: maroon"&gt;html &lt;/span&gt;&lt;span style="color: red"&gt;lang&lt;/span&gt;&lt;span style="color: blue"&gt;="es"&amp;gt;
&amp;lt;&lt;/span&gt;&lt;span style="color: maroon"&gt;head &lt;/span&gt;&lt;span style="color: red"&gt;runat&lt;/span&gt;&lt;span style="color: blue"&gt;="server"&amp;gt;
    &amp;lt;&lt;/span&gt;&lt;span style="color: maroon"&gt;title&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon"&gt;title&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;
    &amp;lt;&lt;/span&gt;&lt;span style="color: maroon"&gt;script &lt;/span&gt;&lt;span style="color: red"&gt;src&lt;/span&gt;&lt;span style="color: blue"&gt;="Scripts/jquery-1.7.1.min.js" &lt;/span&gt;&lt;span style="color: red"&gt;type&lt;/span&gt;&lt;span style="color: blue"&gt;="text/javascript"&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon"&gt;script&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;
    &amp;lt;&lt;/span&gt;&lt;span style="color: maroon"&gt;link &lt;/span&gt;&lt;span style="color: red"&gt;rel&lt;/span&gt;&lt;span style="color: blue"&gt;="stylesheet" &lt;/span&gt;&lt;span style="color: red"&gt;type&lt;/span&gt;&lt;span style="color: blue"&gt;="text/css" &lt;/span&gt;&lt;span style="color: red"&gt;href&lt;/span&gt;&lt;span style="color: blue"&gt;="css/site.css" /&amp;gt;
    &lt;/span&gt;&lt;span style="color: #006400"&gt;&amp;lt;!--Aqui pondremos el script que veremos mas adelante--&amp;gt;
&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon"&gt;head&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;
&amp;lt;&lt;/span&gt;&lt;span style="color: maroon"&gt;body&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;
    &amp;lt;&lt;/span&gt;&lt;span style="color: maroon"&gt;form &lt;/span&gt;&lt;span style="color: red"&gt;id&lt;/span&gt;&lt;span style="color: blue"&gt;="form1" &lt;/span&gt;&lt;span style="color: red"&gt;runat&lt;/span&gt;&lt;span style="color: blue"&gt;="server"&amp;gt;
    &amp;lt;&lt;/span&gt;&lt;span style="color: maroon"&gt;div&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;
        &amp;lt;&lt;/span&gt;&lt;span style="color: maroon"&gt;table &lt;/span&gt;&lt;span style="color: red"&gt;class&lt;/span&gt;&lt;span style="color: blue"&gt;="table-content"&amp;gt;
            &amp;lt;&lt;/span&gt;&lt;span style="color: maroon"&gt;tr&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;
                &amp;lt;&lt;/span&gt;&lt;span style="color: maroon"&gt;td&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;
                    &amp;lt;&lt;/span&gt;&lt;span style="color: maroon"&gt;a &lt;/span&gt;&lt;span style="color: red"&gt;href&lt;/span&gt;&lt;span style="color: blue"&gt;="page2.aspx?cliente=1"&amp;gt;&lt;/span&gt;Ver&lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon"&gt;a&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;                    
                &amp;lt;/&lt;/span&gt;&lt;span style="color: maroon"&gt;td&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;
                &amp;lt;&lt;/span&gt;&lt;span style="color: maroon"&gt;td&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;
                    &lt;/span&gt;Dato
                &lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon"&gt;td&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;
                &amp;lt;&lt;/span&gt;&lt;span style="color: maroon"&gt;td&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;
                    &lt;font color="#000000"&gt;&lt;a href="http://www.devjoker.com"&gt;www.devjoker.com&lt;/font&gt;&lt;/span&gt;
&lt;/a&gt;                &lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon"&gt;td&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;
            &amp;lt;/&lt;/span&gt;&lt;span style="color: maroon"&gt;tr&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;
            &amp;lt;&lt;/span&gt;&lt;span style="color: maroon"&gt;tr&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;
                &amp;lt;&lt;/span&gt;&lt;span style="color: maroon"&gt;td&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;
                    &amp;lt;&lt;/span&gt;&lt;span style="color: maroon"&gt;a &lt;/span&gt;&lt;span style="color: red"&gt;href&lt;/span&gt;&lt;span style="color: blue"&gt;="page2.aspx?cliente=2"&amp;gt;&lt;/span&gt;Ver&lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon"&gt;a&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;                    
                &amp;lt;/&lt;/span&gt;&lt;span style="color: maroon"&gt;td&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;
                &amp;lt;&lt;/span&gt;&lt;span style="color: maroon"&gt;td&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;
                    &lt;/span&gt;Dato
                &lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon"&gt;td&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;
                &amp;lt;&lt;/span&gt;&lt;span style="color: maroon"&gt;td&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;
                    &lt;/span&gt;Otro dato
                &lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon"&gt;td&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;
            &amp;lt;/&lt;/span&gt;&lt;span style="color: maroon"&gt;tr&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;
            &amp;lt;&lt;/span&gt;&lt;span style="color: maroon"&gt;tr&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;
                &amp;lt;&lt;/span&gt;&lt;span style="color: maroon"&gt;td&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;
                    &amp;lt;&lt;/span&gt;&lt;span style="color: maroon"&gt;a &lt;/span&gt;&lt;span style="color: red"&gt;href&lt;/span&gt;&lt;span style="color: blue"&gt;="page2.aspx?cliente=3"&amp;gt;&lt;/span&gt;Ver&lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon"&gt;a&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;
                &amp;lt;/&lt;/span&gt;&lt;span style="color: maroon"&gt;td&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;
                &amp;lt;&lt;/span&gt;&lt;span style="color: maroon"&gt;td&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;
                    &lt;/span&gt;Dato
                &lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon"&gt;td&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;
                &amp;lt;&lt;/span&gt;&lt;span style="color: maroon"&gt;td&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;
                    &lt;/span&gt;Otro dato
                &lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon"&gt;td&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;
            &amp;lt;/&lt;/span&gt;&lt;span style="color: maroon"&gt;tr&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;
        &amp;lt;/&lt;/span&gt;&lt;span style="color: maroon"&gt;table&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;
    &amp;lt;/&lt;/span&gt;&lt;span style="color: maroon"&gt;div&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;
    &amp;lt;/&lt;/span&gt;&lt;span style="color: maroon"&gt;form&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;
&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon"&gt;body&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;
&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon"&gt;html&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;
&lt;/span&gt;&lt;/pre&gt;
&lt;p&gt;Fijaros en comentario en color verde que pone «&lt;em&gt;&amp;lt;!--Aqui pondremos el script que veremos mas adelante—&amp;gt;&lt;/em&gt;», ya que mas adelante tendremos que sustituirlo por un script de jQuery. Inicialmente tenemos un enlace por cada fila que nos lleva a la página de detalle. Y no os extrañéis por el uso de &lt;em&gt;table&lt;/em&gt;, &lt;u&gt;la mejor forma de mostrar datos tabulares es el elemento &lt;em&gt;table&lt;/em&gt;&lt;/u&gt;.&lt;/p&gt;
&lt;p&gt;La segundo página, &lt;em&gt;page2.aspx&lt;/em&gt; que corresponde con nuestro detalle – que en el ejemplo muestra una página con el detalle del&amp;nbsp; cliente&amp;nbsp; y su logotipo. El código .aspx sería el siguiente:&lt;/p&gt;&lt;pre class="code"&gt;&lt;span style="background: yellow"&gt;&amp;lt;%&lt;/span&gt;&lt;span style="color: blue"&gt;@ &lt;/span&gt;&lt;span style="color: maroon"&gt;Page &lt;/span&gt;&lt;span style="color: red"&gt;Language&lt;/span&gt;&lt;span style="color: blue"&gt;="C#" &lt;/span&gt;&lt;span style="color: red"&gt;AutoEventWireup&lt;/span&gt;&lt;span style="color: blue"&gt;="true" &lt;/span&gt;&lt;span style="color: red"&gt;CodeFile&lt;/span&gt;&lt;span style="color: blue"&gt;="page2.aspx.cs" &lt;/span&gt;&lt;span style="color: red"&gt;Inherits&lt;/span&gt;&lt;span style="color: blue"&gt;="page2" &lt;/span&gt;&lt;span style="background: yellow"&gt;%&amp;gt;

&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;lt;!&lt;/span&gt;&lt;span style="color: maroon"&gt;DOCTYPE &lt;/span&gt;&lt;span style="color: red"&gt;html &lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;
&amp;lt;&lt;/span&gt;&lt;span style="color: maroon"&gt;html  &lt;/span&gt;&lt;span style="color: red"&gt;lang&lt;/span&gt;&lt;span style="color: blue"&gt;="es"&amp;gt;
&amp;lt;&lt;/span&gt;&lt;span style="color: maroon"&gt;head &lt;/span&gt;&lt;span style="color: red"&gt;runat&lt;/span&gt;&lt;span style="color: blue"&gt;="server"&amp;gt;
    &amp;lt;&lt;/span&gt;&lt;span style="color: maroon"&gt;title&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon"&gt;title&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;
    &amp;lt;&lt;/span&gt;&lt;span style="color: maroon"&gt;link &lt;/span&gt;&lt;span style="color: red"&gt;href&lt;/span&gt;&lt;span style="color: blue"&gt;="css/site.css" &lt;/span&gt;&lt;span style="color: red"&gt;rel&lt;/span&gt;&lt;span style="color: blue"&gt;="stylesheet" &lt;/span&gt;&lt;span style="color: red"&gt;type&lt;/span&gt;&lt;span style="color: blue"&gt;="text/css" /&amp;gt;
&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon"&gt;head&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;
&amp;lt;&lt;/span&gt;&lt;span style="color: maroon"&gt;body&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;
    &amp;lt;&lt;/span&gt;&lt;span style="color: maroon"&gt;form &lt;/span&gt;&lt;span style="color: red"&gt;id&lt;/span&gt;&lt;span style="color: blue"&gt;="form1" &lt;/span&gt;&lt;span style="color: red"&gt;runat&lt;/span&gt;&lt;span style="color: blue"&gt;="server"&amp;gt;
    &lt;/span&gt;&lt;strong&gt;Esto NO SE MUESTRA cuando se llama a la página por AJAX&lt;/strong&gt;
    &lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon"&gt;div &lt;/span&gt;&lt;span style="color: red"&gt;id&lt;/span&gt;&lt;span style="color: blue"&gt;="content"&amp;gt;        
        &amp;lt;&lt;/span&gt;&lt;span style="color: maroon"&gt;div  &lt;/span&gt;&lt;span style="color: red"&gt;class&lt;/span&gt;&lt;span style="color: blue"&gt;="logo"&amp;gt;
            &amp;lt;&lt;/span&gt;&lt;span style="color: maroon"&gt;asp&lt;/span&gt;&lt;span style="color: blue"&gt;:&lt;/span&gt;&lt;span style="color: maroon"&gt;Image &lt;/span&gt;&lt;span style="color: red"&gt;runat&lt;/span&gt;&lt;span style="color: blue"&gt;="server" &lt;/span&gt;&lt;span style="color: red"&gt;ID&lt;/span&gt;&lt;span style="color: blue"&gt;="imglogo" /&amp;gt;
        &amp;lt;/&lt;/span&gt;&lt;span style="color: maroon"&gt;div&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;
        &amp;lt;&lt;/span&gt;&lt;span style="color: maroon"&gt;div &lt;/span&gt;&lt;span style="color: red"&gt;class&lt;/span&gt;&lt;span style="color: blue"&gt;="logo-text" &amp;gt;
            &amp;lt;&lt;/span&gt;&lt;span style="color: maroon"&gt;h1&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;
                &lt;/span&gt;Este es el contenido que se va a mostrar!!!!&lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon"&gt;h1&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;
            &amp;lt;&lt;/span&gt;&lt;span style="color: maroon"&gt;asp&lt;/span&gt;&lt;span style="color: blue"&gt;:&lt;/span&gt;&lt;span style="color: maroon"&gt;Label &lt;/span&gt;&lt;span style="color: red"&gt;runat&lt;/span&gt;&lt;span style="color: blue"&gt;="server"&amp;gt;&lt;/span&gt;Detalle:&lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon"&gt;asp&lt;/span&gt;&lt;span style="color: blue"&gt;:&lt;/span&gt;&lt;span style="color: maroon"&gt;Label&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;
            &amp;lt;&lt;/span&gt;&lt;span style="color: maroon"&gt;asp&lt;/span&gt;&lt;span style="color: blue"&gt;:&lt;/span&gt;&lt;span style="color: maroon"&gt;Label &lt;/span&gt;&lt;span style="color: red"&gt;ID&lt;/span&gt;&lt;span style="color: blue"&gt;="lblDetalle" &lt;/span&gt;&lt;span style="color: red"&gt;runat&lt;/span&gt;&lt;span style="color: blue"&gt;="server"&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon"&gt;asp&lt;/span&gt;&lt;span style="color: blue"&gt;:&lt;/span&gt;&lt;span style="color: maroon"&gt;Label&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;
        &amp;lt;/&lt;/span&gt;&lt;span style="color: maroon"&gt;div&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;        
    &amp;lt;/&lt;/span&gt;&lt;span style="color: maroon"&gt;div&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;
    &amp;lt;/&lt;/span&gt;&lt;span style="color: maroon"&gt;form&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;
&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon"&gt;body&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;
&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon"&gt;html&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;
&lt;/span&gt;&lt;/pre&gt;
&lt;p&gt;Fijaros que hay una parte del código en la que ponemos «&lt;em&gt;Esto NO SE MUESTRA cuando se llama a la página por AJAX&lt;/em&gt;», este es un comportamiento intencionado que incluimos para que sea más sencillo reutilizar páginas existentes en nuestras aplicaciones (aunque debemos tener en cuenta que la página se ejecutará completamente y será jQuery quien recorte la parte le indiquemos con el selector).&lt;/p&gt;
&lt;p&gt;Y su código correspondiente. Lo único destacable es que hemos encapsulado la variable “&lt;em&gt;cliente&lt;/em&gt;” en una propiedad para trabajar más fácilmente:&lt;/p&gt;&lt;pre class="code"&gt;&lt;span style="color: blue"&gt;using &lt;/span&gt;System;
&lt;span style="color: blue"&gt;using &lt;/span&gt;System.Collections.Generic;
&lt;span style="color: blue"&gt;using &lt;/span&gt;System.Linq;
&lt;span style="color: blue"&gt;using &lt;/span&gt;System.Web;
&lt;span style="color: blue"&gt;using &lt;/span&gt;System.Web.UI;
&lt;span style="color: blue"&gt;using &lt;/span&gt;System.Web.UI.WebControls;

&lt;span style="color: blue"&gt;public partial class &lt;/span&gt;&lt;span style="color: #2b91af"&gt;page2 &lt;/span&gt;: System.Web.UI.&lt;span style="color: #2b91af"&gt;Page
&lt;/span&gt;{
    &lt;span style="color: blue"&gt;int &lt;/span&gt;Cliente
    {
        &lt;span style="color: blue"&gt;get &lt;/span&gt;{ 
            &lt;span style="color: blue"&gt;int &lt;/span&gt;cliente =  0 ;
            &lt;span style="color: #2b91af"&gt;Int32&lt;/span&gt;.TryParse(Request[&lt;span style="color: #a31515"&gt;"cliente"&lt;/span&gt;], &lt;span style="color: blue"&gt;out &lt;/span&gt;cliente);
            &lt;span style="color: blue"&gt;return &lt;/span&gt;cliente;
        }
    
    }
    &lt;span style="color: blue"&gt;string &lt;/span&gt;GetDetalle() {
        &lt;span style="color: blue"&gt;return &lt;/span&gt;&lt;span style="color: #2b91af"&gt;String&lt;/span&gt;.Format(
            &lt;span style="color: #a31515"&gt;"Este es el detalle del cliente {0} ..., aqui podemos hacer de todo un poco."&lt;/span&gt;, 
            Cliente);
    }
    &lt;span style="color: blue"&gt;protected void &lt;/span&gt;Page_Load(&lt;span style="color: blue"&gt;object &lt;/span&gt;sender, &lt;span style="color: #2b91af"&gt;EventArgs &lt;/span&gt;e)
    {
        lblDetalle.Text  = GetDetalle();
        imglogo.ImageUrl = &lt;span style="color: #2b91af"&gt;VirtualPathUtility&lt;/span&gt;.ToAbsolute(
                &lt;span style="color: #2b91af"&gt;String&lt;/span&gt;.Format(&lt;span style="color: #a31515"&gt;"~/img/logo{0}.jpg"&lt;/span&gt;, Cliente));
    }
}
&lt;/pre&gt;
&lt;p&gt;Está sería la ejecución de cada una de las páginas de forma independiente …&lt;/p&gt;
&lt;p&gt;&lt;a href="http://devjoker.com/images/UploadFiles/Windows-Live-Writer/Detalle-de-un-listado-con-jQuery_C08E/image_10.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto; padding-top: 0px" title="image" border="0" alt="image" src="http://devjoker.com/images/UploadFiles/Windows-Live-Writer/Detalle-de-un-listado-con-jQuery_C08E/image_thumb_4.png" width="355" height="89"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://devjoker.com/images/UploadFiles/Windows-Live-Writer/Detalle-de-un-listado-con-jQuery_C08E/image_2.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto; padding-top: 0px" title="image" border="0" alt="image" src="http://devjoker.com/images/UploadFiles/Windows-Live-Writer/Detalle-de-un-listado-con-jQuery_C08E/image_thumb.png" width="356" height="127"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;La aplicación funciona perfectamente, pero sería mucho mas usable si pudiéramos tener toda la información visible en una única página. Siempre podríamos recurrir a un popup, pero estaríamos actuando de forma intrusiva a al usuario.&amp;nbsp; &lt;/p&gt;
&lt;p&gt;Lo primero que hacemos es modificar los elemento link por botones – esto no es obligatorio, pero personalmente prefiero un botón, ya que con un link el usuario puede esperar que se navegue hacia otra página (si quisiéramos compatibilidad con navegadores que no utilicen javascript deberíamos mantener el enlace):&lt;/p&gt;&lt;pre class="code"&gt;&lt;span style="background: yellow"&gt;&amp;lt;%&lt;/span&gt;&lt;span style="color: #006400"&gt;--&amp;lt;a href="page2.aspx?cliente=1"  &amp;gt;Ver&amp;lt;/a&amp;gt;--&lt;/span&gt;&lt;span style="background: yellow"&gt;%&amp;gt;
&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon"&gt;input &lt;/span&gt;&lt;span style="color: red"&gt;type&lt;/span&gt;&lt;span style="color: blue"&gt;="button" 
&lt;/span&gt;&lt;span style="color: red"&gt;value&lt;/span&gt;&lt;span style="color: blue"&gt;="[+]" &lt;/span&gt;&lt;span style="color: red"&gt;class&lt;/span&gt;&lt;span style="color: blue"&gt;="addRowButton" &lt;/span&gt;&lt;span style="color: red"&gt;rel&lt;/span&gt;&lt;span style="color: blue"&gt;="1" /&amp;gt;
&lt;/span&gt;&lt;/pre&gt;
&lt;p&gt;Observemos que el botón no tiene asociada ninguna acción para el evento onclick ni ningún otro.&lt;/p&gt;
&lt;p&gt;Ahora vamos a incluir un poco de código javascript con jQuery el la primera página, &lt;em&gt;Default.aspx &lt;/em&gt;(hay que incluirlo en el comentario de color verde que hemos incluido en el código&amp;nbsp; de &lt;em&gt;Default.aspx&lt;/em&gt;):&lt;/p&gt;&lt;pre class="code"&gt;&lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon"&gt;script &lt;/span&gt;&lt;span style="color: red"&gt;type&lt;/span&gt;&lt;span style="color: blue"&gt;="text/javascript"&amp;gt;
    &lt;/span&gt;$(document).ready(&lt;span style="color: blue"&gt;function &lt;/span&gt;() {
        $(&lt;span style="color: maroon"&gt;".addRowButton"&lt;/span&gt;).one(&lt;span style="color: maroon"&gt;"click"&lt;/span&gt;, addChildrenRow);           
    });

    &lt;span style="color: blue"&gt;function &lt;/span&gt;showdiv(div, row) {            
        $(row).show();
        $(div).fadeIn(&lt;span style="color: maroon"&gt;"slow"&lt;/span&gt;);
    }
    &lt;span style="color: blue"&gt;function &lt;/span&gt;hidediv(div, row) {            
        $(div).fadeOut(&lt;span style="color: maroon"&gt;"slow"&lt;/span&gt;, &lt;span style="color: blue"&gt;function &lt;/span&gt;() {
            $(row).hide(); 
        });            
    }

    &lt;span style="color: blue"&gt;function &lt;/span&gt;addChildrenRow(source) {
        &lt;span style="color: blue"&gt;var &lt;/span&gt;button = $(source.currentTarget);
        &lt;span style="color: blue"&gt;var &lt;/span&gt;tr = button.parents(&lt;span style="color: maroon"&gt;"tr"&lt;/span&gt;).first();
        tr.addClass(&lt;span style="color: maroon"&gt;"red"&lt;/span&gt;);
        &lt;span style="color: blue"&gt;var &lt;/span&gt;trTemplate =
            $(&lt;span style="color: maroon"&gt;"&amp;lt;tr&amp;gt;&amp;lt;td colspan=\"3\"&amp;gt;&amp;lt;div class=\"content\"&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;"&lt;/span&gt;);
        tr.after(trTemplate);          
        &lt;span style="color: blue"&gt;var &lt;/span&gt;divElement = trTemplate.find(&lt;span style="color: maroon"&gt;"div.content"&lt;/span&gt;);

        button.toggle(&lt;span style="color: blue"&gt;function &lt;/span&gt;() { tr.removeClass(&lt;span style="color: maroon"&gt;"red"&lt;/span&gt;); hidediv(divElement, trTemplate); },
                      &lt;span style="color: blue"&gt;function &lt;/span&gt;() { tr.addClass(&lt;span style="color: maroon"&gt;"red"&lt;/span&gt;); showdiv(divElement, trTemplate); });

        &lt;span style="color: blue"&gt;var &lt;/span&gt;cliente = button.attr(&lt;span style="color: maroon"&gt;"rel"&lt;/span&gt;);
        divElement.load(&lt;span style="color: maroon"&gt;"page2.aspx?cliente=" &lt;/span&gt;+ cliente +&lt;span style="color: maroon"&gt;" #content"&lt;/span&gt;, &lt;span style="color: blue"&gt;function &lt;/span&gt;() {
            divElement.fadeIn(&lt;span style="color: maroon"&gt;"slow"&lt;/span&gt;); 
        });
    }
&lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon"&gt;script&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;
&lt;/span&gt;&lt;/pre&gt;
&lt;p&gt;Este script realiza las siguientes tareas:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;En el script de inicio &lt;em&gt;$(document),ready(…)&lt;/em&gt; se vincular el click del botón de cada fila a&amp;nbsp; la función &lt;em&gt;addChildrenRow&lt;/em&gt;&amp;nbsp; (selector &lt;em&gt;.addRowButton&lt;/em&gt;)&lt;em&gt;. &lt;/em&gt;Es importante destacar que este enlace se realiza a través del método &lt;em&gt;one&lt;/em&gt;, que vincula únicamente la primera pulsación del boton. 
&lt;li&gt;La funcion &lt;em&gt;addChildrenRow&lt;/em&gt; es la que realmente realiza el trabajo sucio, por un lado detecta el elemento que produce el evento, y localiza el &lt;em&gt;tr&lt;/em&gt; inmediatamente superior, para insertar una nueva fila – con un elemento div- a continuación.&amp;nbsp; A continuación,&amp;nbsp; con el método toggle asigna dos funciones para mostrar y ocultar el div anterior, y por ultimo carga el contenido de la pagina en el div. Añade un poco de color y efectos con las funciones &lt;em&gt;addClass &lt;/em&gt;y &lt;em&gt;fadeIn&lt;/em&gt;, &lt;em&gt;fadeOut&lt;/em&gt;&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;Si ejecutamos la página … el resultado de la ejecución es el siguiente:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://devjoker.com/images/UploadFiles/Windows-Live-Writer/Detalle-de-un-listado-con-jQuery_C08E/image_12.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto; padding-top: 0px" title="image" border="0" alt="image" src="http://devjoker.com/images/UploadFiles/Windows-Live-Writer/Detalle-de-un-listado-con-jQuery_C08E/image_thumb_5.png" width="352" height="94"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://devjoker.com/images/UploadFiles/Windows-Live-Writer/Detalle-de-un-listado-con-jQuery_C08E/image_14.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto; padding-top: 0px" title="image" border="0" alt="image" src="http://devjoker.com/images/UploadFiles/Windows-Live-Writer/Detalle-de-un-listado-con-jQuery_C08E/image_thumb_6.png" width="348" height="144"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://devjoker.com/images/UploadFiles/Windows-Live-Writer/Detalle-de-un-listado-con-jQuery_C08E/image_6.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto; padding-top: 0px" title="image" border="0" alt="image" src="http://devjoker.com/images/UploadFiles/Windows-Live-Writer/Detalle-de-un-listado-con-jQuery_C08E/image_thumb_2.png" width="350" height="268"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Como podemos ver ahora la página despliega y oculta la información de detalle bajo demanda del usuario. Mucho mejor! Además garantiza que solo trae la información una única vez.&lt;/p&gt;
&lt;p&gt;El código completo de la página &lt;em&gt;Default.aspx&lt;/em&gt; quedaría de la siguiente manera:&lt;/p&gt;&lt;pre class="code"&gt;&lt;span style="background: yellow"&gt;&amp;lt;%&lt;/span&gt;&lt;span style="color: blue"&gt;@ &lt;/span&gt;&lt;span style="color: maroon"&gt;Page &lt;/span&gt;&lt;span style="color: red"&gt;Language&lt;/span&gt;&lt;span style="color: blue"&gt;="C#" &lt;/span&gt;&lt;span style="color: red"&gt;AutoEventWireup&lt;/span&gt;&lt;span style="color: blue"&gt;="true" &lt;/span&gt;&lt;span style="color: red"&gt;CodeFile&lt;/span&gt;&lt;span style="color: blue"&gt;="Default.aspx.cs" &lt;/span&gt;&lt;span style="color: red"&gt;Inherits&lt;/span&gt;&lt;span style="color: blue"&gt;="_Default" &lt;/span&gt;&lt;span style="background: yellow"&gt;%&amp;gt;

&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;lt;!&lt;/span&gt;&lt;span style="color: maroon"&gt;DOCTYPE &lt;/span&gt;&lt;span style="color: red"&gt;html &lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;
&amp;lt;&lt;/span&gt;&lt;span style="color: maroon"&gt;html &lt;/span&gt;&lt;span style="color: red"&gt;lang&lt;/span&gt;&lt;span style="color: blue"&gt;="es"&amp;gt;
&amp;lt;&lt;/span&gt;&lt;span style="color: maroon"&gt;head &lt;/span&gt;&lt;span style="color: red"&gt;runat&lt;/span&gt;&lt;span style="color: blue"&gt;="server"&amp;gt;
    &amp;lt;&lt;/span&gt;&lt;span style="color: maroon"&gt;title&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon"&gt;title&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;
    &amp;lt;&lt;/span&gt;&lt;span style="color: maroon"&gt;script &lt;/span&gt;&lt;span style="color: red"&gt;src&lt;/span&gt;&lt;span style="color: blue"&gt;="Scripts/jquery-1.7.1.min.js" &lt;/span&gt;&lt;span style="color: red"&gt;type&lt;/span&gt;&lt;span style="color: blue"&gt;="text/javascript"&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon"&gt;script&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;
    &amp;lt;&lt;/span&gt;&lt;span style="color: maroon"&gt;link &lt;/span&gt;&lt;span style="color: red"&gt;rel&lt;/span&gt;&lt;span style="color: blue"&gt;="stylesheet" &lt;/span&gt;&lt;span style="color: red"&gt;type&lt;/span&gt;&lt;span style="color: blue"&gt;="text/css" &lt;/span&gt;&lt;span style="color: red"&gt;href&lt;/span&gt;&lt;span style="color: blue"&gt;="css/site.css" /&amp;gt;
    &amp;lt;&lt;/span&gt;&lt;span style="color: maroon"&gt;script &lt;/span&gt;&lt;span style="color: red"&gt;type&lt;/span&gt;&lt;span style="color: blue"&gt;="text/javascript"&amp;gt;
        &lt;/span&gt;$(document).ready(&lt;span style="color: blue"&gt;function &lt;/span&gt;() {
            $(&lt;span style="color: maroon"&gt;".addRowButton"&lt;/span&gt;).one(&lt;span style="color: maroon"&gt;"click"&lt;/span&gt;, addChildrenRow);           
        });

        &lt;span style="color: blue"&gt;function &lt;/span&gt;showdiv(div, row) {            
            $(row).show();
            $(div).fadeIn(&lt;span style="color: maroon"&gt;"slow"&lt;/span&gt;);
        }
        &lt;span style="color: blue"&gt;function &lt;/span&gt;hidediv(div, row) {            
            $(div).fadeOut(&lt;span style="color: maroon"&gt;"slow"&lt;/span&gt;, &lt;span style="color: blue"&gt;function &lt;/span&gt;() {
                $(row).hide(); 
            });            
        }

        &lt;span style="color: blue"&gt;function &lt;/span&gt;addChildrenRow(source) {
            &lt;span style="color: blue"&gt;var &lt;/span&gt;button = $(source.currentTarget);
            &lt;span style="color: blue"&gt;var &lt;/span&gt;tr = button.parents(&lt;span style="color: maroon"&gt;"tr"&lt;/span&gt;).first();
            tr.addClass(&lt;span style="color: maroon"&gt;"red"&lt;/span&gt;);
            &lt;span style="color: blue"&gt;var &lt;/span&gt;trTemplate =
                $(&lt;span style="color: maroon"&gt;"&amp;lt;tr&amp;gt;&amp;lt;td colspan=\"3\"&amp;gt;&amp;lt;div class=\"content\"&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;"&lt;/span&gt;);
            tr.after(trTemplate);          
            &lt;span style="color: blue"&gt;var &lt;/span&gt;divElement = trTemplate.find(&lt;span style="color: maroon"&gt;"div.content"&lt;/span&gt;);

            button.toggle(&lt;span style="color: blue"&gt;function &lt;/span&gt;() { tr.removeClass(&lt;span style="color: maroon"&gt;"red"&lt;/span&gt;); hidediv(divElement, trTemplate); },
                          &lt;span style="color: blue"&gt;function &lt;/span&gt;() { tr.addClass(&lt;span style="color: maroon"&gt;"red"&lt;/span&gt;); showdiv(divElement, trTemplate); });

            &lt;span style="color: blue"&gt;var &lt;/span&gt;cliente = button.attr(&lt;span style="color: maroon"&gt;"rel"&lt;/span&gt;);
            divElement.load(&lt;span style="color: maroon"&gt;"page2.aspx?cliente=" &lt;/span&gt;+ cliente +&lt;span style="color: maroon"&gt;" #content"&lt;/span&gt;, &lt;span style="color: blue"&gt;function &lt;/span&gt;() {
                divElement.fadeIn(&lt;span style="color: maroon"&gt;"slow"&lt;/span&gt;); 
            });
        }
    &lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon"&gt;script&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;
&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon"&gt;head&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;
&amp;lt;&lt;/span&gt;&lt;span style="color: maroon"&gt;body&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;
    &amp;lt;&lt;/span&gt;&lt;span style="color: maroon"&gt;form &lt;/span&gt;&lt;span style="color: red"&gt;id&lt;/span&gt;&lt;span style="color: blue"&gt;="form1" &lt;/span&gt;&lt;span style="color: red"&gt;runat&lt;/span&gt;&lt;span style="color: blue"&gt;="server"&amp;gt;
    &amp;lt;&lt;/span&gt;&lt;span style="color: maroon"&gt;div&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;
        &amp;lt;&lt;/span&gt;&lt;span style="color: maroon"&gt;table &lt;/span&gt;&lt;span style="color: red"&gt;class&lt;/span&gt;&lt;span style="color: blue"&gt;="table-content"&amp;gt;
            &amp;lt;&lt;/span&gt;&lt;span style="color: maroon"&gt;tr&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;
                &amp;lt;&lt;/span&gt;&lt;span style="color: maroon"&gt;td&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;                    
                    &amp;lt;&lt;/span&gt;&lt;span style="color: maroon"&gt;input &lt;/span&gt;&lt;span style="color: red"&gt;type&lt;/span&gt;&lt;span style="color: blue"&gt;="button" 
                    &lt;/span&gt;&lt;span style="color: red"&gt;value&lt;/span&gt;&lt;span style="color: blue"&gt;="[+]" &lt;/span&gt;&lt;span style="color: red"&gt;class&lt;/span&gt;&lt;span style="color: blue"&gt;="addRowButton" &lt;/span&gt;&lt;span style="color: red"&gt;rel&lt;/span&gt;&lt;span style="color: blue"&gt;="1" /&amp;gt;
                &amp;lt;/&lt;/span&gt;&lt;span style="color: maroon"&gt;td&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;
                &amp;lt;&lt;/span&gt;&lt;span style="color: maroon"&gt;td&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;
                    &lt;/span&gt;Dato
                &lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon"&gt;td&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;
                &amp;lt;&lt;/span&gt;&lt;span style="color: maroon"&gt;td&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;
                    &lt;/span&gt;Otro dato
                &lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon"&gt;td&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;
            &amp;lt;/&lt;/span&gt;&lt;span style="color: maroon"&gt;tr&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;
            &amp;lt;&lt;/span&gt;&lt;span style="color: maroon"&gt;tr&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;
                &amp;lt;&lt;/span&gt;&lt;span style="color: maroon"&gt;td&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;                   
                    &amp;lt;&lt;/span&gt;&lt;span style="color: maroon"&gt;input &lt;/span&gt;&lt;span style="color: red"&gt;type&lt;/span&gt;&lt;span style="color: blue"&gt;="button" 
                    &lt;/span&gt;&lt;span style="color: red"&gt;value&lt;/span&gt;&lt;span style="color: blue"&gt;="[+]" &lt;/span&gt;&lt;span style="color: red"&gt;class&lt;/span&gt;&lt;span style="color: blue"&gt;="addRowButton" &lt;/span&gt;&lt;span style="color: red"&gt;rel&lt;/span&gt;&lt;span style="color: blue"&gt;="2" /&amp;gt;
                &amp;lt;/&lt;/span&gt;&lt;span style="color: maroon"&gt;td&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;
                &amp;lt;&lt;/span&gt;&lt;span style="color: maroon"&gt;td&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;
                    &lt;/span&gt;Dato
                &lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon"&gt;td&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;
                &amp;lt;&lt;/span&gt;&lt;span style="color: maroon"&gt;td&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;
                    &lt;/span&gt;Otro dato
                &lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon"&gt;td&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;
            &amp;lt;/&lt;/span&gt;&lt;span style="color: maroon"&gt;tr&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;
            &amp;lt;&lt;/span&gt;&lt;span style="color: maroon"&gt;tr&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;
                &amp;lt;&lt;/span&gt;&lt;span style="color: maroon"&gt;td&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;                    
                    &amp;lt;&lt;/span&gt;&lt;span style="color: maroon"&gt;input &lt;/span&gt;&lt;span style="color: red"&gt;type&lt;/span&gt;&lt;span style="color: blue"&gt;="button" 
                    &lt;/span&gt;&lt;span style="color: red"&gt;value&lt;/span&gt;&lt;span style="color: blue"&gt;="[+]" &lt;/span&gt;&lt;span style="color: red"&gt;class&lt;/span&gt;&lt;span style="color: blue"&gt;="addRowButton" &lt;/span&gt;&lt;span style="color: red"&gt;rel&lt;/span&gt;&lt;span style="color: blue"&gt;="3" /&amp;gt;
                &amp;lt;/&lt;/span&gt;&lt;span style="color: maroon"&gt;td&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;
                &amp;lt;&lt;/span&gt;&lt;span style="color: maroon"&gt;td&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;
                    &lt;/span&gt;Dato
                &lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon"&gt;td&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;
                &amp;lt;&lt;/span&gt;&lt;span style="color: maroon"&gt;td&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;
                    &lt;/span&gt;Otro dato
                &lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon"&gt;td&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;
            &amp;lt;/&lt;/span&gt;&lt;span style="color: maroon"&gt;tr&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;
        &amp;lt;/&lt;/span&gt;&lt;span style="color: maroon"&gt;table&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;
    &amp;lt;/&lt;/span&gt;&lt;span style="color: maroon"&gt;div&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;
    &amp;lt;/&lt;/span&gt;&lt;span style="color: maroon"&gt;form&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;
&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon"&gt;body&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;
&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon"&gt;html&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;

&lt;/span&gt;&lt;/pre&gt;
&lt;p&gt;Nota. Las marcas de coche cuyos logotipos se muestran en este articulo no me han regalado nada &lt;img style="border-bottom-style: none; border-left-style: none; border-top-style: none; border-right-style: none" class="wlEmoticon wlEmoticon-sadsmile" alt="Triste" src="http://devjoker.com/images/UploadFiles/Windows-Live-Writer/Detalle-de-un-listado-con-jQuery_C08E/wlEmoticon-sadsmile_2.png"&gt;.&lt;/p&gt;
&lt;p&gt;Podemos descargar el &lt;a href="https://skydrive.live.com/redir.aspx?cid=20a9c248301397b3&amp;amp;resid=20A9C248301397B3!141&amp;amp;parid=20A9C248301397B3!142"&gt;código fuente desde este enlace&lt;/a&gt;.(Archivo website16.zip)&lt;/p&gt;
&lt;p&gt;Saludos, &lt;/p&gt;
&lt;p&gt;DJK!&lt;/p&gt;</description>
      <guid>/contenidos/articulos/506/Como-mejorar-la-usabilidad-de-un-listado-maestro-detalle-con-jQuery-y-Ajax.aspx</guid>
      <pubDate>Thu, 26 Jan 2012 21:36:45 GMT</pubDate>
    </item>
    <item>
      <title>JSON.NET. Mejorando la serializaci&amp;oacute;n JSON con .NET</title>
      <link>/contenidos/articulos/505/JSONNET-Mejorando-la-serializacioacuten-JSON-con-NET.aspx</link>
      <description>&lt;p&gt;Hace algún tiempo que os hablamos en &lt;a href="http://devjoker.com/"&gt;devjoker.com&lt;/a&gt; de como utilizar &lt;a href="http://es.wikipedia.org/wiki/JSON"&gt;JSON&lt;/a&gt; en aplicaciones ASP.NET -&lt;a title="http://www.devjoker.com/contenidos/catss/459/Serializacioacuten-JSON-con-NET.aspx" href="http://www.devjoker.com/contenidos/catss/459/Serializacioacuten-JSON-con-NET.aspx"&gt;http://www.devjoker.com/contenidos/catss/459/Serializacioacuten-JSON-con-NET.aspx&lt;/a&gt;. Es este articulo serializábamos un objeto utilizando la clase &lt;em&gt;JavaScriptSerializer &lt;/em&gt;incluido con .NET Framework en el assembly &lt;em&gt;System.Web.Script.Serialization&lt;/em&gt;.&lt;/p&gt; &lt;p&gt;En esta ocasión vamos a realizar el mismo ejercicio de serialización pero a través de la librería &lt;a href="http://json.codeplex.com/"&gt;JSON.NET&lt;/a&gt;. La utilización de esta librería nos va a aportar las siguientes ventajas:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;Una forma de trabajar sencilla y unificada para todas nuestras clases. No tendremos que escribir un nuevo método &lt;em&gt;ToJson() &lt;/em&gt;en cada clase, como ocurría en el ejemplo anterior.&lt;/li&gt; &lt;li&gt;JSON.NET nos permite serializar de .NET a JSON, pero también de forma inversa de JSON a .NET.&lt;/li&gt; &lt;li&gt;Un nuevo sabor de LINQ: &lt;a href="http://james.newtonking.com/projects/json/help/LINQtoJSON.html"&gt;LINQ To JSON&lt;/a&gt;.&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;Pero vamos a realizar una pequeña aplicación de ejemplo para ver lo fácil que resulta trabajar con JSON.NET. Lo primero creamos un sitio web vacío:&lt;/p&gt; &lt;p&gt;&lt;a href="http://devjoker.com/images/UploadFiles/Windows-Live-Writer/JSON.NET_C264/image_2.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://devjoker.com/images/UploadFiles/Windows-Live-Writer/JSON.NET_C264/image_thumb.png" width="244" height="202"&gt;&lt;/a&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;Utilizando &lt;a href="http://nuget.org"&gt;NuGet&lt;/a&gt; añadimos al proyecto las referencia a JSON.NET y también a jQuery -para simplificar el trabajo con Ajax. &lt;/p&gt; &lt;p&gt;El proyecto constará de los siguientes elementos:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;Un HttpHandler,&lt;em&gt; DataHanlder.ashx&lt;/em&gt; – que nos va a permitir gestionar las llamadas para obtener un resultado serializado en JSON.&lt;/li&gt; &lt;li&gt;Un Web Form, &lt;em&gt;Default.aspx&lt;/em&gt;, que nos servirá como página de inicio y desde donde realizaremos las llamadas al handler anterior.&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;La siguiente imagen muestra el aspecto que debería tener&amp;nbsp; el explorador de soluciones (el resto de los elementos se crean al añadir las referencias con NuGet).&lt;/p&gt; &lt;p&gt;&lt;a href="http://devjoker.com/images/UploadFiles/Windows-Live-Writer/JSON.NET_C264/image_4.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://devjoker.com/images/UploadFiles/Windows-Live-Writer/JSON.NET_C264/image_thumb_1.png" width="229" height="244"&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;Ahora escribimos el código del handler:&lt;/p&gt;&lt;pre class="code"&gt;&lt;span style="background: yellow"&gt;&amp;lt;%&lt;/span&gt;&lt;span style="color: blue"&gt;@ &lt;/span&gt;&lt;span style="color: maroon"&gt;WebHandler &lt;/span&gt;&lt;span style="color: red"&gt;Language&lt;/span&gt;&lt;span style="color: blue"&gt;="C#" &lt;/span&gt;&lt;span style="color: red"&gt;Class&lt;/span&gt;&lt;span style="color: blue"&gt;="DataHanlder" &lt;/span&gt;&lt;span style="background: yellow"&gt;%&amp;gt;
&lt;/span&gt;&lt;span style="color: blue"&gt;using &lt;/span&gt;System;
&lt;span style="color: blue"&gt;using &lt;/span&gt;System.Web;

&lt;span style="color: blue"&gt;public class &lt;/span&gt;&lt;span style="color: #2b91af"&gt;DataHanlder &lt;/span&gt;: &lt;span style="color: #2b91af"&gt;IHttpHandler &lt;/span&gt;{

    &lt;span style="color: blue"&gt;class &lt;/span&gt;&lt;span style="color: #2b91af"&gt;Persona &lt;/span&gt;{
        &lt;span style="color: blue"&gt;public &lt;/span&gt;&lt;span style="color: #2b91af"&gt;Guid &lt;/span&gt;Id { &lt;span style="color: blue"&gt;get&lt;/span&gt;; &lt;span style="color: blue"&gt;set&lt;/span&gt;; }
        &lt;span style="color: blue"&gt;public string &lt;/span&gt;Nombre { &lt;span style="color: blue"&gt;get&lt;/span&gt;; &lt;span style="color: blue"&gt;set&lt;/span&gt;; }
        &lt;span style="color: blue"&gt;public string &lt;/span&gt;Apellidos { &lt;span style="color: blue"&gt;get&lt;/span&gt;; &lt;span style="color: blue"&gt;set&lt;/span&gt;; }
        &lt;span style="color: blue"&gt;public string &lt;/span&gt;FechaNacimiento { &lt;span style="color: blue"&gt;get&lt;/span&gt;; &lt;span style="color: blue"&gt;set&lt;/span&gt;; }
    }
    
    &lt;span style="color: blue"&gt;public void &lt;/span&gt;ProcessRequest (&lt;span style="color: #2b91af"&gt;HttpContext &lt;/span&gt;context) {
        context.Response.ContentType = &lt;span style="color: #a31515"&gt;"application/json"&lt;/span&gt;;
        &lt;span style="color: blue"&gt;var &lt;/span&gt;devjoker = &lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;Persona&lt;/span&gt;() { 
            Id = &lt;span style="color: #2b91af"&gt;Guid&lt;/span&gt;.NewGuid(),
            Nombre = &lt;span style="color: #a31515"&gt;"Pedro"&lt;/span&gt;, 
            Apellidos = &lt;span style="color: #a31515"&gt;"Herrarte"&lt;/span&gt;,
            FechaNacimiento = &lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;DateTime &lt;/span&gt;(1975,01,13).ToString(&lt;span style="color: #a31515"&gt;"d"&lt;/span&gt;) 
        };
        &lt;span style="color: blue"&gt;var &lt;/span&gt;json = Newtonsoft.Json.&lt;span style="color: #2b91af"&gt;JsonConvert&lt;/span&gt;.SerializeObject(devjoker);
        context.Response.Write( json );
    }
 
    &lt;span style="color: blue"&gt;public bool &lt;/span&gt;IsReusable {
        &lt;span style="color: blue"&gt;get &lt;/span&gt;{
            &lt;span style="color: blue"&gt;return false&lt;/span&gt;;
        }
    }
}
&lt;/pre&gt;
&lt;p&gt;Para simplificar, hemos incrustado la clase &lt;em&gt;Persona &lt;/em&gt;dentro del propio handler. Las peticiones se procesan en el método &lt;em&gt;ProcessRequest&lt;/em&gt;, que el framework invoca automáticamente al recibirse una petición al handler. En este método creamos un objeto Persona y lo serializamos a JSON con la clase &lt;em&gt;JsonConverter&lt;/em&gt;, y devolvemos la respuesta por http normalmente. Así de fácil.&lt;/p&gt;
&lt;p&gt;Si quisiéramos obtener el objeto .NET a partir del JSON seria tan sencillo como hacer lo siguiente:&lt;/p&gt;&lt;pre class="code"&gt;&lt;span style="color: blue"&gt;var &lt;/span&gt;inputJson = &lt;span style="color: #a31515"&gt;@"{
    ""Id"":""bb816aa1-feab-4e35-b9be-80f1273d4913"",
    ""Nombre"":""Pedro"",
    ""Apellidos"":""Herrarte"",
    ""FechaNacimiento"":""20/01/1975""}"&lt;/span&gt;;
&lt;span style="color: #2b91af"&gt;Persona &lt;/span&gt;deserializedPersona = Newtonsoft.Json.&lt;span style="color: #2b91af"&gt;JsonConvert&lt;/span&gt;.DeserializeObject&amp;lt;&lt;span style="color: #2b91af"&gt;Persona&lt;/span&gt;&amp;gt;(inputJson);
&lt;/pre&gt;
&lt;p&gt;&lt;a href="http://devjoker.com/images/UploadFiles/Windows-Live-Writer/JSON.NET_C264/image_8.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://devjoker.com/images/UploadFiles/Windows-Live-Writer/JSON.NET_C264/image_thumb_3.png" width="451" height="93"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Ahora vamos a la página .aspx:&lt;/p&gt;&lt;pre class="code"&gt;&lt;span style="background: yellow"&gt;&amp;lt;%&lt;/span&gt;&lt;span style="color: blue"&gt;@ &lt;/span&gt;&lt;span style="color: maroon"&gt;Page &lt;/span&gt;&lt;span style="color: red"&gt;Language&lt;/span&gt;&lt;span style="color: blue"&gt;="C#" &lt;/span&gt;&lt;span style="color: red"&gt;AutoEventWireup&lt;/span&gt;&lt;span style="color: blue"&gt;="true" &lt;/span&gt;&lt;span style="color: red"&gt;CodeFile&lt;/span&gt;&lt;span style="color: blue"&gt;="Default.aspx.cs" &lt;/span&gt;&lt;span style="color: red"&gt;Inherits&lt;/span&gt;&lt;span style="color: blue"&gt;="_Default" &lt;/span&gt;&lt;span style="background: yellow"&gt;%&amp;gt;

&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;lt;!&lt;/span&gt;&lt;span style="color: maroon"&gt;DOCTYPE &lt;/span&gt;&lt;span style="color: red"&gt;html &lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;

&amp;lt;&lt;/span&gt;&lt;span style="color: maroon"&gt;html &lt;/span&gt;&lt;span style="color: red"&gt;xmlns&lt;/span&gt;&lt;span style="color: blue"&gt;="http://www.w3.org/1999/xhtml"&amp;gt;
&amp;lt;&lt;/span&gt;&lt;span style="color: maroon"&gt;head &lt;/span&gt;&lt;span style="color: red"&gt;runat&lt;/span&gt;&lt;span style="color: blue"&gt;="server"&amp;gt;
    &amp;lt;&lt;/span&gt;&lt;span style="color: maroon"&gt;title&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon"&gt;title&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;
    &amp;lt;&lt;/span&gt;&lt;span style="color: maroon"&gt;script &lt;/span&gt;&lt;span style="color: red"&gt;src&lt;/span&gt;&lt;span style="color: blue"&gt;="Scripts/jquery-1.7.1.min.js" &lt;/span&gt;&lt;span style="color: red"&gt;type&lt;/span&gt;&lt;span style="color: blue"&gt;="text/javascript"&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon"&gt;script&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;
    &amp;lt;&lt;/span&gt;&lt;span style="color: maroon"&gt;script&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;
        &lt;/span&gt;$(document).ready(&lt;span style="color: blue"&gt;function &lt;/span&gt;() {
            $(&lt;span style="color: maroon"&gt;"#btnConsulta"&lt;/span&gt;).click(buscar);
        });

        &lt;span style="color: blue"&gt;function &lt;/span&gt;buscar() {
            &lt;span style="color: blue"&gt;var &lt;/span&gt;postData= &lt;span style="color: blue"&gt;null&lt;/span&gt;;
            $.post(&lt;span style="color: maroon"&gt;'Handlers/DataHanlder.ashx'&lt;/span&gt;, postData, &lt;span style="color: blue"&gt;function &lt;/span&gt;(result) {
                $(&lt;span style="color: maroon"&gt;"#txtId"&lt;/span&gt;).val(result.Id);
                $(&lt;span style="color: maroon"&gt;"#txtNombre"&lt;/span&gt;).val(result.Nombre);
                $(&lt;span style="color: maroon"&gt;"#txtApellidos"&lt;/span&gt;).val(result.Apellidos);
                $(&lt;span style="color: maroon"&gt;"#txtFechaNacimiento"&lt;/span&gt;).val(result.FechaNacimiento);
            });
        }
    &lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon"&gt;script&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;
&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon"&gt;head&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;
&amp;lt;&lt;/span&gt;&lt;span style="color: maroon"&gt;body&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;
    &amp;lt;&lt;/span&gt;&lt;span style="color: maroon"&gt;form &lt;/span&gt;&lt;span style="color: red"&gt;id&lt;/span&gt;&lt;span style="color: blue"&gt;="form1" &lt;/span&gt;&lt;span style="color: red"&gt;runat&lt;/span&gt;&lt;span style="color: blue"&gt;="server" &lt;/span&gt;&lt;span style="color: red"&gt;enableviewstate&lt;/span&gt;&lt;span style="color: blue"&gt;="false"&amp;gt;
    &amp;lt;&lt;/span&gt;&lt;span style="color: maroon"&gt;div&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;
        &amp;lt;&lt;/span&gt;&lt;span style="color: maroon"&gt;asp&lt;/span&gt;&lt;span style="color: blue"&gt;:&lt;/span&gt;&lt;span style="color: maroon"&gt;Label &lt;/span&gt;&lt;span style="color: red"&gt;ID&lt;/span&gt;&lt;span style="color: blue"&gt;="Label1" &lt;/span&gt;&lt;span style="color: red"&gt;runat&lt;/span&gt;&lt;span style="color: blue"&gt;="server" &lt;/span&gt;&lt;span style="color: red"&gt;Text&lt;/span&gt;&lt;span style="color: blue"&gt;="ID:"&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon"&gt;asp&lt;/span&gt;&lt;span style="color: blue"&gt;:&lt;/span&gt;&lt;span style="color: maroon"&gt;Label&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;
        &amp;lt;&lt;/span&gt;&lt;span style="color: maroon"&gt;asp&lt;/span&gt;&lt;span style="color: blue"&gt;:&lt;/span&gt;&lt;span style="color: maroon"&gt;TextBox &lt;/span&gt;&lt;span style="color: red"&gt;ID&lt;/span&gt;&lt;span style="color: blue"&gt;="txtId" &lt;/span&gt;&lt;span style="color: red"&gt;runat&lt;/span&gt;&lt;span style="color: blue"&gt;="server"&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon"&gt;asp&lt;/span&gt;&lt;span style="color: blue"&gt;:&lt;/span&gt;&lt;span style="color: maroon"&gt;TextBox&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;
        &amp;lt;&lt;/span&gt;&lt;span style="color: maroon"&gt;asp&lt;/span&gt;&lt;span style="color: blue"&gt;:&lt;/span&gt;&lt;span style="color: maroon"&gt;Label &lt;/span&gt;&lt;span style="color: red"&gt;ID&lt;/span&gt;&lt;span style="color: blue"&gt;="Label2" &lt;/span&gt;&lt;span style="color: red"&gt;runat&lt;/span&gt;&lt;span style="color: blue"&gt;="server" &lt;/span&gt;&lt;span style="color: red"&gt;Text&lt;/span&gt;&lt;span style="color: blue"&gt;="Nombre:"&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon"&gt;asp&lt;/span&gt;&lt;span style="color: blue"&gt;:&lt;/span&gt;&lt;span style="color: maroon"&gt;Label&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;
        &amp;lt;&lt;/span&gt;&lt;span style="color: maroon"&gt;asp&lt;/span&gt;&lt;span style="color: blue"&gt;:&lt;/span&gt;&lt;span style="color: maroon"&gt;TextBox &lt;/span&gt;&lt;span style="color: red"&gt;ID&lt;/span&gt;&lt;span style="color: blue"&gt;="txtNombre" &lt;/span&gt;&lt;span style="color: red"&gt;runat&lt;/span&gt;&lt;span style="color: blue"&gt;="server"&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon"&gt;asp&lt;/span&gt;&lt;span style="color: blue"&gt;:&lt;/span&gt;&lt;span style="color: maroon"&gt;TextBox&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;
        &amp;lt;&lt;/span&gt;&lt;span style="color: maroon"&gt;asp&lt;/span&gt;&lt;span style="color: blue"&gt;:&lt;/span&gt;&lt;span style="color: maroon"&gt;Label &lt;/span&gt;&lt;span style="color: red"&gt;ID&lt;/span&gt;&lt;span style="color: blue"&gt;="Label3" &lt;/span&gt;&lt;span style="color: red"&gt;runat&lt;/span&gt;&lt;span style="color: blue"&gt;="server" &lt;/span&gt;&lt;span style="color: red"&gt;Text&lt;/span&gt;&lt;span style="color: blue"&gt;="Apellidos:"&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon"&gt;asp&lt;/span&gt;&lt;span style="color: blue"&gt;:&lt;/span&gt;&lt;span style="color: maroon"&gt;Label&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;
        &amp;lt;&lt;/span&gt;&lt;span style="color: maroon"&gt;asp&lt;/span&gt;&lt;span style="color: blue"&gt;:&lt;/span&gt;&lt;span style="color: maroon"&gt;TextBox &lt;/span&gt;&lt;span style="color: red"&gt;ID&lt;/span&gt;&lt;span style="color: blue"&gt;="txtApellidos" &lt;/span&gt;&lt;span style="color: red"&gt;runat&lt;/span&gt;&lt;span style="color: blue"&gt;="server"&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon"&gt;asp&lt;/span&gt;&lt;span style="color: blue"&gt;:&lt;/span&gt;&lt;span style="color: maroon"&gt;TextBox&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;
        &amp;lt;&lt;/span&gt;&lt;span style="color: maroon"&gt;asp&lt;/span&gt;&lt;span style="color: blue"&gt;:&lt;/span&gt;&lt;span style="color: maroon"&gt;Label &lt;/span&gt;&lt;span style="color: red"&gt;ID&lt;/span&gt;&lt;span style="color: blue"&gt;="Label4" &lt;/span&gt;&lt;span style="color: red"&gt;runat&lt;/span&gt;&lt;span style="color: blue"&gt;="server" &lt;/span&gt;&lt;span style="color: red"&gt;Text&lt;/span&gt;&lt;span style="color: blue"&gt;="Fecha Nacimiento:"&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon"&gt;asp&lt;/span&gt;&lt;span style="color: blue"&gt;:&lt;/span&gt;&lt;span style="color: maroon"&gt;Label&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;
        &amp;lt;&lt;/span&gt;&lt;span style="color: maroon"&gt;asp&lt;/span&gt;&lt;span style="color: blue"&gt;:&lt;/span&gt;&lt;span style="color: maroon"&gt;TextBox &lt;/span&gt;&lt;span style="color: red"&gt;ID&lt;/span&gt;&lt;span style="color: blue"&gt;="txtFechaNacimiento" &lt;/span&gt;&lt;span style="color: red"&gt;runat&lt;/span&gt;&lt;span style="color: blue"&gt;="server"&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon"&gt;asp&lt;/span&gt;&lt;span style="color: blue"&gt;:&lt;/span&gt;&lt;span style="color: maroon"&gt;TextBox&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;
        &amp;lt;&lt;/span&gt;&lt;span style="color: maroon"&gt;hr &lt;/span&gt;&lt;span style="color: blue"&gt;/&amp;gt;
        &amp;lt;&lt;/span&gt;&lt;span style="color: maroon"&gt;input &lt;/span&gt;&lt;span style="color: red"&gt;type&lt;/span&gt;&lt;span style="color: blue"&gt;="button" &lt;/span&gt;&lt;span style="color: red"&gt;ID&lt;/span&gt;&lt;span style="color: blue"&gt;="btnConsulta"  &lt;/span&gt;&lt;span style="color: red"&gt;value&lt;/span&gt;&lt;span style="color: blue"&gt;="Buscar" /&amp;gt;
    &amp;lt;/&lt;/span&gt;&lt;span style="color: maroon"&gt;div&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;
    &amp;lt;/&lt;/span&gt;&lt;span style="color: maroon"&gt;form&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;
&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon"&gt;body&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;
&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon"&gt;html&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;
&lt;/span&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Lo primero que debermos asegurar es que hemos incluido la referencia a jQuery, a patir de ahí, incluimos el script inicial de la página &lt;em&gt;$(document).ready(…); &lt;/em&gt;donde establecemos el enlace del evento &lt;em&gt;click&lt;/em&gt; del botón &lt;em&gt;btnConsulta&lt;/em&gt; y la función &lt;em&gt;buscar&lt;/em&gt;,&amp;nbsp; esta función realiza una llamada al handler que hemos creado anteriormente, y procesa el resultado para mostrarlo en pantalla.&lt;/p&gt;
&lt;p&gt;La aplicación en ejecución:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://devjoker.com/images/UploadFiles/Windows-Live-Writer/JSON.NET_C264/image_6.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://devjoker.com/images/UploadFiles/Windows-Live-Writer/JSON.NET_C264/image_thumb_2.png" width="244" height="107"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Si analizamos el tráfico con &lt;a href="http://fiddler2.com/fiddler2/"&gt;Fiddler&lt;/a&gt; podemos ver la llamada al hanlder y la respuesta obtenida:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;HTTP/1.1 200 OK&lt;br&gt;Server: ASP.NET Development Server/10.0.0.0&lt;br&gt;Date: Wed, 25 Jan 2012 14:45:30 GMT&lt;br&gt;X-AspNet-Version: 4.0.30319&lt;br&gt;Cache-Control: private&lt;br&gt;Content-Type: application/json; charset=utf-8&lt;br&gt;Content-Length: 116&lt;br&gt;Connection: Close&lt;/p&gt;
&lt;p&gt;{"Id":"bb816aa1-feab-4e35-b9be-80f1273d4913","Nombre":"Pedro","Apellidos":"Herrarte","FechaNacimiento":"13/01/1975"}&lt;/p&gt;&lt;/blockquote&gt;


&lt;p&gt;Como podemos ver el resultado obtenido está serializado en JSON perfectamente, y sin apenas esfuerzo.&lt;/p&gt;
&lt;p&gt;En la página del autor - &lt;a href="http://james.newtonking.com/projects/json/help/"&gt;http://james.newtonking.com/projects/json/help/&lt;/a&gt; - disponemos además de muchos ejemplos que nos permitirán sacar el máximo rendimiento a JSON.NET.&lt;/p&gt;
&lt;p&gt;Saludos, &lt;/p&gt;
&lt;p&gt;DJK&lt;/p&gt;</description>
      <guid>/contenidos/articulos/505/JSONNET-Mejorando-la-serializacioacuten-JSON-con-NET.aspx</guid>
      <pubDate>Wed, 25 Jan 2012 17:03:05 GMT</pubDate>
    </item>
    <item>
      <title>Recursos de desarrollo para Silverlight</title>
      <link>/contenidos/articulos/504/Recursos-de-desarrollo-para-Silverlight.aspx</link>
      <description>&lt;p&gt;Desde hace algún tiempo estoy involucrado en un proyecto en el que utilizamos Silverlight como tecnología para la capa de presentación. No soy ningún experto en Silverlight, pero gracias a mis compañeros y a su paciencia voy aprendiendo …&lt;/p&gt; &lt;p&gt;La curva de aprendizaje de Silverlight es costosa, son muchos los elementos que hay que manejar: el lenguaje de marcado XAML, WCF RIA Services, el patrón MVVM, PRISM, MEF, etc... Confieso que ha día de hoy aún no tengo demasiada soltura con del entorno, por lo que está lista de recursos de desarrollo para Silverlight me va a venir de perlas … ¡a mi!&lt;/p&gt; &lt;p&gt;El primer sitio en el disponemos de una amplia colección de recursos es la propia página de Silverlight - &lt;a href="http://www.silverlight.net/learn"&gt;http://www.silverlight.net/learn&lt;/a&gt; – y en especial los hands on labs - &lt;a href="http://www.silverlight.net/learn/overview/silverlight-4-hands-on-labs"&gt;http://www.silverlight.net/learn/overview/silverlight-4-hands-on-labs&lt;/a&gt;. Eso si, no esperéis ser tocados por el &lt;a href="http://es.wikipedia.org/wiki/Pastafarismo"&gt;tallarinesco apendice&lt;/a&gt; y que de repente os convirtáis en unos tipos con buen gusto. Los programadores somos cuadriculados y nuestras interfaces tienen cuadrados: Las ventanas son cuadradas, los input son cuadrados, los botones …. dejad el diseño y &lt;a href="http://www.microsoft.com/expression/products/blend_overview.aspx"&gt;Blend&lt;/a&gt; a los diseñadores &lt;img style="border-bottom-style: none; border-left-style: none; border-top-style: none; border-right-style: none" class="wlEmoticon wlEmoticon-smile" alt="Sonrisa" src="http://devjoker.com/images/UploadFiles/Windows-Live-Writer/0934b12f040d_E743/wlEmoticon-smile_2.png"&gt;.&lt;/p&gt; &lt;p align="center"&gt;&lt;a href="http://devjoker.com/images/UploadFiles/Windows-Live-Writer/0934b12f040d_E743/image_4.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://devjoker.com/images/UploadFiles/Windows-Live-Writer/0934b12f040d_E743/image_thumb_1.png" width="407" height="300"&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;El siguiente recurso que me gustaría destacar es el Silvelight Toolkit en codeplex: &lt;a href="http://silverlight.codeplex.com/"&gt;http://silverlight.codeplex.com/&lt;/a&gt;, se trata de una colección de controles para Silverlight y Silverlight para Windows Phone, los controles están desarrollados por la propia&amp;nbsp; Microsoft. Podemos descargarlo directamente desde Codeplex pero también está disponible su instalación con NuGet.&lt;/p&gt; &lt;p&gt;&lt;a href="http://devjoker.com/images/UploadFiles/Windows-Live-Writer/0934b12f040d_E743/image_2.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://devjoker.com/images/UploadFiles/Windows-Live-Writer/0934b12f040d_E743/image_thumb.png" width="420" height="226"&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;O desde &lt;a href="http://nuget.codeplex.com/"&gt;Nuget&lt;/a&gt; directamente con Visual Studio …&lt;/p&gt; &lt;p&gt;&lt;a href="http://devjoker.com/images/UploadFiles/Windows-Live-Writer/0934b12f040d_E743/image_6.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://devjoker.com/images/UploadFiles/Windows-Live-Writer/0934b12f040d_E743/image_thumb_2.png" width="335" height="225"&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;El sitio demo de Silverlight Toolkit es sencillamente impresionante - &lt;a href="http://www.silverlight.net/content/samples/sl4/toolkitcontrolsamples/run/default.html"&gt;http://www.silverlight.net/content/samples/sl4/toolkitcontrolsamples/run/default.html&lt;/a&gt;, tiene demostraciones de como utilizar todos y cada uno de los controles que se incluyen, con su código XAML y C# asociado(o VB). Una maravilla, sencillamente impagable.&lt;/p&gt; &lt;p align="center"&gt;&lt;a href="http://devjoker.com/images/UploadFiles/Windows-Live-Writer/0934b12f040d_E743/image_8.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://devjoker.com/images/UploadFiles/Windows-Live-Writer/0934b12f040d_E743/image_thumb_3.png" width="324" height="181"&gt;&lt;/a&gt;&lt;/p&gt; &lt;p align="center"&gt;&lt;a href="http://devjoker.com/images/UploadFiles/Windows-Live-Writer/0934b12f040d_E743/image_10.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://devjoker.com/images/UploadFiles/Windows-Live-Writer/0934b12f040d_E743/image_thumb_4.png" width="322" height="182"&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;Por último, un video sobre el patrón de diseño MVVM y los enlaces a PRIMS y MEF, los módulos de extensibilidad que podemos utilizar para construir nuestras aplicaciones Silverlight de forma modular. &lt;/p&gt; &lt;ul&gt; &lt;li&gt;Silverlight MVVM =&amp;gt; &lt;a href="http://channel9.msdn.com/Blogs/channel9spain/Crear-aplicaciones-Silverlight-con-MVVM"&gt;http://channel9.msdn.com/Blogs/channel9spain/Crear-aplicaciones-Silverlight-con-MVVM&lt;/a&gt;&lt;/li&gt; &lt;li&gt;Prims: &lt;a href="http://compositewpf.codeplex.com/"&gt;http://compositewpf.codeplex.com/&lt;/a&gt;&lt;/li&gt; &lt;li&gt;MEF:&lt;a title="http://mef.codeplex.com/" href="http://mef.codeplex.com/"&gt;http://mef.codeplex.com/&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;Saludos, DJK&lt;/p&gt;</description>
      <guid>/contenidos/articulos/504/Recursos-de-desarrollo-para-Silverlight.aspx</guid>
      <pubDate>Tue, 24 Jan 2012 18:28:44 GMT</pubDate>
    </item>
    <item>
      <title>El FBI cierra Megaupload y detiene a varios de sus trabajadores</title>
      <link>/contenidos/articulos/503/El-FBI-cierra-Megaupload-y-detiene-a-varios-de-sus-trabajadores.aspx</link>
      <description>&lt;p&gt;Así como suena. El FBI ha cerrado Megaupload, una de las mayores webs de intercambio de archivos y detenido a sus responsables y varios de sus trabajadores.&lt;/p&gt; &lt;p&gt;Enlace a la noticia: &lt;a href="http://www.elmundo.es/elmundo/2012/01/19/navegante/1327002605.html"&gt;http://www.elmundo.es/elmundo/2012/01/19/navegante/1327002605.html&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;&lt;a href="http://www.elmundo.es/elmundo/2012/01/19/navegante/1327002605.html"&gt;&lt;a href="http://www.devjoker.com/images/UploadFiles/WindowsLiveWriter/ElFBIcierraMegauploadydetieneavariosdesu_1426D/image_2.png"&gt;&lt;img style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" title="image" border="0" alt="image" src="http://www.devjoker.com/images/UploadFiles/WindowsLiveWriter/ElFBIcierraMegauploadydetieneavariosdesu_1426D/image_thumb.png" width="415" height="287"&gt;&lt;/a&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;En la noticia anterior se menciona que se les acusa de … ¡sorpresa! piratería y delitos contra la propiedad intelectual. Otra versión de la noticia - &lt;a href="http://alt1040.com/2012/01/megaupload-cierra"&gt;http://alt1040.com/2012/01/megaupload-cierra&lt;/a&gt; - habla de delitos de blanqueo de dinero y crimen organizado …, aunque la &lt;a href="http://www.fbi.gov/news/pressrel/press-releases/justice-department-charges-leaders-of-megaupload-with-widespread-online-copyright-infringement"&gt;nota oficial del FBI&lt;/a&gt; habla de fraude generalizado contra los derechos de autor. La operación además se ha desarrollado internacionalmente en Nueva Zelanda.&lt;/p&gt; &lt;p&gt;Sin haber tenido apenas tiempo de asimilar la noticia, y a riesgo de ser sensacionalista … me gustaría pedir al FBI que se aplique del mismo modo con la «&lt;em&gt;ley de protección de datos personales&lt;/em&gt;», y proceda a cerrar bancos, multinacionales de todo tipo, ya que me consta el incumplimiento generalizado de dicha ley.&lt;/p&gt; &lt;p&gt;Lamentable.&lt;/p&gt;</description>
      <guid>/contenidos/articulos/503/El-FBI-cierra-Megaupload-y-detiene-a-varios-de-sus-trabajadores.aspx</guid>
      <pubDate>Thu, 19 Jan 2012 23:57:39 GMT</pubDate>
    </item>
    <item>
      <title>Estad&amp;iacute;sticas de utilizaci&amp;oacute;n de tu sitio web en tiempo real con Google Analytics.</title>
      <link>/contenidos/articulos/502/Estadiacutesticas-de-utilizacioacuten-de-tu-sitio-web-en-tiempo-real-con-Google-Analytics.aspx</link>
      <description>&lt;p&gt;Google no deja de sorprendernos. Acaba de incorporar a su sistema de estadísticas &lt;a href="http://www.google.com/analytics/"&gt;Google Analytics&lt;/a&gt; informes en tiempo real. &lt;/p&gt; &lt;p&gt;El servicio ofrece datos del número de usuarios concurrentes, páginas servidas por minuto y segundo, el tipo de usuario (nuevo, recurrente), página activas, búsquedas de los usuarios, ubicaciones … etc&lt;/p&gt; &lt;p align="center"&gt;&lt;a href="http://devjoker.com/images/UploadFiles/Windows-Live-Writer/Estadsticas-de-utilizacin-en-tiempo-rea_CCBC/image_2.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://devjoker.com/images/UploadFiles/Windows-Live-Writer/Estadsticas-de-utilizacin-en-tiempo-rea_CCBC/image_thumb.png" width="447" height="238"&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;Todo en tiempo real. Alucinante.&lt;/p&gt; &lt;p&gt;El servicio está aún en beta (aunque eso en Google no significa lo mismo que en cualquier otro sitio), y solo está disponible con la nueva interfaz.&lt;/p&gt; &lt;p&gt;Saludos, DJK.&lt;/p&gt;</description>
      <guid>/contenidos/articulos/502/Estadiacutesticas-de-utilizacioacuten-de-tu-sitio-web-en-tiempo-real-con-Google-Analytics.aspx</guid>
      <pubDate>Wed, 18 Jan 2012 14:42:49 GMT</pubDate>
    </item>
    <item>
      <title>HTML5 e integraci&amp;oacute;n con Facebook</title>
      <link>/contenidos/articulos/501/HTML5-e-integracioacuten-con-Facebook.aspx</link>
      <description>&lt;p&gt;Si eres un seguidor habitual de &lt;a href="http://www.devjoker.com"&gt;www.devjoker.com&lt;/a&gt; te habrás dado cuenta de que en estos últimos días estamos haciendo algunos cambios. Y es que nos habíamos quedado «viejunos», Devjoker no utiliza ningún CMS como puedan ser &lt;a href="http://es.wordpress.com/"&gt;wordpress&lt;/a&gt;, &lt;a href="http://umbraco.com/"&gt;umbraco&lt;/a&gt; o&amp;nbsp; &lt;a href="http://www.dotnetblogengine.net/"&gt;blogengine&lt;/a&gt;, sino que implementa su propio motor de contenidos … es más cuando comenzamos a programar devjoker - allá por el año 2002 - no existía ninguno de estos CMS.&lt;/p&gt; &lt;p&gt;Como consecuencia de lo anterior&amp;nbsp; tenemos que cada cambio, mejora o evolución tecnológica debemos implementarla manualmente. Es muchísimo mas complicado y requiere de mucho tiempo, pero también produce muchísima mas satisfacción que instalar un service pack para actualizar de versión &lt;img style="border-bottom-style: none; border-left-style: none; border-top-style: none; border-right-style: none" class="wlEmoticon wlEmoticon-smile" alt="Sonrisa" src="http://devjoker.com/images/UploadFiles/Windows-Live-Writer/HTML5-e-integracin-con-Facebook_E9F8/wlEmoticon-smile_2.png"&gt;. &lt;/p&gt; &lt;p&gt;Por supuesto, no podemos ofrecer todas las funcionalidades de los grandes CMS ni actualizar a la misma velocidad. Hasta ahora no había importado mucho, ya que nuestro objetivo no es disponer del CMS más completo del mercado, tan solo compartir conocimiento y experiencias. Pero recientemente &lt;a href="http://www.clikear.com/claves_optimizar_web_725.aspx"&gt;Google ha modificado el algoritmo de búsqueda&lt;/a&gt;, y &lt;a href="www.devjoker.com"&gt;devjoker.com&lt;/a&gt; ha sido penalizado duramente (hemos pasado de un page rank 6 a 3). &lt;/p&gt; &lt;p&gt;Así que no me ha quedado mas remedio que ponerme manos a la obra para implementar algunas características que han adquirido muchísima relevancia para Google:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;Integración con &lt;a href="http://www.facebook.com/pages/devjokercom/188781521219799"&gt;facebook&lt;/a&gt;. Hemos creado una página en la red social por excelencia (bueno en realidad lo que hemos hecho es darle a un botón que pone «crear página» en facebook) y hemos integrado el plugin social de facebook.&amp;nbsp; &lt;strong&gt;Así que ya podéis darle al «me gusta»&lt;/strong&gt;.&lt;/li&gt; &lt;li&gt;HTML5. Estamos modificando el código que genera &lt;a href="http://www.devjoker.com"&gt;www.devjoker.com&lt;/a&gt; para hacerlo más semántico y de mayor calidad. (aunque HTML5 es mucho, muchísimo mas que esto!)&lt;/li&gt; &lt;li&gt;También hemos aprovechado para la corrección de algunos fallos.&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;&lt;a href="http://devjoker.com/images/UploadFiles/Windows-Live-Writer/HTML5-e-integracin-con-Facebook_E9F8/image_4.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://devjoker.com/images/UploadFiles/Windows-Live-Writer/HTML5-e-integracin-con-Facebook_E9F8/image_thumb_1.png" width="473" height="319"&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;Esperamos seguir introduciendo novedades, pero lo mas importante – disponer del tiempo necesario para publicar nuevos post y tutoriales. &lt;/p&gt; &lt;p&gt;Y si os gusta … pues darle al «me gusta».&lt;/p&gt; &lt;p&gt;Saludos, DJK. &lt;/p&gt;</description>
      <guid>/contenidos/articulos/501/HTML5-e-integracioacuten-con-Facebook.aspx</guid>
      <pubDate>Mon, 16 Jan 2012 17:25:23 GMT</pubDate>
    </item>
    <item>
      <title>Frikada del d&amp;iacute;a. SSH con tu foto en Ascii Art.</title>
      <link>/contenidos/articulos/500/Frikada-del-diacutea-SSH-con-tu-foto-en-Ascii-Art.aspx</link>
      <description>&lt;p&gt;Cuando trabajas con varios servidores remotos puede resultar confuso saber cuando estás en uno u en otro. Con windows suelo instalar bgInfo con lo que simplemente mirando el fondo de escritorio salgo de dudas.&lt;/p&gt; &lt;p&gt;Pero con SSH las pantallas son negras, sin escritorio ni ningún elemento visual que nos ayude a identificar fácilmente el servidor … así que la mejor forma que se me ha ocurrido es modificar el mensaje de bienvenida que muestra Linux tras la conexión para sacar mi foto es Ascii!. Es una frikada mayúscula pero me sirve como pretexto para un pequeño post … &lt;/p&gt; &lt;p&gt;&lt;a href="http://www.devjoker.com/images/UploadFiles/WindowsLiveWriter/Frikadadelda.SSHcontufotoenAsciiArt_131CB/image_4.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://www.devjoker.com/images/UploadFiles/WindowsLiveWriter/Frikadadelda.SSHcontufotoenAsciiArt_131CB/image_thumb_1.png" width="638" height="525"&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;Para lograr este efecto solo tenemos que pasar nuestra foto a Ascii, que es tremendamente fácil utilizando herramientas como esta: &lt;a href="http://makeascii.com/"&gt;http://makeascii.com/&lt;/a&gt;&lt;/p&gt; &lt;p&gt;Una vez que tengamos la foto tan solo tenemos que modificar el archivo de bienvenida que se muestra tras el login en una session de consola con nuestro editor preferido: &lt;/p&gt; &lt;p&gt;En mi caso: &lt;strong&gt;nano /etc/motd&lt;/strong&gt; ,e introducir nuestra foto en ASCII en el archivo. Ahora seguro que ya sabemos a que servidor estamos conectados … &lt;/p&gt; &lt;p&gt;Lo dicho: una frikada.&lt;/p&gt; &lt;p&gt;Saludos, DJK&lt;/p&gt;</description>
      <guid>/contenidos/articulos/500/Frikada-del-diacutea-SSH-con-tu-foto-en-Ascii-Art.aspx</guid>
      <pubDate>Tue, 10 Jan 2012 21:46:27 GMT</pubDate>
    </item>
    <item>
      <title>Disponible la versi&amp;oacute;n Relase del driver ODP.NET de ORACLE para Entity Framework y LINQ.</title>
      <link>/contenidos/articulos/499/Disponible-la-versioacuten-Relase-del-driver-ODPNET-de-ORACLE-para-Entity-Framework-y-LINQ.aspx</link>
      <description>&lt;p&gt;Ya esta disponible la versión relase del driver ODP.NET 11.2 Relase 4 con soporte para Entity Framework y LINQ. &lt;/p&gt; &lt;p&gt;Habíamos advertido que ORACLE tenia previsto el lanzamiento del driver ODP.NET con soporte para Entity Framework a finales de años - &lt;a href="http://devjoker.com/contenidos/Articulos/494/Driver-ORACLE-para-Entity-FrameworkndashBeta-3.aspx"&gt;http://devjoker.com/contenidos/Articulos/494/Driver-ORACLE-para-Entity-FrameworkndashBeta-3.aspx&lt;/a&gt; – ¡y han cumplido!&lt;/p&gt; &lt;p&gt;&lt;a href="http://devjoker.com/images/UploadFiles/Windows-Live-Writer/cb959a6f0c0e_B0CB/image_2.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://devjoker.com/images/UploadFiles/Windows-Live-Writer/cb959a6f0c0e_B0CB/image_thumb.png" width="448" height="324"&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;Podemos descargar el driver desde las siguientes direcciones:&lt;/p&gt;&lt;span sab="1086"&gt; &lt;ul&gt; &lt;li&gt;&lt;a href="http://www.oracle.com/technetwork/topics/dotnet/utilsoft-086879.html" sab="1087"&gt;&lt;font color="#0066cc"&gt;32-bit ODAC with Oracle Developer Tools for Visual Studio&lt;/font&gt;&lt;/a&gt;&lt;/li&gt; &lt;li&gt;&lt;a href="http://www.oracle.com/technetwork/database/windows/downloads/utilsoft-087491.html" sab="1087"&gt;&lt;font color="#0066cc"&gt;32-bit ODAC xcopy&lt;/font&gt;&lt;/a&gt;&lt;/li&gt; &lt;li&gt;&lt;a href="http://www.oracle.com/technetwork/database/windows/downloads/index-090165.html" sab="1087"&gt;&lt;font color="#0066cc"&gt;x64 ODAC installer and xcopy&lt;/font&gt;&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/span&gt; &lt;p&gt;Entre las novedades también se incluye soporte para WCF Data Services y OData, la lista completa de novedades la podemos encontrar en el siguiente enlace: &lt;a title="http://www.oracle.com/technetwork/database/windows/newfeatures-084113.html#ODP.NET" href="http://www.oracle.com/technetwork/database/windows/newfeatures-084113.html#ODP.NET"&gt;http://www.oracle.com/technetwork/database/windows/newfeatures-084113.html#ODP.NET&lt;/a&gt;&lt;/p&gt; &lt;p&gt;En el siguiente articulo tenemos un completo ejemplo de como utilizarlo: &lt;a title="http://www.oracle.com/technetwork/issue-archive/2011/11-sep/o51odt-453447.html" href="http://www.oracle.com/technetwork/issue-archive/2011/11-sep/o51odt-453447.html"&gt;http://www.oracle.com/technetwork/issue-archive/2011/11-sep/o51odt-453447.html&lt;/a&gt;&lt;/p&gt; &lt;p&gt;Saludos, DJK.&lt;/p&gt;</description>
      <guid>/contenidos/articulos/499/Disponible-la-versioacuten-Relase-del-driver-ODPNET-de-ORACLE-para-Entity-Framework-y-LINQ.aspx</guid>
      <pubDate>Fri, 30 Dec 2011 12:44:23 GMT</pubDate>
    </item>
    <item>
      <title>Interesante recopilaci&amp;oacute;n de plugins de jQuery</title>
      <link>/contenidos/articulos/498/Interesante-recopilacioacuten-de-plugins-de-jQuery.aspx</link>
      <description>&lt;p&gt;Los que me conocéis sabéis que soy una fanático de &lt;a href="http://jquery.com/"&gt;jQuery&lt;/a&gt;. No solo de la librería sino&amp;nbsp; de la inmensa cantidad de plugins que existen. Conocerlos todos es imposible, por eso cada cierto tiempo me gusta incluir alguna recopilación de plugins - &lt;a href="http://www.devjoker.com/contenidos/catss/469/Recopilacioacuten-de-150-pluggins-de-jQuery.aspx"&gt;http://www.devjoker.com/contenidos/catss/469/Recopilacioacuten-de-150-pluggins-de-jQuery.aspx&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;En la siguiente dirección he encontrado esta interesantísima lista - &lt;a href="http://www.blog.estudioit.cl/10-nuevos-plugins-para-jquery/"&gt;http://www.blog.estudioit.cl/10-nuevos-plugins-para-jquery/&lt;/a&gt; – en la que podemos encontrar pluggins de todo tipo. Muy recomendable. Algunos de los que mas me gustan …&lt;/p&gt; &lt;p align="center"&gt;&lt;a href="http://devjoker.com/images/UploadFiles/Windows-Live-Writer/Interesante-recopilacin-de-plugins-de-jQ_A452/image_11.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://devjoker.com/images/UploadFiles/Windows-Live-Writer/Interesante-recopilacin-de-plugins-de-jQ_A452/image_thumb_3.png" width="416" height="246"&gt;&lt;/a&gt;&lt;/p&gt; &lt;p align="center"&gt;&lt;a href="http://nivo.dev7studios.com/"&gt;http://nivo.dev7studios.com/&lt;/a&gt;&lt;/p&gt; &lt;p align="center"&gt;&lt;a href="http://devjoker.com/images/UploadFiles/Windows-Live-Writer/Interesante-recopilacin-de-plugins-de-jQ_A452/image_13.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://devjoker.com/images/UploadFiles/Windows-Live-Writer/Interesante-recopilacin-de-plugins-de-jQ_A452/image_thumb_4.png" width="416" height="352"&gt;&lt;/a&gt;&lt;/p&gt; &lt;p align="center"&gt;&lt;a title="http://tympanus.net/Tutorials/BeautifulBackgroundImageNavigation/" href="http://tympanus.net/Tutorials/BeautifulBackgroundImageNavigation/"&gt;http://tympanus.net/Tutorials/BeautifulBackgroundImageNavigation/&lt;/a&gt;&lt;/p&gt; &lt;p align="center"&gt;&lt;a href="http://devjoker.com/images/UploadFiles/Windows-Live-Writer/Interesante-recopilacin-de-plugins-de-jQ_A452/image_15.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://devjoker.com/images/UploadFiles/Windows-Live-Writer/Interesante-recopilacin-de-plugins-de-jQ_A452/image_thumb_5.png" width="422" height="274"&gt;&lt;/a&gt;&lt;/p&gt; &lt;p align="center"&gt;&lt;a title="https://buildinternet.s3.amazonaws.com/live-tutorials/sliding-boxes/index.htm" href="https://buildinternet.s3.amazonaws.com/live-tutorials/sliding-boxes/index.htm"&gt;https://buildinternet.s3.amazonaws.com/live-tutorials/sliding-boxes/index.htm&lt;/a&gt;&lt;/p&gt; &lt;p&gt;Y también algunos que he encontrado por ahí y que son muy recomendables.&lt;/p&gt; &lt;p align="center"&gt;&lt;a href="http://devjoker.com/images/UploadFiles/Windows-Live-Writer/Interesante-recopilacin-de-plugins-de-jQ_A452/image_2.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://devjoker.com/images/UploadFiles/Windows-Live-Writer/Interesante-recopilacin-de-plugins-de-jQ_A452/image_thumb.png" width="244" height="210"&gt;&lt;/a&gt;&lt;a href="http://devjoker.com/images/UploadFiles/Windows-Live-Writer/Interesante-recopilacin-de-plugins-de-jQ_A452/image_7.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://devjoker.com/images/UploadFiles/Windows-Live-Writer/Interesante-recopilacin-de-plugins-de-jQ_A452/image_thumb_1.png" width="244" height="210"&gt;&lt;/a&gt;&lt;a href="http://devjoker.com/images/UploadFiles/Windows-Live-Writer/Interesante-recopilacin-de-plugins-de-jQ_A452/image_9.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://devjoker.com/images/UploadFiles/Windows-Live-Writer/Interesante-recopilacin-de-plugins-de-jQ_A452/image_thumb_2.png" width="256" height="210"&gt;&lt;/a&gt;&lt;/p&gt; &lt;p align="center"&gt;&lt;a title="http://tympanus.net/Tutorials/CollapsingSiteNavigation/" href="http://tympanus.net/Tutorials/CollapsingSiteNavigation/"&gt;http://tympanus.net/Tutorials/CollapsingSiteNavigation/&lt;/a&gt;&lt;/p&gt; &lt;p align="center"&gt;&lt;a href="http://devjoker.com/images/UploadFiles/Windows-Live-Writer/Interesante-recopilacin-de-plugins-de-jQ_A452/image_17.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://devjoker.com/images/UploadFiles/Windows-Live-Writer/Interesante-recopilacin-de-plugins-de-jQ_A452/image_thumb_6.png" width="244" height="151"&gt;&lt;/a&gt;&lt;a href="http://devjoker.com/images/UploadFiles/Windows-Live-Writer/Interesante-recopilacin-de-plugins-de-jQ_A452/image_19.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://devjoker.com/images/UploadFiles/Windows-Live-Writer/Interesante-recopilacin-de-plugins-de-jQ_A452/image_thumb_7.png" width="244" height="150"&gt;&lt;/a&gt;&lt;/p&gt; &lt;p align="center"&gt;&lt;a href="http://vegas.jaysalvat.com/"&gt;http://vegas.jaysalvat.com/&lt;/a&gt;&lt;/p&gt; &lt;p&gt;Saludos, DJK!&lt;/p&gt;</description>
      <guid>/contenidos/articulos/498/Interesante-recopilacioacuten-de-plugins-de-jQuery.aspx</guid>
      <pubDate>Wed, 21 Dec 2011 12:57:17 GMT</pubDate>
    </item>
    <item>
      <title>Gesti&amp;oacute;n de Timeouts con EventWaitHandle.</title>
      <link>/contenidos/articulos/497/Gestioacuten-de-Timeouts-con-EventWaitHandle.aspx</link>
      <description>&lt;p&gt;Trabajar con componentes – ya sea propios o externos - es algo muy habitual. En la mayoría de los casos&amp;nbsp; el componente se comporta como debe y todo parece funcionar correctamente. &lt;/p&gt; &lt;p&gt;Sin embargo, cada cierto tiempo … algo falla, recibimos la incidencia y nos ponemos manos a la obra. Pero no logramos reproducir el error. Una de las situaciones mas complejas en las que podemos encontrarnos es cuando el error se debe a que un componente emplea demasiado tiempo en realizar su trabajo. Es un problema difícil de reproducir, porque la demora puede ser debida a infinidad de motivos:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;un exceso de carga de la máquina  &lt;li&gt;un bloqueo sobre algún recurso  &lt;li&gt;ejecución de un servicio externo …&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;Si nuestro programa es un servicio es todavía peor, ya que quien reportará el error será normalmente el cliente del servicio … O si el componente es cerrado … Es necesario disponer de un mecanismo que nos permita limitar el tiempo que nuestro programa para permitirnos actuar en consecuencia.&lt;/p&gt; &lt;p&gt;Vamos a intentar hacer un ejemplo, supongamos que trabajamos con el siguiente componente:&lt;/p&gt;&lt;pre class="code"&gt;&lt;span style="color: blue"&gt;public class &lt;/span&gt;&lt;span style="color: #2b91af"&gt;Component
    &lt;/span&gt;{
        &lt;span style="color: blue"&gt;public void &lt;/span&gt;ComponentProcess(&lt;span style="color: blue"&gt;int &lt;/span&gt;miliseconds, &lt;span style="color: blue"&gt;int &lt;/span&gt;delay) {
            &lt;span style="color: blue"&gt;var &lt;/span&gt;start = &lt;span style="color: #2b91af"&gt;DateTime&lt;/span&gt;.Now ;
            
            &lt;span style="color: #2b91af"&gt;Console&lt;/span&gt;.WriteLine(&lt;span style="color: #a31515"&gt;"Inicio de ComponentProcess. Ms:{0}, delay:{1}"&lt;/span&gt;, miliseconds, delay);
            &lt;span style="color: #2b91af"&gt;Thread&lt;/span&gt;.Sleep(miliseconds*delay);
            &lt;span style="color: blue"&gt;var &lt;/span&gt;end = &lt;span style="color: #2b91af"&gt;DateTime&lt;/span&gt;.Now ;
            &lt;span style="color: #2b91af"&gt;Console&lt;/span&gt;.WriteLine(&lt;span style="color: #a31515"&gt;"Inicio de Fin ComponentProcess. Tiempo de ejecucion(ms): {0}"&lt;/span&gt;, end.Subtract(start) );
        }
    }
&lt;/pre&gt;
&lt;p&gt;Este componente no hace nada, establece un tiempo de espera en función de sus dos parámetros. En realidad lo único que queremos es hacer variar el tiempo de ejecución del método para simular una situación imprevista.&lt;/p&gt;
&lt;p&gt;Si utilizamos nuestro componente directamente(como hace el siguiente programa), podemos observar que el tiempo de ejecución va incrementándose (es lógico, es el comportamiento que hemos programado!)&lt;/p&gt;&lt;pre class="code"&gt;&lt;span style="color: blue"&gt;class &lt;/span&gt;&lt;span style="color: #2b91af"&gt;Program
    &lt;/span&gt;{
        &lt;span style="color: blue"&gt;public static void &lt;/span&gt;Main(&lt;span style="color: blue"&gt;string&lt;/span&gt;[] args)
        { 
            &lt;span style="color: blue"&gt;var &lt;/span&gt;a = &lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;Component&lt;/span&gt;();            
            &lt;span style="color: blue"&gt;for &lt;/span&gt;(&lt;span style="color: blue"&gt;var &lt;/span&gt;i = 0; i &amp;lt;= 5; i++)
            {
                a.ComponentProcess(1000, i);
            }
            &lt;span style="color: #2b91af"&gt;Console&lt;/span&gt;.WriteLine(&lt;span style="color: #a31515"&gt;"Finaliza ejecucion del programa"&lt;/span&gt;);
            &lt;span style="color: #2b91af"&gt;Console&lt;/span&gt;.ReadLine();
        }
    }&lt;/pre&gt;
&lt;p&gt;El resultado de la ejecución del código anterior es este:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://devjoker.com/images/UploadFiles/Windows-Live-Writer/5c6b67e112d4_9F15/image_2.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto; padding-top: 0px" title="image" border="0" alt="image" src="http://devjoker.com/images/UploadFiles/Windows-Live-Writer/5c6b67e112d4_9F15/image_thumb.png" width="432" height="220"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Como podemos ver el tiempo de ejecución tiende a infinito … comprometiendo la estabilidad y escalabilidad de nuestro sistema, y por supuesto el rendimiento. &lt;/p&gt;
&lt;p&gt;Es mucho mejor poder establecer un límite de tiempo para la ejecución del componente, y poder actuar en consecuencia en lugar de esperar de forma indefinida a que el programa responda. Normalmente lanzando una excepción. Vamos a ello. Lo primero que vamos a hacer es definir las interfaces …&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;ITimeoutTask&lt;/em&gt; – Que representa una tarea con timeout. 
&lt;li&gt;&lt;em&gt;ITaskResult&lt;/em&gt; – Que representa el resultado de la tarea.&lt;/li&gt;&lt;/ul&gt;&lt;pre class="code"&gt;&lt;span style="color: blue"&gt;public interface &lt;/span&gt;&lt;span style="color: #2b91af"&gt;ITimeoutTask &lt;/span&gt;{        
    &lt;span style="color: blue"&gt;void &lt;/span&gt;Process(&lt;span style="color: blue"&gt;int &lt;/span&gt;timeout);
    &lt;span style="color: #2b91af"&gt;ITaskResult &lt;/span&gt;Result { &lt;span style="color: blue"&gt;get&lt;/span&gt;; }
}

&lt;span style="color: blue"&gt;public interface &lt;/span&gt;&lt;span style="color: #2b91af"&gt;ITaskResult &lt;/span&gt;{
    &lt;span style="color: #2b91af"&gt;Exception &lt;/span&gt;Error {&lt;span style="color: blue"&gt;get&lt;/span&gt;;}
    &lt;span style="color: blue"&gt;bool &lt;/span&gt;Sucess {&lt;span style="color: blue"&gt;get&lt;/span&gt;;}
}
&lt;/pre&gt;
&lt;p&gt;Ahora hay que realizar las implementaciones de las interfaces. Primero el resultado del proceso &lt;em&gt;ITaskResult&lt;/em&gt; – tiene una propiedad «Sucess» que nos indica si la tarea se ha ejecutado correctamente y otra propiedad «Error» que nos permitirá acceder a la excepción en caso de error. Si nuestro proceso devolviera algún dato adicional deberíamos añadirlo a esta interfaz.&lt;/p&gt;&lt;pre class="code"&gt;&lt;span style="color: blue"&gt;public class &lt;/span&gt;&lt;span style="color: #2b91af"&gt;ComponentTaskResult &lt;/span&gt;: &lt;span style="color: #2b91af"&gt;ITaskResult
&lt;/span&gt;{
    &lt;span style="color: blue"&gt;private &lt;/span&gt;&lt;span style="color: #2b91af"&gt;Exception &lt;/span&gt;_error;
    &lt;span style="color: blue"&gt;private bool &lt;/span&gt;_sucess;

    &lt;span style="color: blue"&gt;public &lt;/span&gt;ComponentTaskResult(&lt;span style="color: blue"&gt;bool &lt;/span&gt;sucess, &lt;span style="color: #2b91af"&gt;Exception &lt;/span&gt;error)
    {
        _sucess = sucess;
        _error = error;
    }

    &lt;span style="color: blue"&gt;public &lt;/span&gt;&lt;span style="color: #2b91af"&gt;Exception &lt;/span&gt;Error
    {
        &lt;span style="color: blue"&gt;get &lt;/span&gt;{ &lt;span style="color: blue"&gt;return &lt;/span&gt;_error; }
    }

    &lt;span style="color: blue"&gt;public bool &lt;/span&gt;Sucess
    {
        &lt;span style="color: blue"&gt;get &lt;/span&gt;{ &lt;span style="color: blue"&gt;return &lt;/span&gt;_sucess; }
    }
}
&lt;/pre&gt;
&lt;p&gt;Y ahora la clase que implementa &lt;em&gt;ITimeoutTask&lt;/em&gt; , para la ejecución del componente. Para conseguir nuestro objetivo vamos a necesitar realizar la ejecución del componente en un nuevo thread y monitorizar el tiempo que emplea ese thread en ejecutarse(se explica mas adelante).&lt;/p&gt;&lt;pre class="code"&gt;&lt;span style="color: blue"&gt;public class &lt;/span&gt;&lt;span style="color: #2b91af"&gt;ComponentTask &lt;/span&gt;: &lt;span style="color: #2b91af"&gt;ITimeoutTask 
&lt;/span&gt;{
    &lt;span style="color: #2b91af"&gt;EventWaitHandle &lt;/span&gt;eventWait;
    &lt;span style="color: #2b91af"&gt;Component &lt;/span&gt;componente;
    &lt;span style="color: #2b91af"&gt;ITaskResult &lt;/span&gt;result;
    &lt;span style="color: blue"&gt;private int &lt;/span&gt;i_param = 0;
    &lt;span style="color: blue"&gt;private int &lt;/span&gt;b_param = 0;
   
    &lt;span style="color: blue"&gt;public &lt;/span&gt;ComponentTask (&lt;span style="color: blue"&gt;int &lt;/span&gt;ms, &lt;span style="color: blue"&gt;int &lt;/span&gt;delay  )
    {
        componente = &lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;Component&lt;/span&gt;();
        i_param = ms;
        b_param = delay;
&lt;pre class="code"&gt;        &lt;font style="background-color: #ffff00"&gt;eventWait&lt;/font&gt; = &lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;EventWaitHandle&lt;/span&gt;(&lt;span style="color: blue"&gt;false&lt;/span&gt;, &lt;span style="color: #2b91af"&gt;EventResetMode&lt;/span&gt;.AutoReset);
        result = &lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;ComponentTaskResult&lt;/span&gt;(&lt;span style="color: blue"&gt;false&lt;/span&gt;, &lt;span style="color: blue"&gt;null&lt;/span&gt;);
    }

    &lt;span style="color: blue"&gt;public void &lt;/span&gt;Process(&lt;span style="color: blue"&gt;int &lt;/span&gt;timeout)
    {
        &lt;span style="color: #2b91af"&gt;Thread &lt;/span&gt;hilo = &lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;Thread&lt;/span&gt;(InternalTask);
        hilo.Start();            
        
        &lt;span style="color: blue"&gt;if &lt;/span&gt;(&lt;font style="background-color: #ffff00"&gt;!eventWait.WaitOne(timeout)&lt;/font&gt;)            
        {
            hilo.Abort();
            result = &lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;ComponentTaskResult&lt;/span&gt;(&lt;span style="color: blue"&gt;false&lt;/span&gt;, &lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;TimeoutException&lt;/span&gt;(&lt;span style="color: #a31515"&gt;"TimeOut"&lt;/span&gt;) );
        }

    }

    &lt;span style="color: blue"&gt;private void &lt;/span&gt;InternalTask()
    {
        &lt;span style="color: blue"&gt;try
        &lt;/span&gt;{
            componente.ComponentProcess(i_param, b_param);
            result = &lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;ComponentTaskResult&lt;/span&gt;(&lt;span style="color: blue"&gt;true&lt;/span&gt;, &lt;span style="color: blue"&gt;null&lt;/span&gt;);       
        }
        &lt;span style="color: blue"&gt;catch &lt;/span&gt;(&lt;span style="color: #2b91af"&gt;Exception &lt;/span&gt;ex)
        {
            result = &lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;ComponentTaskResult&lt;/span&gt;(&lt;span style="color: blue"&gt;false&lt;/span&gt;, ex);
        }
        &lt;span style="color: blue"&gt;finally
        &lt;/span&gt;{
            &lt;font style="background-color: #ffff00"&gt;eventWait.Set()&lt;/font&gt;;
        }
    }

    &lt;span style="color: blue"&gt;public &lt;/span&gt;&lt;span style="color: #2b91af"&gt;ITaskResult &lt;/span&gt;Result
    {
        &lt;span style="color: blue"&gt;get &lt;/span&gt;{ &lt;span style="color: blue"&gt;return &lt;/span&gt;result; }
    }
}
&lt;/pre&gt;&lt;/pre&gt;
&lt;p&gt;En esta clase, tenemos definido un constructor con tantos parámetros como argumentos necesitamos para la utilización de nuestro componente (que es al fin y al cabo el objetivo que estamos persiguiendo) .Como hemos comentado vamos a necesitar realizar la ejecución del componente en un nuevo thread y sincronizar el proceso principal y secundario, por lo que instanciamos un objeto &lt;a href="http://msdn.microsoft.com/es-es/library/system.threading.eventwaithandle%28v=VS.100%29.aspx"&gt;EventWaitHandle&lt;/a&gt;, que será el objeto encargado de monitorizar el tiempo ejecución y nos va a permitir sincronizar los procesos.&lt;/p&gt;
&lt;p&gt;En la implementación de nuestra interfaz, en el método «Process» creamos un nuevo hilo para ejecutar el componente, y forzamos una espera de tiempo con el método&lt;font style="background-color: #ffff00"&gt; WaitOne(int)&lt;/font&gt; del objeto &lt;a href="http://msdn.microsoft.com/es-es/library/system.threading.eventwaithandle%28v=VS.100%29.aspx"&gt;EventWaitHandle&lt;/a&gt;. Este método, esperará al tiempo que hemos establecido o a que se realice la llamada al método &lt;font style="background-color: #ffff00"&gt;Set()&lt;/font&gt; – que le indicará al proceso principal que se ha finalizado el trabajo. Si se llama al método &lt;font style="background-color: #ffff00"&gt;Set()&lt;/font&gt; antes de que finalice el timeout el método &lt;font style="background-color: #ffff00"&gt;WaitOne(int)&lt;/font&gt; devuelve true, y false en el caso de que el tiempo finalice. Por lo tanto, en el caso de que se produzca un timeout abortamos la ejecucion del hilo y establecemos la propiedad Result con el valor adecuado (ejecucion erronea y exception de tipo Timeout).&lt;/p&gt;
&lt;p&gt;Ahora vamos a ver como modificamos el método Main para utilizar nuestra &lt;em&gt;ITimeoutTask&lt;/em&gt; ….&lt;/p&gt;&lt;pre class="code"&gt;&lt;span style="color: blue"&gt;class &lt;/span&gt;&lt;span style="color: #2b91af"&gt;ProgramWithTimeout
    &lt;/span&gt;{
        &lt;span style="color: blue"&gt;public static void &lt;/span&gt;Main(&lt;span style="color: blue"&gt;string&lt;/span&gt;[] args)
        {
            &lt;span style="color: blue"&gt;var &lt;/span&gt;timeout = 3200; &lt;span style="color: green"&gt;//3.2 segundos
            &lt;/span&gt;&lt;span style="color: blue"&gt;for &lt;/span&gt;(&lt;span style="color: blue"&gt;var &lt;/span&gt;i = 0; i &amp;lt;= 5; i++)
            {                
                &lt;span style="color: blue"&gt;var &lt;/span&gt;task = &lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;ComponentTask&lt;/span&gt;(1000, i);
                task.Process(timeout);
                                              
                &lt;span style="color: blue"&gt;if &lt;/span&gt;(task.Result.Sucess)
                {
                    &lt;span style="color: #2b91af"&gt;Console&lt;/span&gt;.WriteLine(&lt;span style="color: #a31515"&gt;"OK, el proceso ha sido correcto"&lt;/span&gt;);
                }
                &lt;span style="color: blue"&gt;else &lt;/span&gt;{
                    &lt;span style="color: #2b91af"&gt;Console&lt;/span&gt;.WriteLine(&lt;span style="color: #a31515"&gt;"Se ha producido un error. {0}"&lt;/span&gt;, task.Result.Error.Message);
                }
            }
            &lt;span style="color: #2b91af"&gt;Console&lt;/span&gt;.WriteLine(&lt;span style="color: #a31515"&gt;"Finaliza ejecucion del programa"&lt;/span&gt;);
            &lt;span style="color: #2b91af"&gt;Console&lt;/span&gt;.ReadLine();
        }
    }
&lt;/pre&gt;
&lt;p&gt;Dado que ahora la ejecución es asíncrona y con un timeout comprobamos el resultado del proceso a través de la propiedad Result, que nos indica el resultado y el error en caso de producirse.&lt;/p&gt;
&lt;p&gt;La ejecución del programa es la siguiente:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://devjoker.com/images/UploadFiles/Windows-Live-Writer/5c6b67e112d4_9F15/image_6.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto; padding-top: 0px" title="image" border="0" alt="image" src="http://devjoker.com/images/UploadFiles/Windows-Live-Writer/5c6b67e112d4_9F15/image_thumb_2.png" width="386" height="197"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;De este modo podemos controlar la ejecución de nuestro componente, garantizando que aunque su comportamiento no sea el esperado nuestro programa si tendrá el comportamiento esperado.&lt;/p&gt;
&lt;p&gt;Saludos, &lt;/p&gt;
&lt;p&gt;DJK!&lt;/p&gt;</description>
      <guid>/contenidos/articulos/497/Gestioacuten-de-Timeouts-con-EventWaitHandle.aspx</guid>
      <pubDate>Tue, 20 Dec 2011 14:53:11 GMT</pubDate>
    </item>
    <item>
      <title>Datos de ejemplo para probar nuestras aplicaciones</title>
      <link>/contenidos/articulos/496/Datos-de-ejemplo-para-probar-nuestras-aplicaciones.aspx</link>
      <description>&lt;p&gt;Cuando desarrollamos software tenemos que probar nuestros programas. No me refiero a realizar &lt;a href="http://geeks.ms/blogs/ilanda/archive/2009/06/16/pruebas-unitarias-resumiendo.aspx"&gt;test unitarios&lt;/a&gt; (cosa que recomiendo encarecidamente), sino a probar la aplicación como usuarios. En este punto tenemos introducir datos,&amp;nbsp; y una de los problemas que se presentan “inventarse los datos”. Al final acabamos poniendo «nombres de usuario» como “assasas”, direcciones del estilo “dsdasddasd 25” … en definitiva, nos inventamos los datos &lt;strike&gt;tecleando&lt;/strike&gt; aporreando el teclado. La cosa empeora cuando además introducimos validaciones de datos (NIF, CIF, números de cuenta, etc …), pasamos mas tiempo buscando datos válidos que probando nuestro programa&lt;/p&gt; &lt;p&gt;El resultado es que el al final es una perdida considerable de tiempo y&amp;nbsp; nuestro entorno de desarrollo acaba teniendo una &lt;u&gt;&lt;em&gt;mierda&lt;/em&gt; de datos&lt;/u&gt;.¿Os ha pasado alguna vez verdad?&lt;/p&gt; &lt;p&gt;Para evitarlo os recomiendo utilizar datos que “parezcan reales”, a continuación mostramos algunos trucos para obtener estos datos “casi reales”. &lt;/p&gt; &lt;ul&gt; &lt;li&gt;&lt;strong&gt;Nombres y apellidos&lt;/strong&gt;: Crear clientes, usuarios, … es innumerable la cantidad de veces que tenemos que introducir el nombre y&amp;nbsp; los apellidos en una pantalla.&amp;nbsp; Para obtener estos datos de forma fácil, usa las redes sociales. Si usas facebook puedes utilizar la opción de “Buscar amigos …”, en linked-in “Gente que conozcas …” . Todas tienen una opción parecida. Ya tienes una bonita lista de nombres con sus apellidos.&lt;img style="border-bottom-style: none; border-left-style: none; border-top-style: none; border-right-style: none" class="wlEmoticon wlEmoticon-smile" alt="Sonrisa" src="http://devjoker.com/images/UploadFiles/Windows-Live-Writer/Datos-de-ejemplo-para-las-aplicaciones_997F/wlEmoticon-smile_2.png"&gt;&lt;br&gt;&lt;br&gt;&lt;a href="http://devjoker.com/images/UploadFiles/Windows-Live-Writer/Datos-de-ejemplo-para-las-aplicaciones_997F/image_2.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto; padding-top: 0px" title="image" border="0" alt="image" src="http://devjoker.com/images/UploadFiles/Windows-Live-Writer/Datos-de-ejemplo-para-las-aplicaciones_997F/image_thumb.png" width="244" height="149"&gt;&lt;/a&gt;  &lt;li&gt;&lt;strong&gt;Emails. &lt;/strong&gt;Este es un dato delicado, si utilizamos direcciones reales podemos llegar a enviar correos desde un entorno de desarrollo. Utiliza servicios como “10 minute mails”, que crean cuentas de correo completamente funcionales por tiempo limitado. Ya os hable de este servicio hace algún tiempo en este &lt;a href="http://www.devjoker.com/contenidos/Articulos/242/El-email-de-diez-minutos.aspx"&gt;artículo&lt;/a&gt;.&lt;strong&gt;&amp;nbsp;&lt;br&gt;&lt;br&gt;&lt;a href="http://devjoker.com/images/UploadFiles/Windows-Live-Writer/Datos-de-ejemplo-para-las-aplicaciones_997F/image_4.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto; padding-top: 0px" title="image" border="0" alt="image" src="http://devjoker.com/images/UploadFiles/Windows-Live-Writer/Datos-de-ejemplo-para-las-aplicaciones_997F/image_thumb_1.png" width="244" height="176"&gt;&lt;/a&gt;&lt;/strong&gt;  &lt;li&gt;&lt;strong&gt;Direcciones postales&lt;/strong&gt;: Este es uno de los datos que mas me “molestan”. En particular en estos momento trabajo en un sistema que utiliza geolocalización y realiza validaciones sobre el código postal, la provincia etc … por lo que o utilizas una dirección real o mal vamos. Para estos casos necesitamos direcciones reales … Para encontrarlas nada mejor que recurrir “Google maps” p “Bing maps” y realizar una búsqueda del tipo “Bares en Madrid”, “Talleres en Barcelona”, etc … Voilá, direcciones para aburrir a cualquiera.&lt;br&gt;&lt;br&gt;&lt;a href="http://devjoker.com/images/UploadFiles/Windows-Live-Writer/Datos-de-ejemplo-para-las-aplicaciones_997F/image_6.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://devjoker.com/images/UploadFiles/Windows-Live-Writer/Datos-de-ejemplo-para-las-aplicaciones_997F/image_thumb_2.png" width="244" height="134"&gt;&lt;/a&gt; &lt;li&gt;&lt;strong&gt;Teléfonos&lt;/strong&gt;. Este datos es preferible inventarlo, pero teniendo siempre cuidado y utilizar números ficticios … (no vaya a ser que el sistema envíe SMS´s o realice llamadas …) &lt;li&gt;&lt;strong&gt;DNI, NIE, CIF&lt;/strong&gt;. Otro dato molesto. Utiliza este servicio para generarlo: &lt;a href="http://niednicifgenerador.appspot.com/"&gt;http://niednicifgenerador.appspot.com/&lt;/a&gt;&lt;br&gt;&lt;br&gt;&lt;a href="http://devjoker.com/images/UploadFiles/Windows-Live-Writer/Datos-de-ejemplo-para-las-aplicaciones_997F/image_8.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://devjoker.com/images/UploadFiles/Windows-Live-Writer/Datos-de-ejemplo-para-las-aplicaciones_997F/image_thumb_3.png" width="244" height="140"&gt;&lt;/a&gt; &lt;li&gt;&lt;strong&gt;Números de tarjeta&lt;/strong&gt;: De nuevo otro servicio para estos casos - &lt;a href="http://generadores.arredemo.org/ccgenerador/"&gt;http://generadores.arredemo.org/ccgenerador/&lt;/a&gt;. Espero que nadie espere números de tarjetas válidos para comprar en internet, el servicio solo genera números válidos a nivel matemático.&lt;br&gt;&lt;a href="http://devjoker.com/images/UploadFiles/Windows-Live-Writer/Datos-de-ejemplo-para-las-aplicaciones_997F/image_10.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://devjoker.com/images/UploadFiles/Windows-Live-Writer/Datos-de-ejemplo-para-las-aplicaciones_997F/image_thumb_4.png" width="197" height="244"&gt;&lt;/a&gt;&lt;br&gt; &lt;li&gt;&lt;strong&gt;Datos bancarios&lt;/strong&gt;:Utiliza esta página - &lt;a href="http://www.genware.es"&gt;http://www.genware.es&lt;/a&gt;. Dispones de opciones para generar CCC, ISBAN, … de nuevo que nadie espere poder domiciliar el recibo de la luz en estas cuentas ….&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;&lt;br&gt;&lt;/p&gt; &lt;p&gt;&lt;a href="http://devjoker.com/images/UploadFiles/Windows-Live-Writer/Datos-de-ejemplo-para-las-aplicaciones_997F/image_12.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://devjoker.com/images/UploadFiles/Windows-Live-Writer/Datos-de-ejemplo-para-las-aplicaciones_997F/image_thumb_5.png" width="244" height="140"&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;En esta última página disponemos de opciones para generar casi todo tipo de datos, hasta código de barras.&lt;/p&gt; &lt;p&gt;Saludos, DJK!&lt;/p&gt;</description>
      <guid>/contenidos/articulos/496/Datos-de-ejemplo-para-probar-nuestras-aplicaciones.aspx</guid>
      <pubDate>Fri, 16 Dec 2011 12:01:06 GMT</pubDate>
    </item>
    <item>
      <title>Productivity Power Tools para Visual Studio 2010</title>
      <link>/contenidos/articulos/495/Productivity-Power-Tools-para-Visual-Studio-2010.aspx</link>
      <description>&lt;p&gt;Productivity Power Tools es un paquete de herramientas para Visual Studio 2010 con el que llevo trabajando desde hace algún tiempo y no puedo mas que recomendar encarecidamente. Solo están disponibles para Visual Studio 2010 &lt;img style="border-bottom-style: none; border-left-style: none; border-top-style: none; border-right-style: none" class="wlEmoticon wlEmoticon-sadsmile" alt="Triste" src="http://devjoker.com/images/UploadFiles/Windows-Live-Writer/Visual-Studio-product_C4FF/wlEmoticon-sadsmile_2.png"&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;Lo primero que debemos hacer como es lógico es instalar la extensión. Para ellos podemos acceder desde el propio Visual Studio utilizando el «Extension Manager» y buscar en «online gallery» , o también a través de &lt;a href="http://visualstudiogallery.msdn.microsoft.com/d0d33361-18e2-46c0-8ff2-4adea1e34fef"&gt;este enlace&lt;/a&gt;.&lt;/p&gt; &lt;p align="center"&gt;&lt;a href="http://devjoker.com/images/UploadFiles/Windows-Live-Writer/Visual-Studio-product_C4FF/image_4.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://devjoker.com/images/UploadFiles/Windows-Live-Writer/Visual-Studio-product_C4FF/image_thumb_1.png" width="176" height="244"&gt;&lt;/a&gt;&amp;nbsp;&lt;a href="http://devjoker.com/images/UploadFiles/Windows-Live-Writer/Visual-Studio-product_C4FF/image_16.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://devjoker.com/images/UploadFiles/Windows-Live-Writer/Visual-Studio-product_C4FF/image_thumb_7.png" width="346" height="241"&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;Entre las opciones que mas gustan quisiera destacar el «Solution Navigator», se trata de un explorador de soluciones mejorado,&amp;nbsp; con un buscador integrado, que nos permitirá movernos mucho mas rápida y cómodamente a través de nuestra solución de proyectos. Especialmente útil para soluciones grandes y buscar clases. También es muy interesante la opción de visualizar una vista en miniatura de las imágenes, increíblemente útil a la hora de del desarrollo web.&lt;/p&gt; &lt;p align="center"&gt;&lt;a href="http://devjoker.com/images/UploadFiles/Windows-Live-Writer/Visual-Studio-product_C4FF/image_6.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://devjoker.com/images/UploadFiles/Windows-Live-Writer/Visual-Studio-product_C4FF/image_thumb_2.png" width="161" height="244"&gt;&lt;/a&gt;&amp;nbsp;&lt;a href="http://devjoker.com/images/UploadFiles/Windows-Live-Writer/Visual-Studio-product_C4FF/image_8.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://devjoker.com/images/UploadFiles/Windows-Live-Writer/Visual-Studio-product_C4FF/image_thumb_3.png" width="159" height="244"&gt;&lt;/a&gt;&amp;nbsp;&lt;a href="http://devjoker.com/images/UploadFiles/Windows-Live-Writer/Visual-Studio-product_C4FF/image_10.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://devjoker.com/images/UploadFiles/Windows-Live-Writer/Visual-Studio-product_C4FF/image_thumb_4.png" width="157" height="244"&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;Pero no solo nos ayuda a nivel de utilidades en Visual Studio, también lo hace al escribir el código.&amp;nbsp; Lo primero que cabe destacar es la sintaxis coloreada de intellisense, pero para mi gusto la mejor de todas es la ayuda en línea que nos permite posicionándonos sobre un tipo (en la imagen System.IO.FileStream) obtener una ventana de ayuda donde podemos ver los método que contiene, desde donde estamos utilizando el tipo , las referencias, la jerarquía de clases … una maravilla.&lt;/p&gt; &lt;p align="center"&gt;&lt;a href="http://devjoker.com/images/UploadFiles/Windows-Live-Writer/Visual-Studio-product_C4FF/image_20.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; margin: 0px 0px 109px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://devjoker.com/images/UploadFiles/Windows-Live-Writer/Visual-Studio-product_C4FF/image_thumb_9.png" width="244" height="61"&gt;&lt;/a&gt;&amp;nbsp;&lt;a href="http://devjoker.com/images/UploadFiles/Windows-Live-Writer/Visual-Studio-product_C4FF/image_22.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://devjoker.com/images/UploadFiles/Windows-Live-Writer/Visual-Studio-product_C4FF/image_thumb_10.png" width="244" height="177"&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;Otra opción interesante es buscador rápido que se integra en la ventana principal resaltando todas las ocurrencias del texto a buscar.&lt;/p&gt; &lt;p&gt;&lt;a href="http://devjoker.com/images/UploadFiles/Windows-Live-Writer/Visual-Studio-product_C4FF/image_24.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://devjoker.com/images/UploadFiles/Windows-Live-Writer/Visual-Studio-product_C4FF/image_thumb_11.png" width="244" height="60"&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;También mejora el cuadro de dialogo para añadir referencias a nuestro proyecto, permitiéndonos entre otras cosas realizar búsquedas en los assemblies (¡que ya era hora!)&lt;/p&gt; &lt;p&gt;&lt;a href="http://devjoker.com/images/UploadFiles/Windows-Live-Writer/Visual-Studio-product_C4FF/image_12.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://devjoker.com/images/UploadFiles/Windows-Live-Writer/Visual-Studio-product_C4FF/image_thumb_5.png" width="244" height="142"&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;Hay mas opciones que no comentare aquí, pero ver la lista completa de funcionalidades en el siguiente enlace &lt;a title="http://visualstudiogallery.msdn.microsoft.com/d0d33361-18e2-46c0-8ff2-4adea1e34fef" href="http://visualstudiogallery.msdn.microsoft.com/d0d33361-18e2-46c0-8ff2-4adea1e34fef"&gt;http://visualstudiogallery.msdn.microsoft.com/d0d33361-18e2-46c0-8ff2-4adea1e34fef&lt;/a&gt;&lt;/p&gt; &lt;p&gt;En el aspecto negativo decir que al principio cuesta un poco acostumbrarse al uso de las nuevas herramientas (en especial el buscador y el navegador de soluciones), pero el esfuerzo inicial compensa y mucho. De cualquier modo todas las opciones se pueden habilitar o deshabilitar desde el menú de opciones de Visual Studio, por lo que si alguna característica no nos convence, no nos acaba de resultar útil o no nos gusta pues la deshabilitamos!.&lt;/p&gt; &lt;p&gt;&lt;a href="http://devjoker.com/images/UploadFiles/Windows-Live-Writer/Visual-Studio-product_C4FF/image_14.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://devjoker.com/images/UploadFiles/Windows-Live-Writer/Visual-Studio-product_C4FF/image_thumb_6.png" width="244" height="143"&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;Saludos, DJK&lt;/p&gt;</description>
      <guid>/contenidos/articulos/495/Productivity-Power-Tools-para-Visual-Studio-2010.aspx</guid>
      <pubDate>Tue, 13 Dec 2011 17:53:26 GMT</pubDate>
    </item>
    <item>
      <title>Driver ORACLE para Entity Framework&amp;ndash;Beta 3</title>
      <link>/contenidos/articulos/494/Driver-ORACLE-para-Entity-FrameworkndashBeta-3.aspx</link>
      <description>&lt;p&gt;ORACLE acaba de lanzar la tercera beta del driver para Entity Framework. &lt;/p&gt; &lt;p&gt;Podemos descargar la beta desde el siguiente enlace :&lt;a title="http://www.oracle.com/technetwork/topics/dotnet/downloads/oracleefbeta-302521.html" href="http://www.oracle.com/technetwork/topics/dotnet/downloads/oracleefbeta-302521.html"&gt;http://www.oracle.com/technetwork/topics/dotnet/downloads/oracleefbeta-302521.html&lt;/a&gt;&lt;/p&gt; &lt;p align="center"&gt;&lt;a href="http://devjoker.com/images/UploadFiles/Windows-Live-Writer/Driver-ORACLE-para-Entity-FrameworkBeta-_CBAB/image_2.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://devjoker.com/images/UploadFiles/Windows-Live-Writer/Driver-ORACLE-para-Entity-FrameworkBeta-_CBAB/image_thumb.png" width="614" height="467"&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;Mas información: &lt;a title="http://geeks.ms/blogs/jtorrecilla/archive/2011/10/20/oracle-oracle-lanza-la-beta-3-del-driver-para-ef.aspx" href="http://geeks.ms/blogs/jtorrecilla/archive/2011/10/20/oracle-oracle-lanza-la-beta-3-del-driver-para-ef.aspx"&gt;http://geeks.ms/blogs/jtorrecilla/archive/2011/10/20/oracle-oracle-lanza-la-beta-3-del-driver-para-ef.aspx&lt;/a&gt;&lt;/p&gt;</description>
      <guid>/contenidos/articulos/494/Driver-ORACLE-para-Entity-FrameworkndashBeta-3.aspx</guid>
      <pubDate>Thu, 20 Oct 2011 14:32:44 GMT</pubDate>
    </item>
    <item>
      <title>Fallece Steve Jobs, Fundador de Apple.</title>
      <link>/contenidos/articulos/493/Fallece-Steve-Jobs-Fundador-de-Apple.aspx</link>
      <description>&lt;p&gt;Steve Jobs, el fundador de Apple y una figura icónica que transformó los hábitos de consumo de varias generaciones con productos como el iPod, el iPhone o el iPad, falleció hoy a los 56 años de un cáncer, confirmó hoy la compañía.  &lt;p&gt;Jobs ejerció como consejero delegado de Apple hasta finales de agosto cuando renunció por no poder hacer frente a sus obligaciones y después de ocho meses de baja por motivos médicos.  &lt;p&gt;El ejecutivo había superado un tumor de páncreas en 2004 y fue visto visitando centros para pacientes de cáncer a lo largo del año, en el que se prodigó poco públicamente.  &lt;p&gt;Jobs reapareció para la presentación del iPad 2 el pasado mes de marzo, un evento en el que fue recibido con una sonora ovación y en el que apareció extremadamente delgado.  &lt;p&gt;La alta implicación de Jobs en el diseño y desarrollo de exitosos productos como los reproductores iPod o el teléfono iPhone ha generado una imagen de dependencia que ha hecho cuestionarse al mercado si Apple seguirá siendo vanguardista sin su cabeza pensante al frente.  &lt;p&gt;Descanse en paz.  &lt;p&gt;&lt;a href="http://www.devjoker.com/images/UploadFiles/WindowsLiveWriter/FalleceSteveJobsFundadordeApple_2850/image_2.png"&gt;&lt;img style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" title="image" border="0" alt="image" src="http://www.devjoker.com/images/UploadFiles/WindowsLiveWriter/FalleceSteveJobsFundadordeApple_2850/image_thumb.png" width="386" height="154"&gt;&lt;/a&gt; &lt;p align="center"&gt;&amp;nbsp; &lt;p&gt;&amp;nbsp; &lt;a href="http://devjoker.com/images/UploadFiles/Windows-Live-Writer/Fallece-Steve-Jobs-Fundador-de-Apple_A871/image_2.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://devjoker.com/images/UploadFiles/Windows-Live-Writer/Fallece-Steve-Jobs-Fundador-de-Apple_A871/image_thumb.png" width="154" height="174"&gt;&lt;/a&gt; &lt;p&gt;Fuente: &lt;a title="http://es.noticias.yahoo.com/muere-steve-jobs-fundador-apple-235510851.html" href="http://es.noticias.yahoo.com/muere-steve-jobs-fundador-apple-235510851.html"&gt;http://es.noticias.yahoo.com/muere-steve-jobs-fundador-apple-235510851.html&lt;/a&gt;&lt;/p&gt;</description>
      <guid>/contenidos/articulos/493/Fallece-Steve-Jobs-Fundador-de-Apple.aspx</guid>
      <pubDate>Tue, 11 Oct 2011 12:00:20 GMT</pubDate>
    </item>
    <item>
      <title>Hosts File Manager for IIS 7 &amp;ndash; Administra el archivo host desde el IIS 7</title>
      <link>/contenidos/articulos/492/Hosts-File-Manager-for-IIS-7-ndash-Administra-el-archivo-host-desde-el-IIS-7.aspx</link>
      <description>&lt;p&gt;Cuando estamos desarrollando aplicaciones web es bastante habitual modificar el archivo host – ubicado en %windir%\System32\drivers\etc – para asignar una dirección IP a una URL concreta, de forma que al navegador utilizará la dirección IP definida en este archivo en vez de lanzar una consulta al servidor DNS. De este modo simulamos la navegación por internet en nuestro servidor local o de red.&lt;/p&gt; &lt;p&gt;Con la llegada de las últimas versiones de windows – Vista y Windows 7 – y el control de acceso a los directorios de sistema, realizar esta acción es bastante mas incomoda, ya que tenemos que abrir un editor de texto en modo administración y abrir el archivo.&lt;/p&gt; &lt;p&gt;Sin embargo, existe Host File Manager, una aplicación gratuita que podemos obtener desde &lt;a href="http://www.codeplex.com"&gt;codeplex&lt;/a&gt;: &lt;a href="http://iishosts.codeplex.com/"&gt;http://iishosts.codeplex.com/&lt;/a&gt;, y con la que podremos realizar esta tediosa tarea directamente desde el administrador de IIS. &lt;/p&gt; &lt;p&gt;Una vez instalado, accedemos a la consola de administración de IIS, y dentro de la categoría principal aparece un nuevo elemento - “Manage Local Hosts”, como podemos ver en la imagen.&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p align="center"&gt;&lt;a href="http://www.devjoker.com/images/UploadFiles/WindowsLiveWriter/HostsFileManagerforIIS7Administraelarchi_14963/image_8.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://www.devjoker.com/images/UploadFiles/WindowsLiveWriter/HostsFileManagerforIIS7Administraelarchi_14963/image_thumb_3.png" width="541" height="371"&gt;&lt;/a&gt; &lt;/p&gt; &lt;p align="left"&gt;Una vez que accedamos a la opción podemos editar las entradas del archivo host cómodamente, pudiendo añadir, modificar, eliminar e incluso editar con el bloc de notas.&lt;/p&gt; &lt;p align="center"&gt;&lt;img title="iishostsfile-r1.png" alt="iishostsfile-r1.png" src="http://i3.codeplex.com/Download?ProjectName=iishosts&amp;amp;DownloadId=81240" width="547" height="342"&gt;&lt;/p&gt; &lt;p&gt;&lt;/p&gt; &lt;p&gt;&lt;/p&gt; &lt;p&gt;&lt;/p&gt; &lt;p&gt;&lt;/p&gt; &lt;p&gt;Como curiosidad añadir que el listado muestra TODAS las entradas del archivo host, aunque estén comentadas, pero en este caso la entrada aparece en un color mas claro para identificarlo.&lt;/p&gt; &lt;p&gt;Saludos, DJK&lt;/p&gt;</description>
      <guid>/contenidos/articulos/492/Hosts-File-Manager-for-IIS-7-ndash-Administra-el-archivo-host-desde-el-IIS-7.aspx</guid>
      <pubDate>Wed, 05 Oct 2011 23:26:08 GMT</pubDate>
    </item>
    <item>
      <title>El proyecto Porche. De Fuckowski a la incre&amp;iacute;ble realidad.</title>
      <link>/contenidos/articulos/491/El-proyecto-Porche-De-Fuckowski-a-la-increiacuteble-realidad.aspx</link>
      <description>&lt;p&gt;Cuando Fuckowski nos hablo del "proyecto Porche" - &lt;a href="http://www.perspicalia.com/post/proyecto-bicicleta"&gt;http://www.perspicalia.com/post/proyecto-bicicleta&lt;/a&gt; - nadie creímos que fuera posible hacerlo realidad ... pero la realidad supera a la ficción.&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;div style="padding-bottom: 0px; padding-left: 0px; width: 425px; padding-right: 0px; display: block; float: none; margin-left: auto; margin-right: auto; padding-top: 0px" id="scid:5737277B-5D6D-4f48-ABFC-DD9C333F4C5D:5171438c-380e-4284-bde8-31cbc44c1e27" class="wlWriterEditableSmartContent"&gt;&lt;div id="21818bb8-84c5-45a2-a6cf-c8d73cc3b1ef" style="margin: 0px; padding: 0px; display: inline;"&gt;&lt;div&gt;&lt;a href="http://www.youtube.com/watch?v=QOFWAhXZeqM" target="_new"&gt;&lt;img src="http://www.devjoker.com/images/UploadFiles/WindowsLiveWriter/ElproyectoPorche.DeFuckowskialaincreble_1286A/videod06a8e830675.jpg" style="border-style: none" galleryimg="no" onload="var downlevelDiv = document.getElementById('21818bb8-84c5-45a2-a6cf-c8d73cc3b1ef'); downlevelDiv.innerHTML = &amp;quot;&amp;lt;div&amp;gt;&amp;lt;object width=\&amp;quot;425\&amp;quot; height=\&amp;quot;355\&amp;quot;&amp;gt;&amp;lt;param name=\&amp;quot;movie\&amp;quot; value=\&amp;quot;http://www.youtube.com/v/QOFWAhXZeqM&amp;amp;hl=en\&amp;quot;&amp;gt;&amp;lt;\/param&amp;gt;&amp;lt;embed src=\&amp;quot;http://www.youtube.com/v/QOFWAhXZeqM&amp;amp;hl=en\&amp;quot; type=\&amp;quot;application/x-shockwave-flash\&amp;quot; width=\&amp;quot;425\&amp;quot; height=\&amp;quot;355\&amp;quot;&amp;gt;&amp;lt;\/embed&amp;gt;&amp;lt;\/object&amp;gt;&amp;lt;\/div&amp;gt;&amp;quot;;" alt=""&gt;&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;</description>
      <guid>/contenidos/articulos/491/El-proyecto-Porche-De-Fuckowski-a-la-increiacuteble-realidad.aspx</guid>
      <pubDate>Tue, 27 Sep 2011 21:05:39 GMT</pubDate>
    </item>
    <item>
      <title>Driver ORACLE para Entity Framework y LinQ To Entities &amp;ndash; Beta 2</title>
      <link>/contenidos/articulos/490/Driver-ORACLE-para-Entity-Framework-y-LinQ-To-Entities-ndash-Beta-2.aspx</link>
      <description>&lt;p&gt;En febrero de este año os informábamos desde &lt;a href="www.devjoker.com" target="_blank"&gt;devjoker.com&lt;/a&gt; del lanzamiento de la primera beta del driver de ORACLE para &lt;a href="http://www.devjoker.com/contenidos/catss/422/Tutorial-r%C3%A1pido-de-Entity-Framework-y-Linq-To-Entities.aspx" target="_blank"&gt;Entity Framework&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;A través de &lt;a href="http://geeks.ms/" target="_blank"&gt;geeks.ms&lt;/a&gt; he recibido la excelente noticia de que el ORACLE acaba de lanzar la beta 2, y que para finales de este mismo año podremos tener la relase definitiva.&lt;/p&gt; &lt;p&gt;Personalmente es una de las noticias que más esperaba, ya que &lt;a href="http://devjoker.com/contenidos/Articulos/480/ADONET-Entity-Framework-40.aspx" target="_blank"&gt;Entity Framework&lt;/a&gt; se ha convertido en una herramienta de uso obligado en todos mis desarrollos. (Y además me sirve como excusa para este post, que tengo la web un poco abandonada ultimamente!)&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p align="center"&gt;&lt;a href="http://www.devjoker.com/images/UploadFiles/WindowsLiveWriter/DriverORACLEparaEntityFrameworkyLinQToEn_10402/image_2.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://www.devjoker.com/images/UploadFiles/WindowsLiveWriter/DriverORACLEparaEntityFrameworkyLinQToEn_10402/image_thumb.png" width="553" height="464"&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;Aquí tenéis el enlace de la descarga: &lt;a href="http://www.oracle.com/technetwork/topics/dotnet/downloads/oracleefbeta-302521.html"&gt;http://www.oracle.com/technetwork/topics/dotnet/downloads/oracleefbeta-302521.html&lt;/a&gt;&lt;/p&gt; &lt;p&gt;Un poquito más de información sobre el tema: &lt;a href="http://geeks.ms/blogs/jtorrecilla/archive/2011/07/05/beta-2-driver-oracle-para-ef-y-linq.aspx"&gt;http://geeks.ms/blogs/jtorrecilla/archive/2011/07/05/beta-2-driver-oracle-para-ef-y-linq.aspx&lt;/a&gt;&lt;/p&gt; &lt;p&gt;Saludos y hasta la próxima, &lt;/p&gt; &lt;p&gt;DJK&lt;/p&gt;</description>
      <guid>/contenidos/articulos/490/Driver-ORACLE-para-Entity-Framework-y-LinQ-To-Entities-ndash-Beta-2.aspx</guid>
      <pubDate>Wed, 28 Sep 2011 16:10:07 GMT</pubDate>
    </item>
  </channel>
</rss>

