www.Devjoker.com http://www.devjoker.com/asp/feeds.aspx Web dedicada a la informatica y programación en general, .NET en particular. es-ES JuiceUI, integraci&oacute;n de jQuery UI con ASP.NET Web Forms. /contenidos/articulos/512/JuiceUI-integracioacuten-de-jQuery-UI-con-ASPNET-Web-Forms.aspx <p>Ahora que todo el mundo habla de ASP.NET MVC, se agradece ver que web forms no está muerto (ni mucho menos!) y que surgen interesantimos proyectos como <a href="http://juiceui.com/">JuiceUI</a> que nos permite integrar <a href="http://jqueryui.com/">jQueryUI</a> en nuestros desarrollos ASP.NET WebForms de una manera fácil y sencilla.</p> <p><a href="http://juiceui.com/">JuiceUI</a> es una collección de controles ASP.NET que se encargan de introducir los elementos comunes de <a href="http://jqueryui.com/">jQueryUI</a> en nuestras aplicaciones. Los controles incluidos son de momento:</p> <ul> <li>Accordion:<a title="http://juiceui.com/controls/accordion" href="http://juiceui.com/controls/accordion">http://juiceui.com/controls/accordion</a></li> <li>Autocomple:<a title="http://juiceui.com/controls/autocomplete" href="http://juiceui.com/controls/autocomplete">http://juiceui.com/controls/autocomplete</a></li> <li>Button: <a title="http://juiceui.com/controls/button" href="http://juiceui.com/controls/button">http://juiceui.com/controls/button</a></li> <li>Datepicker:<a title="http://juiceui.com/controls/datepicker" href="http://juiceui.com/controls/datepicker">http://juiceui.com/controls/datepicker</a></li> <li>Dialog:<a title="http://juiceui.com/controls/dialog" href="http://juiceui.com/controls/dialog">http://juiceui.com/controls/dialog</a></li> <li>Draggable:</li> <li>Droppable:<a title="http://juiceui.com/controls/droppable" href="http://juiceui.com/controls/droppable">http://juiceui.com/controls/droppable</a></li> <li>Position:<a title="http://juiceui.com/controls/position" href="http://juiceui.com/controls/position">http://juiceui.com/controls/position</a></li> <li>Progressbar: <a href="http://juiceui.com/controls/progressbar">http://juiceui.com/controls/progressbar</a></li> <li>Resizable: <a href="http://juiceui.com/controls/resizable">http://juiceui.com/controls/resizable</a></li> <li>Selectable: <a title="http://juiceui.com/controls/selectable" href="http://juiceui.com/controls/selectable">http://juiceui.com/controls/selectable</a></li> <li>Slider: <a title="http://juiceui.com/controls/slider" href="http://juiceui.com/controls/slider">http://juiceui.com/controls/slider</a></li> <li>Sortable: <a title="http://juiceui.com/controls/sortable" href="http://juiceui.com/controls/sortable">http://juiceui.com/controls/sortable</a></li> <li>Tabs: <a href="http://juiceui.com/controls/tabs">http://juiceui.com/controls/tabs</a></li></ul> <p>Si has integrado anteriormente jQuery UI con ASP.NET WebForms veras la cantidad de trabajo que esta librería puede llegar a ahorrarnos. </p> <p>Se distribuye bajo licencia <a href="http://juiceui.com/license">MIT GPL</a> y dispone de su propio package de <a href="http://nuget.org/packages/JuiceUI">nuGet</a> para que lo instalemos fácilmente desde VS2010. No hay excusa para no usarlo.</p> <p><a href="http://www.devjoker.com/images/UploadFiles/WindowsLiveWriter/JuiceUIintegracindejQueryUIconASP.NETWe_9C83/image_2.png"><img style="border-bottom: 0px; border-left: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px" title="image" border="0" alt="image" src="http://www.devjoker.com/images/UploadFiles/WindowsLiveWriter/JuiceUIintegracindejQueryUIconASP.NETWe_9C83/image_thumb.png" width="452" height="269"></a> </p> <p>Saludos, </p> <p>DJK!</p> /contenidos/articulos/512/JuiceUI-integracioacuten-de-jQuery-UI-con-ASPNET-Web-Forms.aspx Wed, 21 Mar 2012 11:10:26 GMT Recursos de desarrollo para Silverlight(II) /contenidos/articulos/511/Recursos-de-desarrollo-para-SilverlightII.aspx <p>El problema de la grandísima cantidad de información y recursos que podemos encontrar en internet sobre cualquier tema es que cuando uno necesita un punto de entrada realmente no sabe por donde empezar. Pero si el tema en cuestión es algún lenguaje o entorno de programación la tarea de encontrar un «punto por donde empezar» es tarea de locos.</p> <p>Debido a esto resulta muy útil disponer de algún tipo de recopilación de recursos como la que publicamos hace unas semanas en <a href="http://devjoker.com">devjoker.com</a>, <a href="http://devjoker.com/contenidos/Articulos/504/Recursos-de-desarrollo-para-Silverlight.aspx">recursos de desarrollo para Silvelight</a></p> <p>Hoy quería añadir este otro enlace – <a href="http://samples.msdn.microsoft.com/Silverlight/SampleBrowser/index.htm">http://samples.msdn.microsoft.com/Silverlight/SampleBrowser/index.htm</a>, una autentica navaja suiza de recursos, con animaciones, bindins, controles, etc ...</p> <p align="center"><a href="http://www.devjoker.com/images/UploadFiles/WindowsLiveWriter/RecursosdedesarrolloparaSilverlightII_FE6/image_2.png"><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/RecursosdedesarrolloparaSilverlightII_FE6/image_thumb.png" width="244" height="201"></a> </p> <p></p> <p>Saludos, </p> <p>DJK</p> /contenidos/articulos/511/Recursos-de-desarrollo-para-SilverlightII.aspx Sat, 10 Mar 2012 20:43:40 GMT Windows 8 Consumer Preview /contenidos/articulos/510/Windows-8-Consumer-Preview.aspx <p>Ya está disponible para descarga Windows 8 Consumer Preview, podemos realizar la descarga desde el siguiente enlace: <a title="http://windows.microsoft.com/en-US/windows-8/download" href="http://windows.microsoft.com/en-US/windows-8/download">http://windows.microsoft.com/en-US/windows-8/download</a>, o directamente desde este otro para descargar la imagen ISO - <a href="http://windows.microsoft.com/en-US/windows-8/iso">http://windows.microsoft.com/en-US/windows-8/iso</a>.</p> <p><a href="http://devjoker.com/images/UploadFiles/Windows-Live-Writer/f57eab718bd1_ED46/image_2.png"><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/f57eab718bd1_ED46/image_thumb.png" width="474" height="104"></a></p> <p>Saludos, </p> <p>DJK</p> /contenidos/articulos/510/Windows-8-Consumer-Preview.aspx Wed, 29 Feb 2012 17:09:30 GMT MAP 2012 - MAP (Microsoft Active Professional) /contenidos/articulos/509/MAP-2012--MAP-Microsoft-Active-Professional.aspx <p>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. </p> <blockquote> <p><em>Microsoft Active Professional (MAP) es una distinción otorgada a no más del <strong>5% de los Profesionales de IT </strong>cuya dedicación durante el último año sobresalió sobre el resto de sus colegas.&nbsp; Reconoce el tiempo y esfuerzo que dichos profesionales invirtieron en <strong>mantenerse actualizados y capacitarse en tecnologías Microsoft</strong>, demostrando su esmero por estar <strong>siempre en contacto con los últimos avances de nuestra tecnología</strong>. </em></p></blockquote> <a href="http://devjoker.com/images/UploadFiles/Windows-Live-Writer/bc09a66052f8_C28F/image_4.png"><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"></a> <p>Este reconocimiento es para mí una inmensa alegría que quiero compartir con vosotros,&nbsp; y una motivación para seguir intentando mejorar cada día.</p> <p>Saludos, DJK!</p> /contenidos/articulos/509/MAP-2012--MAP-Microsoft-Active-Professional.aspx Fri, 24 Feb 2012 14:06:22 GMT Tempo.js, motor de renderizaci&oacute;n de plantillas HTML con JSON. Ejemplo con ASP.NET /contenidos/articulos/508/Tempojs-motor-de-renderizacioacuten-de-plantillas-HTML-con-JSON-Ejemplo-con-ASPNET.aspx <p>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.</p> <p>Vamos a verlo con un ejemplo. Para serializar objetos .NET a JSON vamos a utilizar la librería <a href="http://devjoker.com/contenidos/Articulos/505/JSONNET-Mejorando-la-serializacioacuten-JSON-con-NET.aspx">JSON.NET</a>., <a href="http://jquery.com/">jQuery</a> como librería Ajax y <a href="http://tempojs.com/">Tempo.js</a> para las plantillas HTML.</p> <p>Realizamos los siguientes pasos:</p> <ul> <li>Con Visual Studio 2010 creamos un nuevo sitio web. Añadimos una página aspx, Home.aspx.</li> <li>Añadimos la referencias a jQuery y JSON.NET, preferiblemente utilizando <a href="http://nuget.org/">nuget</a>.</li> <li>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.</li></ul> <p>Para poder realizar nuestro ejemplo lo primero es, sobre App_Code, crear una clase persona , que será el objeto que devolveremos en JSON.</p><pre class="code"><span style="color: blue">using </span>System; <span style="color: blue">using </span>System.Collections.Generic; <span style="color: blue">using </span>System.Linq; <span style="color: blue">using </span>System.Web; <span style="color: blue">public class </span><span style="color: #2b91af">Persona </span>{ <span style="color: blue">public </span>Persona(<span style="color: blue">string </span>nombre, <span style="color: blue">string </span>apellidos, <span style="color: #2b91af">DateTime </span>fechaNacimiento) { Id = <span style="color: #2b91af">Guid</span>.NewGuid(); Nombre = nombre; Apellidos = apellidos; FechaNacimiento = fechaNacimiento; } <span style="color: blue">public </span><span style="color: #2b91af">Guid </span>Id { <span style="color: blue">get</span>; <span style="color: blue">set</span>; } <span style="color: blue">public string </span>Nombre { <span style="color: blue">get</span>; <span style="color: blue">set</span>; } <span style="color: blue">public string </span>Apellidos { <span style="color: blue">get</span>; <span style="color: blue">set</span>; } <span style="color: blue">public </span><span style="color: #2b91af">DateTime </span>FechaNacimiento { <span style="color: blue">get</span>; <span style="color: blue">set</span>; } } </pre>La clase es sencilla, pero hemos incluido un campo DateTime que nos va a dar problemas. Lo hemos hecho a proposito para ilustrar&nbsp; el modo de trabajar con fechas en JSON … <p>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</p><pre class="code"><span style="background: yellow">&lt;%</span><span style="color: blue">@ </span><span style="color: maroon">WebHandler </span><span style="color: red">Language</span><span style="color: blue">="C#" </span><span style="color: red">Class</span><span style="color: blue">="PersonasDataHandler" </span><span style="background: yellow">%&gt; </span><span style="color: blue">using </span>System; <span style="color: blue">using </span>System.Web; <span style="color: blue">using </span>System.Collections.Generic; <span style="color: blue">public class </span><span style="color: #2b91af">PersonasDataHandler </span>: <span style="color: #2b91af">IHttpHandler </span>{ <span style="color: blue">public void </span>ProcessRequest (<span style="color: #2b91af">HttpContext </span>context) { context.Response.ContentType = <span style="color: #a31515">"application/json"</span>; <span style="color: blue">var </span>personas = <span style="color: blue">new </span><span style="color: #2b91af">List</span>&lt;<span style="color: #2b91af">Persona</span>&gt;(); <span style="color: blue">for </span>(<span style="color: blue">int </span>i = 0; i &lt; 500; i++) { personas.Add(<span style="color: blue">new </span><span style="color: #2b91af">Persona</span>(<span style="color: #a31515">"Nombre " </span>+ i, <span style="color: #a31515">"Apellido " </span>+ i, <span style="color: #2b91af">DateTime</span>.Now.AddDays(i*(-1)))); } <span style="color: blue">var </span>json = Newtonsoft.Json.<span style="color: #2b91af">JsonConvert</span>.<strong>SerializeObject</strong>(personas, <br> <span style="color: blue">new </span><span style="color: #2b91af"><strong>CultureDateTimeConverter</strong></span>(CurrentCulture)); context.Response.Write(json); } <span style="color: blue">public </span>System.Globalization.<span style="color: #2b91af">CultureInfo </span>CurrentCulture { <span style="color: blue">get </span>{ <span style="color: blue">return </span>System.Threading.<span style="color: #2b91af">Thread</span>.CurrentThread.CurrentUICulture; } } <span style="color: blue">public bool </span>IsReusable { <span style="color: blue">get </span>{ <span style="color: blue">return false</span>; } } } </pre> <p>Fijémonos en que a la hora de serializar la colección de personas, utilizamos una de las sobrecargas del método <em>SerializeObject</em>, pasándole un converter que va a indicar al serializador como deben serializarse las fechas. </p> <p>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 <em>DateTimeConverterBase</em>). Si queremos saber mas sobre este problema recomiendo el siguiente enlace :<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">http://james.newtonking.com/archive/2009/02/20/good-date-times-with-json-net.aspx</a> del propio James Newton-King (autor de JSON.NET)</p> <p>Personalmente opino que&nbsp; siempre que sea posible, deberíamos enviar el dato como texto al navegador ¿porque? por simplicidad (<a href="http://es.wikipedia.org/wiki/Principio_KISS">principio KISS</a>). Bueno, dicho esto creamos un converter especifico para nuestras intenciones, permitimos modificar el formato de salida a través de un objeto <em>CultureInfo. </em>Al igual que hicimos con <em>Persona</em>,crearemos las clase sobre App_Code.</p><pre class="code"><span style="color: blue">using </span>System; <span style="color: blue">using </span>System.Collections.Generic; <span style="color: blue">using </span>System.Linq; <span style="color: blue">using </span>System.Web; <span style="color: blue">using </span>Newtonsoft.Json.Converters; <span style="color: blue">using </span>System.Globalization; <span style="color: blue">public class </span><span style="color: #2b91af">CultureDateTimeConverter </span>: <span style="color: #2b91af">DateTimeConverterBase </span>{ <span style="color: #2b91af">CultureInfo </span>_culture = <span style="color: blue">null</span>; <span style="color: blue">public </span>CultureDateTimeConverter(<span style="color: #2b91af">CultureInfo </span>culture) { _culture = culture; } <span style="color: blue">public override object </span>ReadJson<br> (Newtonsoft.Json.<span style="color: #2b91af">JsonReader </span>reader, <span style="color: #2b91af">Type </span>objectType, <span style="color: blue">object </span>existingValue, Newtonsoft.Json.<span style="color: #2b91af">JsonSerializer </span>serializer) { <span style="color: blue">throw new </span><span style="color: #2b91af">NotImplementedException</span>(); } <span style="color: blue">public override void </span>WriteJson<br> (Newtonsoft.Json.<span style="color: #2b91af">JsonWriter </span>writer, <span style="color: blue">object </span>value, Newtonsoft.Json.<span style="color: #2b91af">JsonSerializer </span>serializer) { <span style="color: blue">string </span>dateStringValue=<span style="color: #a31515">""</span>; <span style="color: blue">if </span>(value <span style="color: blue">is </span><span style="color: #2b91af">DateTime</span>) { <span style="color: #2b91af">DateTime </span>dateTime = (<span style="color: #2b91af">DateTime</span>)value; <span style="color: #2b91af">DateTime </span>utcDateTime = dateTime.ToUniversalTime(); dateStringValue = dateTime.ToString(_culture); } <span style="color: blue">else </span>{ <span style="color: blue">if </span>(value <span style="color: blue">is </span><span style="color: #2b91af">DateTimeOffset</span>) { <span style="color: #2b91af">DateTimeOffset </span>dateTimeOffset = (<span style="color: #2b91af">DateTimeOffset</span>)value; <span style="color: #2b91af">DateTimeOffset </span>utcDateTimeOffset = dateTimeOffset.ToUniversalTime(); dateStringValue = dateTimeOffset.ToString(_culture); } <span style="color: blue">throw new </span><span style="color: #2b91af">Exception</span>(<span style="color: #a31515">"Expected date object value."</span>); } writer.WriteValue(dateStringValue ); } } </pre> <p>Dejamos el método <em>ReadJson</em> como no implementado, ya que no lo necesitamos (¿segregación de interfaces?si).</p> <p>Bien, ahora que ya tenemos todos los elementos solo nos falta la página.</p><pre class="code"><span style="background: yellow">&lt;%</span><span style="color: blue">@ </span><span style="color: maroon">Page </span><span style="color: red">Language</span><span style="color: blue">="C#" </span><span style="color: red">AutoEventWireup</span><span style="color: blue">="true" </span><span style="color: red">CodeFile</span><span style="color: blue">="Home.aspx.cs" </span><span style="color: red">Inherits</span><span style="color: blue">="Home" </span><span style="background: yellow">%&gt; </span><span style="color: blue">&lt;!</span><span style="color: maroon">DOCTYPE </span><span style="color: red">html </span><span style="color: blue">&gt; &lt;</span><span style="color: maroon">html</span><span style="color: blue">&gt; &lt;</span><span style="color: maroon">head </span><span style="color: red">runat</span><span style="color: blue">="server"&gt; &lt;</span><span style="color: maroon">title</span><span style="color: blue">&gt;&lt;/</span><span style="color: maroon">title</span><span style="color: blue">&gt; &lt;</span><span style="color: maroon">style </span><span style="color: red">type</span><span style="color: blue">="text/css"&gt; </span><span style="color: maroon">.hidden </span>{ <span style="color: red">display</span>: <span style="color: blue">none</span>; } <span style="color: blue">&lt;/</span><span style="color: maroon">style</span><span style="color: blue">&gt; &lt;</span><span style="color: maroon">script </span><span style="color: red">src</span><span style="color: blue">="Scripts/jquery-1.4.1.min.js" </span><span style="color: red">type</span><span style="color: blue">="text/javascript"&gt;&lt;/</span><span style="color: maroon">script</span><span style="color: blue">&gt; &lt;</span><span style="color: maroon">script </span><span style="color: red">src</span><span style="color: blue">="Scripts/tempo.min.js" </span><span style="color: red">type</span><span style="color: blue">="text/javascript"&gt;&lt;/</span><span style="color: maroon">script</span><span style="color: blue">&gt; &lt;</span><span style="color: maroon">script </span><span style="color: red">type</span><span style="color: blue">="text/javascript"&gt; </span>$(document).ready(<span style="color: blue">function </span>() { <span style="color: blue">var </span>url = <span style="color: maroon">'</span><span style="background: yellow; color: maroon">&lt;%</span><span style="color: maroon">:VirtualPathUtility.ToAbsolute("~/Handlers/PersonasDataHandler.ashx") </span><span style="background: yellow; color: maroon">%&gt;</span><span style="color: maroon">'</span>; $.getJSON(url, <span style="color: blue">function </span>(jsonData) { Tempo.prepare(<span style="color: maroon">"template"</span>).render(jsonData); $(<span style="color: maroon">"#template"</span>).removeClass(<span style="color: maroon">"hidden"</span>); }); }); <span style="color: blue">&lt;/</span><span style="color: maroon">script</span><span style="color: blue">&gt; &lt;/</span><span style="color: maroon">head</span><span style="color: blue">&gt; &lt;</span><span style="color: maroon">body</span><span style="color: blue">&gt; &lt;</span><span style="color: maroon">form </span><span style="color: red">id</span><span style="color: blue">="form1" </span><span style="color: red">runat</span><span style="color: blue">="server"&gt; &lt;</span><span style="color: maroon">div</span><span style="color: blue">&gt; &lt;</span><span style="color: maroon">ol </span><span style="color: red">id</span><span style="color: blue">="template" </span><span style="color: red">class</span><span style="color: blue">="hidden"&gt; &lt;</span><span style="color: maroon">li </span><span style="color: red">data-template</span><span style="color: blue">&gt; &lt;</span><span style="color: maroon">h3</span><span style="color: blue">&gt; </span>{{Id}}<span style="color: blue">&lt;/</span><span style="color: maroon">h3</span><span style="color: blue">&gt; &lt;</span><span style="color: maroon">p</span><span style="color: blue">&gt; </span>{{Nombre}}, {{Apellidos|truncate 25}}<span style="color: blue">&lt;/</span><span style="color: maroon">p</span><span style="color: blue">&gt; &lt;</span><span style="color: maroon">p</span><span style="color: blue">&gt; </span>nacido el {{FechaNacimiento}}<span style="color: blue">&lt;/</span><span style="color: maroon">p</span><span style="color: blue">&gt; &lt;/</span><span style="color: maroon">li</span><span style="color: blue">&gt; &lt;</span><span style="color: maroon">li </span><span style="color: red">data-template-fallback</span><span style="color: blue">&gt; </span>Error, Javascript necesario para visualizar la página!<span style="color: blue">&lt;/</span><span style="color: maroon">li</span><span style="color: blue">&gt; &lt;/</span><span style="color: maroon">ol</span><span style="color: blue">&gt; &lt;/</span><span style="color: maroon">div</span><span style="color: blue">&gt; &lt;/</span><span style="color: maroon">form</span><span style="color: blue">&gt; &lt;/</span><span style="color: maroon">body</span><span style="color: blue">&gt; &lt;/</span><span style="color: maroon">html</span><span style="color: blue">&gt; </span></pre> <p>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 - <a href="http://tempojs.com/#html">http://tempojs.com/#html</a> - y que va a sustituir los datos obtenidos del servidor.</p><pre class="code"><span style="color: blue">&lt;</span><span style="color: maroon">ol </span><span style="color: red">id</span><span style="color: blue">="template" </span><span style="color: red">class</span><span style="color: blue">="hidden"&gt; &lt;</span><span style="color: maroon">li </span><span style="color: red">data-template</span><span style="color: blue">&gt; &lt;</span><span style="color: maroon">h3</span><span style="color: blue">&gt; </span>{{Id}}<span style="color: blue">&lt;/</span><span style="color: maroon">h3</span><span style="color: blue">&gt; &lt;</span><span style="color: maroon">p</span><span style="color: blue">&gt; </span>{{Nombre}}, {{Apellidos|truncate 25}}<span style="color: blue">&lt;/</span><span style="color: maroon">p</span><span style="color: blue">&gt; &lt;</span><span style="color: maroon">p</span><span style="color: blue">&gt; </span>nacido el {{FechaNacimiento}}<span style="color: blue">&lt;/</span><span style="color: maroon">p</span><span style="color: blue">&gt; &lt;/</span><span style="color: maroon">li</span><span style="color: blue">&gt; &lt;</span><span style="color: maroon">li </span><span style="color: red">data-template-fallback</span><span style="color: blue">&gt; </span>Error, Javascript necesario para visualizar la página!<span style="color: blue">&lt;/</span><span style="color: maroon">li</span><span style="color: blue">&gt; &lt;/</span><span style="color: maroon">ol</span><span style="color: blue">&gt; </span></pre> <p>Fijémonos en la marca de <em>{{Apellidos}}, </em>posee un marcado especial <em>truncate</em> 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 – <a title="http://tempojs.com/#filter-functions" href="http://tempojs.com/#filter-functions">http://tempojs.com/#filter-functions</a></p> <p>Tempo.js también nos permite anidar plantillar, plantillar condicionales,&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. <a href="http://tempojs.com/">http://tempojs.com/</a> </p> <p>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.</p><pre class="code"><span style="color: blue">&lt;</span><span style="color: maroon">script </span><span style="color: red">type</span><span style="color: blue">="text/javascript"&gt; </span>$(document).ready(<span style="color: blue">function </span>() { <span style="color: blue">var </span>url = <span style="color: maroon">'</span><span style="background: yellow; color: maroon">&lt;%</span><span style="color: maroon">:VirtualPathUtility.ToAbsolute("~/Handlers/PersonasDataHandler.ashx") </span><span style="background: yellow; color: maroon">%&gt;</span><span style="color: maroon">'</span>; $.getJSON(url, <span style="color: blue">function </span>(jsonData) { Tempo.prepare(<span style="color: maroon">"template"</span>).render(jsonData); $(<span style="color: maroon">"#template"</span>).removeClass(<span style="color: maroon">"hidden"</span>); }); }); <span style="color: blue">&lt;/</span><span style="color: maroon">script</span><span style="color: blue">&gt; </span></pre> <p>Activar Tempo.js es muy sencillo, solo debemos llamar al método prepare y posteriormente renderizar los datos.</p><pre class="code">Tempo.prepare(<span style="color: maroon">"template"</span>).render(jsonData);</pre> <p>El programa en ejecucion queda de la siguiente forma … Bonito lo que se dice bonito no lo hemos hecho … pero …</p> <p><a href="http://devjoker.com/images/UploadFiles/Windows-Live-Writer/Tempo.js-motor-de-renderizacin-de-JSON_A691/image_2.png"><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"></a><br>Como ya hicimos en el post anterior hemos subido el código a SkyDrive para que podáis descargarlo. Este es el enlace: <a href="https://skydrive.live.com/#cid=20A9C248301397B3&amp;id=20A9C248301397B3%21143">https://skydrive.live.com/#cid=20A9C248301397B3&amp;id=20A9C248301397B3%21143</a></p> <p><br>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.</p> <p>Saludos, </p> <p>DJK!</p> /contenidos/articulos/508/Tempojs-motor-de-renderizacioacuten-de-plantillas-HTML-con-JSON-Ejemplo-con-ASPNET.aspx Wed, 22 Feb 2012 14:38:40 GMT Saeed Malekpour, un programador web condenado a la pena de muerte /contenidos/articulos/507/Saeed-Malekpour-un-programador-web-condenado-a-la-pena-de-muerte.aspx <p><a href="http://devjoker.com/images/UploadFiles/Windows-Live-Writer/6bd8669b23d5_95C6/image_2.png"><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"></a> <p>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 <strong>ManolitoP2P o Megaupload</strong>. 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. <p><strong>Saeed Malekpour</strong> 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.<br>Este programador de <strong>36 años de edad</strong>, 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. <p>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 <strong>la libertad de Saeed Malekpour - </strong><a href="http://freesaeedmalekpour.wordpress.com/">http://freesaeedmalekpour.wordpress.com/</a>. <p>Copiado de:<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">http://www.genbetadev.com/actualidad/saeed-malekpour-un-programador-web-condenado-a-la-pena-de-muerte</a> /contenidos/articulos/507/Saeed-Malekpour-un-programador-web-condenado-a-la-pena-de-muerte.aspx Mon, 20 Feb 2012 10:40:02 GMT Como mejorar la usabilidad de un listado maestro-detalle con jQuery y Ajax /contenidos/articulos/506/Como-mejorar-la-usabilidad-de-un-listado-maestro-detalle-con-jQuery-y-Ajax.aspx <p>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.&nbsp; </p> <p>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.</p> <p>Para realizar el ejemplo debemos crear un proyecto de tipo WebSite que estará compuesto por los siguientes elementos:</p> <ul> <li>Dos WebForms,<em> Default.aspx</em> y<em> page2.aspx</em>. Son las páginas del listado y el detalle. <li>Una hoja de estilo, <em>site.css</em>. <li>Tres imágenes, que por simplicidad deben llamarse: logo1.jpg, logo2.jpg y logo3.jpg.</li></ul> <p>Por supuesto debemos añadir la referencia a <a href="http://jquery.com/">jQuery</a> con <a href="http://nuget.org/">nuGet</a>. El proyecto debería parecerse a esto …</p> <p><a href="http://devjoker.com/images/UploadFiles/Windows-Live-Writer/Detalle-de-un-listado-con-jQuery_C08E/image_8.png"><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"></a></p> <p>Empezaremos por lo más fácil, el contenido del archivo <em>site.css</em>, es el siguiente:</p><pre class="code"><span style="color: maroon">.red</span>{<span style="color: red">color</span>:<span style="color: blue">red</span>} <span style="color: maroon">.content</span>{<span style="color: red">display</span>:<span style="color: blue">none</span>} <span style="color: maroon">table</span>, <span style="color: maroon">th</span>, <span style="color: maroon">td </span>{<span style="color: red">border</span>:<span style="color: blue">1px groove grey </span>} <span style="color: maroon">.table-content</span>{<span style="color: red">width</span>:<span style="color: blue">750px </span>} <span style="color: maroon">.logo</span>{<span style="color: red">float</span>:<span style="color: blue">left</span>} <span style="color: maroon">.logo-text</span>{} </pre> <p>Ahora vamos a la primera página <em>Default.aspx</em>, es la página que muestra el listado</p><pre class="code"><span style="background: yellow">&lt;%</span><span style="color: blue">@ </span><span style="color: maroon">Page </span><span style="color: red">Language</span><span style="color: blue">="C#" </span><span style="color: red">AutoEventWireup</span><span style="color: blue">="true" </span><span style="color: red">CodeFile</span><span style="color: blue">="Default.aspx.cs" </span><span style="color: red">Inherits</span><span style="color: blue">="_Default" </span><span style="background: yellow">%&gt; </span><span style="color: blue">&lt;!</span><span style="color: maroon">DOCTYPE </span><span style="color: red">html </span><span style="color: blue">&gt; &lt;</span><span style="color: maroon">html </span><span style="color: red">lang</span><span style="color: blue">="es"&gt; &lt;</span><span style="color: maroon">head </span><span style="color: red">runat</span><span style="color: blue">="server"&gt; &lt;</span><span style="color: maroon">title</span><span style="color: blue">&gt;&lt;/</span><span style="color: maroon">title</span><span style="color: blue">&gt; &lt;</span><span style="color: maroon">script </span><span style="color: red">src</span><span style="color: blue">="Scripts/jquery-1.7.1.min.js" </span><span style="color: red">type</span><span style="color: blue">="text/javascript"&gt;&lt;/</span><span style="color: maroon">script</span><span style="color: blue">&gt; &lt;</span><span style="color: maroon">link </span><span style="color: red">rel</span><span style="color: blue">="stylesheet" </span><span style="color: red">type</span><span style="color: blue">="text/css" </span><span style="color: red">href</span><span style="color: blue">="css/site.css" /&gt; </span><span style="color: #006400">&lt;!--Aqui pondremos el script que veremos mas adelante--&gt; </span><span style="color: blue">&lt;/</span><span style="color: maroon">head</span><span style="color: blue">&gt; &lt;</span><span style="color: maroon">body</span><span style="color: blue">&gt; &lt;</span><span style="color: maroon">form </span><span style="color: red">id</span><span style="color: blue">="form1" </span><span style="color: red">runat</span><span style="color: blue">="server"&gt; &lt;</span><span style="color: maroon">div</span><span style="color: blue">&gt; &lt;</span><span style="color: maroon">table </span><span style="color: red">class</span><span style="color: blue">="table-content"&gt; &lt;</span><span style="color: maroon">tr</span><span style="color: blue">&gt; &lt;</span><span style="color: maroon">td</span><span style="color: blue">&gt; &lt;</span><span style="color: maroon">a </span><span style="color: red">href</span><span style="color: blue">="page2.aspx?cliente=1"&gt;</span>Ver<span style="color: blue">&lt;/</span><span style="color: maroon">a</span><span style="color: blue">&gt; &lt;/</span><span style="color: maroon">td</span><span style="color: blue">&gt; &lt;</span><span style="color: maroon">td</span><span style="color: blue">&gt; </span>Dato <span style="color: blue">&lt;/</span><span style="color: maroon">td</span><span style="color: blue">&gt; &lt;</span><span style="color: maroon">td</span><span style="color: blue">&gt; <font color="#000000"><a href="http://www.devjoker.com">www.devjoker.com</font></span> </a> <span style="color: blue">&lt;/</span><span style="color: maroon">td</span><span style="color: blue">&gt; &lt;/</span><span style="color: maroon">tr</span><span style="color: blue">&gt; &lt;</span><span style="color: maroon">tr</span><span style="color: blue">&gt; &lt;</span><span style="color: maroon">td</span><span style="color: blue">&gt; &lt;</span><span style="color: maroon">a </span><span style="color: red">href</span><span style="color: blue">="page2.aspx?cliente=2"&gt;</span>Ver<span style="color: blue">&lt;/</span><span style="color: maroon">a</span><span style="color: blue">&gt; &lt;/</span><span style="color: maroon">td</span><span style="color: blue">&gt; &lt;</span><span style="color: maroon">td</span><span style="color: blue">&gt; </span>Dato <span style="color: blue">&lt;/</span><span style="color: maroon">td</span><span style="color: blue">&gt; &lt;</span><span style="color: maroon">td</span><span style="color: blue">&gt; </span>Otro dato <span style="color: blue">&lt;/</span><span style="color: maroon">td</span><span style="color: blue">&gt; &lt;/</span><span style="color: maroon">tr</span><span style="color: blue">&gt; &lt;</span><span style="color: maroon">tr</span><span style="color: blue">&gt; &lt;</span><span style="color: maroon">td</span><span style="color: blue">&gt; &lt;</span><span style="color: maroon">a </span><span style="color: red">href</span><span style="color: blue">="page2.aspx?cliente=3"&gt;</span>Ver<span style="color: blue">&lt;/</span><span style="color: maroon">a</span><span style="color: blue">&gt; &lt;/</span><span style="color: maroon">td</span><span style="color: blue">&gt; &lt;</span><span style="color: maroon">td</span><span style="color: blue">&gt; </span>Dato <span style="color: blue">&lt;/</span><span style="color: maroon">td</span><span style="color: blue">&gt; &lt;</span><span style="color: maroon">td</span><span style="color: blue">&gt; </span>Otro dato <span style="color: blue">&lt;/</span><span style="color: maroon">td</span><span style="color: blue">&gt; &lt;/</span><span style="color: maroon">tr</span><span style="color: blue">&gt; &lt;/</span><span style="color: maroon">table</span><span style="color: blue">&gt; &lt;/</span><span style="color: maroon">div</span><span style="color: blue">&gt; &lt;/</span><span style="color: maroon">form</span><span style="color: blue">&gt; &lt;/</span><span style="color: maroon">body</span><span style="color: blue">&gt; &lt;/</span><span style="color: maroon">html</span><span style="color: blue">&gt; </span></pre> <p>Fijaros en comentario en color verde que pone «<em>&lt;!--Aqui pondremos el script que veremos mas adelante—&gt;</em>», 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 <em>table</em>, <u>la mejor forma de mostrar datos tabulares es el elemento <em>table</em></u>.</p> <p>La segundo página, <em>page2.aspx</em> que corresponde con nuestro detalle – que en el ejemplo muestra una página con el detalle del&nbsp; cliente&nbsp; y su logotipo. El código .aspx sería el siguiente:</p><pre class="code"><span style="background: yellow">&lt;%</span><span style="color: blue">@ </span><span style="color: maroon">Page </span><span style="color: red">Language</span><span style="color: blue">="C#" </span><span style="color: red">AutoEventWireup</span><span style="color: blue">="true" </span><span style="color: red">CodeFile</span><span style="color: blue">="page2.aspx.cs" </span><span style="color: red">Inherits</span><span style="color: blue">="page2" </span><span style="background: yellow">%&gt; </span><span style="color: blue">&lt;!</span><span style="color: maroon">DOCTYPE </span><span style="color: red">html </span><span style="color: blue">&gt; &lt;</span><span style="color: maroon">html </span><span style="color: red">lang</span><span style="color: blue">="es"&gt; &lt;</span><span style="color: maroon">head </span><span style="color: red">runat</span><span style="color: blue">="server"&gt; &lt;</span><span style="color: maroon">title</span><span style="color: blue">&gt;&lt;/</span><span style="color: maroon">title</span><span style="color: blue">&gt; &lt;</span><span style="color: maroon">link </span><span style="color: red">href</span><span style="color: blue">="css/site.css" </span><span style="color: red">rel</span><span style="color: blue">="stylesheet" </span><span style="color: red">type</span><span style="color: blue">="text/css" /&gt; &lt;/</span><span style="color: maroon">head</span><span style="color: blue">&gt; &lt;</span><span style="color: maroon">body</span><span style="color: blue">&gt; &lt;</span><span style="color: maroon">form </span><span style="color: red">id</span><span style="color: blue">="form1" </span><span style="color: red">runat</span><span style="color: blue">="server"&gt; </span><strong>Esto NO SE MUESTRA cuando se llama a la página por AJAX</strong> <span style="color: blue">&lt;</span><span style="color: maroon">div </span><span style="color: red">id</span><span style="color: blue">="content"&gt; &lt;</span><span style="color: maroon">div </span><span style="color: red">class</span><span style="color: blue">="logo"&gt; &lt;</span><span style="color: maroon">asp</span><span style="color: blue">:</span><span style="color: maroon">Image </span><span style="color: red">runat</span><span style="color: blue">="server" </span><span style="color: red">ID</span><span style="color: blue">="imglogo" /&gt; &lt;/</span><span style="color: maroon">div</span><span style="color: blue">&gt; &lt;</span><span style="color: maroon">div </span><span style="color: red">class</span><span style="color: blue">="logo-text" &gt; &lt;</span><span style="color: maroon">h1</span><span style="color: blue">&gt; </span>Este es el contenido que se va a mostrar!!!!<span style="color: blue">&lt;/</span><span style="color: maroon">h1</span><span style="color: blue">&gt; &lt;</span><span style="color: maroon">asp</span><span style="color: blue">:</span><span style="color: maroon">Label </span><span style="color: red">runat</span><span style="color: blue">="server"&gt;</span>Detalle:<span style="color: blue">&lt;/</span><span style="color: maroon">asp</span><span style="color: blue">:</span><span style="color: maroon">Label</span><span style="color: blue">&gt; &lt;</span><span style="color: maroon">asp</span><span style="color: blue">:</span><span style="color: maroon">Label </span><span style="color: red">ID</span><span style="color: blue">="lblDetalle" </span><span style="color: red">runat</span><span style="color: blue">="server"&gt;&lt;/</span><span style="color: maroon">asp</span><span style="color: blue">:</span><span style="color: maroon">Label</span><span style="color: blue">&gt; &lt;/</span><span style="color: maroon">div</span><span style="color: blue">&gt; &lt;/</span><span style="color: maroon">div</span><span style="color: blue">&gt; &lt;/</span><span style="color: maroon">form</span><span style="color: blue">&gt; &lt;/</span><span style="color: maroon">body</span><span style="color: blue">&gt; &lt;/</span><span style="color: maroon">html</span><span style="color: blue">&gt; </span></pre> <p>Fijaros que hay una parte del código en la que ponemos «<em>Esto NO SE MUESTRA cuando se llama a la página por AJAX</em>», 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).</p> <p>Y su código correspondiente. Lo único destacable es que hemos encapsulado la variable “<em>cliente</em>” en una propiedad para trabajar más fácilmente:</p><pre class="code"><span style="color: blue">using </span>System; <span style="color: blue">using </span>System.Collections.Generic; <span style="color: blue">using </span>System.Linq; <span style="color: blue">using </span>System.Web; <span style="color: blue">using </span>System.Web.UI; <span style="color: blue">using </span>System.Web.UI.WebControls; <span style="color: blue">public partial class </span><span style="color: #2b91af">page2 </span>: System.Web.UI.<span style="color: #2b91af">Page </span>{ <span style="color: blue">int </span>Cliente { <span style="color: blue">get </span>{ <span style="color: blue">int </span>cliente = 0 ; <span style="color: #2b91af">Int32</span>.TryParse(Request[<span style="color: #a31515">"cliente"</span>], <span style="color: blue">out </span>cliente); <span style="color: blue">return </span>cliente; } } <span style="color: blue">string </span>GetDetalle() { <span style="color: blue">return </span><span style="color: #2b91af">String</span>.Format( <span style="color: #a31515">"Este es el detalle del cliente {0} ..., aqui podemos hacer de todo un poco."</span>, Cliente); } <span style="color: blue">protected void </span>Page_Load(<span style="color: blue">object </span>sender, <span style="color: #2b91af">EventArgs </span>e) { lblDetalle.Text = GetDetalle(); imglogo.ImageUrl = <span style="color: #2b91af">VirtualPathUtility</span>.ToAbsolute( <span style="color: #2b91af">String</span>.Format(<span style="color: #a31515">"~/img/logo{0}.jpg"</span>, Cliente)); } } </pre> <p>Está sería la ejecución de cada una de las páginas de forma independiente …</p> <p><a href="http://devjoker.com/images/UploadFiles/Windows-Live-Writer/Detalle-de-un-listado-con-jQuery_C08E/image_10.png"><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"></a></p> <p><a href="http://devjoker.com/images/UploadFiles/Windows-Live-Writer/Detalle-de-un-listado-con-jQuery_C08E/image_2.png"><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"></a></p> <p>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.&nbsp; </p> <p>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):</p><pre class="code"><span style="background: yellow">&lt;%</span><span style="color: #006400">--&lt;a href="page2.aspx?cliente=1" &gt;Ver&lt;/a&gt;--</span><span style="background: yellow">%&gt; </span><span style="color: blue">&lt;</span><span style="color: maroon">input </span><span style="color: red">type</span><span style="color: blue">="button" </span><span style="color: red">value</span><span style="color: blue">="[+]" </span><span style="color: red">class</span><span style="color: blue">="addRowButton" </span><span style="color: red">rel</span><span style="color: blue">="1" /&gt; </span></pre> <p>Observemos que el botón no tiene asociada ninguna acción para el evento onclick ni ningún otro.</p> <p>Ahora vamos a incluir un poco de código javascript con jQuery el la primera página, <em>Default.aspx </em>(hay que incluirlo en el comentario de color verde que hemos incluido en el código&nbsp; de <em>Default.aspx</em>):</p><pre class="code"><span style="color: blue">&lt;</span><span style="color: maroon">script </span><span style="color: red">type</span><span style="color: blue">="text/javascript"&gt; </span>$(document).ready(<span style="color: blue">function </span>() { $(<span style="color: maroon">".addRowButton"</span>).one(<span style="color: maroon">"click"</span>, addChildrenRow); }); <span style="color: blue">function </span>showdiv(div, row) { $(row).show(); $(div).fadeIn(<span style="color: maroon">"slow"</span>); } <span style="color: blue">function </span>hidediv(div, row) { $(div).fadeOut(<span style="color: maroon">"slow"</span>, <span style="color: blue">function </span>() { $(row).hide(); }); } <span style="color: blue">function </span>addChildrenRow(source) { <span style="color: blue">var </span>button = $(source.currentTarget); <span style="color: blue">var </span>tr = button.parents(<span style="color: maroon">"tr"</span>).first(); tr.addClass(<span style="color: maroon">"red"</span>); <span style="color: blue">var </span>trTemplate = $(<span style="color: maroon">"&lt;tr&gt;&lt;td colspan=\"3\"&gt;&lt;div class=\"content\"&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;"</span>); tr.after(trTemplate); <span style="color: blue">var </span>divElement = trTemplate.find(<span style="color: maroon">"div.content"</span>); button.toggle(<span style="color: blue">function </span>() { tr.removeClass(<span style="color: maroon">"red"</span>); hidediv(divElement, trTemplate); }, <span style="color: blue">function </span>() { tr.addClass(<span style="color: maroon">"red"</span>); showdiv(divElement, trTemplate); }); <span style="color: blue">var </span>cliente = button.attr(<span style="color: maroon">"rel"</span>); divElement.load(<span style="color: maroon">"page2.aspx?cliente=" </span>+ cliente +<span style="color: maroon">" #content"</span>, <span style="color: blue">function </span>() { divElement.fadeIn(<span style="color: maroon">"slow"</span>); }); } <span style="color: blue">&lt;/</span><span style="color: maroon">script</span><span style="color: blue">&gt; </span></pre> <p>Este script realiza las siguientes tareas:</p> <ul> <li>En el script de inicio <em>$(document),ready(…)</em> se vincular el click del botón de cada fila a&nbsp; la función <em>addChildrenRow</em>&nbsp; (selector <em>.addRowButton</em>)<em>. </em>Es importante destacar que este enlace se realiza a través del método <em>one</em>, que vincula únicamente la primera pulsación del boton. <li>La funcion <em>addChildrenRow</em> es la que realmente realiza el trabajo sucio, por un lado detecta el elemento que produce el evento, y localiza el <em>tr</em> inmediatamente superior, para insertar una nueva fila – con un elemento div- a continuación.&nbsp; A continuación,&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 <em>addClass </em>y <em>fadeIn</em>, <em>fadeOut</em></li></ul> <p>Si ejecutamos la página … el resultado de la ejecución es el siguiente:</p> <p><a href="http://devjoker.com/images/UploadFiles/Windows-Live-Writer/Detalle-de-un-listado-con-jQuery_C08E/image_12.png"><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"></a></p> <p><a href="http://devjoker.com/images/UploadFiles/Windows-Live-Writer/Detalle-de-un-listado-con-jQuery_C08E/image_14.png"><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"></a></p> <p><a href="http://devjoker.com/images/UploadFiles/Windows-Live-Writer/Detalle-de-un-listado-con-jQuery_C08E/image_6.png"><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"></a></p> <p>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.</p> <p>El código completo de la página <em>Default.aspx</em> quedaría de la siguiente manera:</p><pre class="code"><span style="background: yellow">&lt;%</span><span style="color: blue">@ </span><span style="color: maroon">Page </span><span style="color: red">Language</span><span style="color: blue">="C#" </span><span style="color: red">AutoEventWireup</span><span style="color: blue">="true" </span><span style="color: red">CodeFile</span><span style="color: blue">="Default.aspx.cs" </span><span style="color: red">Inherits</span><span style="color: blue">="_Default" </span><span style="background: yellow">%&gt; </span><span style="color: blue">&lt;!</span><span style="color: maroon">DOCTYPE </span><span style="color: red">html </span><span style="color: blue">&gt; &lt;</span><span style="color: maroon">html </span><span style="color: red">lang</span><span style="color: blue">="es"&gt; &lt;</span><span style="color: maroon">head </span><span style="color: red">runat</span><span style="color: blue">="server"&gt; &lt;</span><span style="color: maroon">title</span><span style="color: blue">&gt;&lt;/</span><span style="color: maroon">title</span><span style="color: blue">&gt; &lt;</span><span style="color: maroon">script </span><span style="color: red">src</span><span style="color: blue">="Scripts/jquery-1.7.1.min.js" </span><span style="color: red">type</span><span style="color: blue">="text/javascript"&gt;&lt;/</span><span style="color: maroon">script</span><span style="color: blue">&gt; &lt;</span><span style="color: maroon">link </span><span style="color: red">rel</span><span style="color: blue">="stylesheet" </span><span style="color: red">type</span><span style="color: blue">="text/css" </span><span style="color: red">href</span><span style="color: blue">="css/site.css" /&gt; &lt;</span><span style="color: maroon">script </span><span style="color: red">type</span><span style="color: blue">="text/javascript"&gt; </span>$(document).ready(<span style="color: blue">function </span>() { $(<span style="color: maroon">".addRowButton"</span>).one(<span style="color: maroon">"click"</span>, addChildrenRow); }); <span style="color: blue">function </span>showdiv(div, row) { $(row).show(); $(div).fadeIn(<span style="color: maroon">"slow"</span>); } <span style="color: blue">function </span>hidediv(div, row) { $(div).fadeOut(<span style="color: maroon">"slow"</span>, <span style="color: blue">function </span>() { $(row).hide(); }); } <span style="color: blue">function </span>addChildrenRow(source) { <span style="color: blue">var </span>button = $(source.currentTarget); <span style="color: blue">var </span>tr = button.parents(<span style="color: maroon">"tr"</span>).first(); tr.addClass(<span style="color: maroon">"red"</span>); <span style="color: blue">var </span>trTemplate = $(<span style="color: maroon">"&lt;tr&gt;&lt;td colspan=\"3\"&gt;&lt;div class=\"content\"&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;"</span>); tr.after(trTemplate); <span style="color: blue">var </span>divElement = trTemplate.find(<span style="color: maroon">"div.content"</span>); button.toggle(<span style="color: blue">function </span>() { tr.removeClass(<span style="color: maroon">"red"</span>); hidediv(divElement, trTemplate); }, <span style="color: blue">function </span>() { tr.addClass(<span style="color: maroon">"red"</span>); showdiv(divElement, trTemplate); }); <span style="color: blue">var </span>cliente = button.attr(<span style="color: maroon">"rel"</span>); divElement.load(<span style="color: maroon">"page2.aspx?cliente=" </span>+ cliente +<span style="color: maroon">" #content"</span>, <span style="color: blue">function </span>() { divElement.fadeIn(<span style="color: maroon">"slow"</span>); }); } <span style="color: blue">&lt;/</span><span style="color: maroon">script</span><span style="color: blue">&gt; &lt;/</span><span style="color: maroon">head</span><span style="color: blue">&gt; &lt;</span><span style="color: maroon">body</span><span style="color: blue">&gt; &lt;</span><span style="color: maroon">form </span><span style="color: red">id</span><span style="color: blue">="form1" </span><span style="color: red">runat</span><span style="color: blue">="server"&gt; &lt;</span><span style="color: maroon">div</span><span style="color: blue">&gt; &lt;</span><span style="color: maroon">table </span><span style="color: red">class</span><span style="color: blue">="table-content"&gt; &lt;</span><span style="color: maroon">tr</span><span style="color: blue">&gt; &lt;</span><span style="color: maroon">td</span><span style="color: blue">&gt; &lt;</span><span style="color: maroon">input </span><span style="color: red">type</span><span style="color: blue">="button" </span><span style="color: red">value</span><span style="color: blue">="[+]" </span><span style="color: red">class</span><span style="color: blue">="addRowButton" </span><span style="color: red">rel</span><span style="color: blue">="1" /&gt; &lt;/</span><span style="color: maroon">td</span><span style="color: blue">&gt; &lt;</span><span style="color: maroon">td</span><span style="color: blue">&gt; </span>Dato <span style="color: blue">&lt;/</span><span style="color: maroon">td</span><span style="color: blue">&gt; &lt;</span><span style="color: maroon">td</span><span style="color: blue">&gt; </span>Otro dato <span style="color: blue">&lt;/</span><span style="color: maroon">td</span><span style="color: blue">&gt; &lt;/</span><span style="color: maroon">tr</span><span style="color: blue">&gt; &lt;</span><span style="color: maroon">tr</span><span style="color: blue">&gt; &lt;</span><span style="color: maroon">td</span><span style="color: blue">&gt; &lt;</span><span style="color: maroon">input </span><span style="color: red">type</span><span style="color: blue">="button" </span><span style="color: red">value</span><span style="color: blue">="[+]" </span><span style="color: red">class</span><span style="color: blue">="addRowButton" </span><span style="color: red">rel</span><span style="color: blue">="2" /&gt; &lt;/</span><span style="color: maroon">td</span><span style="color: blue">&gt; &lt;</span><span style="color: maroon">td</span><span style="color: blue">&gt; </span>Dato <span style="color: blue">&lt;/</span><span style="color: maroon">td</span><span style="color: blue">&gt; &lt;</span><span style="color: maroon">td</span><span style="color: blue">&gt; </span>Otro dato <span style="color: blue">&lt;/</span><span style="color: maroon">td</span><span style="color: blue">&gt; &lt;/</span><span style="color: maroon">tr</span><span style="color: blue">&gt; &lt;</span><span style="color: maroon">tr</span><span style="color: blue">&gt; &lt;</span><span style="color: maroon">td</span><span style="color: blue">&gt; &lt;</span><span style="color: maroon">input </span><span style="color: red">type</span><span style="color: blue">="button" </span><span style="color: red">value</span><span style="color: blue">="[+]" </span><span style="color: red">class</span><span style="color: blue">="addRowButton" </span><span style="color: red">rel</span><span style="color: blue">="3" /&gt; &lt;/</span><span style="color: maroon">td</span><span style="color: blue">&gt; &lt;</span><span style="color: maroon">td</span><span style="color: blue">&gt; </span>Dato <span style="color: blue">&lt;/</span><span style="color: maroon">td</span><span style="color: blue">&gt; &lt;</span><span style="color: maroon">td</span><span style="color: blue">&gt; </span>Otro dato <span style="color: blue">&lt;/</span><span style="color: maroon">td</span><span style="color: blue">&gt; &lt;/</span><span style="color: maroon">tr</span><span style="color: blue">&gt; &lt;/</span><span style="color: maroon">table</span><span style="color: blue">&gt; &lt;/</span><span style="color: maroon">div</span><span style="color: blue">&gt; &lt;/</span><span style="color: maroon">form</span><span style="color: blue">&gt; &lt;/</span><span style="color: maroon">body</span><span style="color: blue">&gt; &lt;/</span><span style="color: maroon">html</span><span style="color: blue">&gt; </span></pre> <p>Nota. Las marcas de coche cuyos logotipos se muestran en este articulo no me han regalado nada <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">.</p> <p>Podemos descargar el <a href="https://skydrive.live.com/redir.aspx?cid=20a9c248301397b3&amp;resid=20A9C248301397B3!141&amp;parid=20A9C248301397B3!142">código fuente desde este enlace</a>.(Archivo website16.zip)</p> <p>Saludos, </p> <p>DJK!</p> /contenidos/articulos/506/Como-mejorar-la-usabilidad-de-un-listado-maestro-detalle-con-jQuery-y-Ajax.aspx Thu, 26 Jan 2012 21:36:45 GMT JSON.NET. Mejorando la serializaci&oacute;n JSON con .NET /contenidos/articulos/505/JSONNET-Mejorando-la-serializacioacuten-JSON-con-NET.aspx <p>Hace algún tiempo que os hablamos en <a href="http://devjoker.com/">devjoker.com</a> de como utilizar <a href="http://es.wikipedia.org/wiki/JSON">JSON</a> en aplicaciones ASP.NET -<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">http://www.devjoker.com/contenidos/catss/459/Serializacioacuten-JSON-con-NET.aspx</a>. Es este articulo serializábamos un objeto utilizando la clase <em>JavaScriptSerializer </em>incluido con .NET Framework en el assembly <em>System.Web.Script.Serialization</em>.</p> <p>En esta ocasión vamos a realizar el mismo ejercicio de serialización pero a través de la librería <a href="http://json.codeplex.com/">JSON.NET</a>. La utilización de esta librería nos va a aportar las siguientes ventajas:</p> <ul> <li>Una forma de trabajar sencilla y unificada para todas nuestras clases. No tendremos que escribir un nuevo método <em>ToJson() </em>en cada clase, como ocurría en el ejemplo anterior.</li> <li>JSON.NET nos permite serializar de .NET a JSON, pero también de forma inversa de JSON a .NET.</li> <li>Un nuevo sabor de LINQ: <a href="http://james.newtonking.com/projects/json/help/LINQtoJSON.html">LINQ To JSON</a>.</li></ul> <p>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:</p> <p><a href="http://devjoker.com/images/UploadFiles/Windows-Live-Writer/JSON.NET_C264/image_2.png"><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"></a>&nbsp;</p> <p>Utilizando <a href="http://nuget.org">NuGet</a> añadimos al proyecto las referencia a JSON.NET y también a jQuery -para simplificar el trabajo con Ajax. </p> <p>El proyecto constará de los siguientes elementos:</p> <ul> <li>Un HttpHandler,<em> DataHanlder.ashx</em> – que nos va a permitir gestionar las llamadas para obtener un resultado serializado en JSON.</li> <li>Un Web Form, <em>Default.aspx</em>, que nos servirá como página de inicio y desde donde realizaremos las llamadas al handler anterior.</li></ul> <p>La siguiente imagen muestra el aspecto que debería tener&nbsp; el explorador de soluciones (el resto de los elementos se crean al añadir las referencias con NuGet).</p> <p><a href="http://devjoker.com/images/UploadFiles/Windows-Live-Writer/JSON.NET_C264/image_4.png"><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"></a></p> <p>Ahora escribimos el código del handler:</p><pre class="code"><span style="background: yellow">&lt;%</span><span style="color: blue">@ </span><span style="color: maroon">WebHandler </span><span style="color: red">Language</span><span style="color: blue">="C#" </span><span style="color: red">Class</span><span style="color: blue">="DataHanlder" </span><span style="background: yellow">%&gt; </span><span style="color: blue">using </span>System; <span style="color: blue">using </span>System.Web; <span style="color: blue">public class </span><span style="color: #2b91af">DataHanlder </span>: <span style="color: #2b91af">IHttpHandler </span>{ <span style="color: blue">class </span><span style="color: #2b91af">Persona </span>{ <span style="color: blue">public </span><span style="color: #2b91af">Guid </span>Id { <span style="color: blue">get</span>; <span style="color: blue">set</span>; } <span style="color: blue">public string </span>Nombre { <span style="color: blue">get</span>; <span style="color: blue">set</span>; } <span style="color: blue">public string </span>Apellidos { <span style="color: blue">get</span>; <span style="color: blue">set</span>; } <span style="color: blue">public string </span>FechaNacimiento { <span style="color: blue">get</span>; <span style="color: blue">set</span>; } } <span style="color: blue">public void </span>ProcessRequest (<span style="color: #2b91af">HttpContext </span>context) { context.Response.ContentType = <span style="color: #a31515">"application/json"</span>; <span style="color: blue">var </span>devjoker = <span style="color: blue">new </span><span style="color: #2b91af">Persona</span>() { Id = <span style="color: #2b91af">Guid</span>.NewGuid(), Nombre = <span style="color: #a31515">"Pedro"</span>, Apellidos = <span style="color: #a31515">"Herrarte"</span>, FechaNacimiento = <span style="color: blue">new </span><span style="color: #2b91af">DateTime </span>(1975,01,13).ToString(<span style="color: #a31515">"d"</span>) }; <span style="color: blue">var </span>json = Newtonsoft.Json.<span style="color: #2b91af">JsonConvert</span>.SerializeObject(devjoker); context.Response.Write( json ); } <span style="color: blue">public bool </span>IsReusable { <span style="color: blue">get </span>{ <span style="color: blue">return false</span>; } } } </pre> <p>Para simplificar, hemos incrustado la clase <em>Persona </em>dentro del propio handler. Las peticiones se procesan en el método <em>ProcessRequest</em>, 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 <em>JsonConverter</em>, y devolvemos la respuesta por http normalmente. Así de fácil.</p> <p>Si quisiéramos obtener el objeto .NET a partir del JSON seria tan sencillo como hacer lo siguiente:</p><pre class="code"><span style="color: blue">var </span>inputJson = <span style="color: #a31515">@"{ ""Id"":""bb816aa1-feab-4e35-b9be-80f1273d4913"", ""Nombre"":""Pedro"", ""Apellidos"":""Herrarte"", ""FechaNacimiento"":""20/01/1975""}"</span>; <span style="color: #2b91af">Persona </span>deserializedPersona = Newtonsoft.Json.<span style="color: #2b91af">JsonConvert</span>.DeserializeObject&lt;<span style="color: #2b91af">Persona</span>&gt;(inputJson); </pre> <p><a href="http://devjoker.com/images/UploadFiles/Windows-Live-Writer/JSON.NET_C264/image_8.png"><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"></a></p> <p>Ahora vamos a la página .aspx:</p><pre class="code"><span style="background: yellow">&lt;%</span><span style="color: blue">@ </span><span style="color: maroon">Page </span><span style="color: red">Language</span><span style="color: blue">="C#" </span><span style="color: red">AutoEventWireup</span><span style="color: blue">="true" </span><span style="color: red">CodeFile</span><span style="color: blue">="Default.aspx.cs" </span><span style="color: red">Inherits</span><span style="color: blue">="_Default" </span><span style="background: yellow">%&gt; </span><span style="color: blue">&lt;!</span><span style="color: maroon">DOCTYPE </span><span style="color: red">html </span><span style="color: blue">&gt; &lt;</span><span style="color: maroon">html </span><span style="color: red">xmlns</span><span style="color: blue">="http://www.w3.org/1999/xhtml"&gt; &lt;</span><span style="color: maroon">head </span><span style="color: red">runat</span><span style="color: blue">="server"&gt; &lt;</span><span style="color: maroon">title</span><span style="color: blue">&gt;&lt;/</span><span style="color: maroon">title</span><span style="color: blue">&gt; &lt;</span><span style="color: maroon">script </span><span style="color: red">src</span><span style="color: blue">="Scripts/jquery-1.7.1.min.js" </span><span style="color: red">type</span><span style="color: blue">="text/javascript"&gt;&lt;/</span><span style="color: maroon">script</span><span style="color: blue">&gt; &lt;</span><span style="color: maroon">script</span><span style="color: blue">&gt; </span>$(document).ready(<span style="color: blue">function </span>() { $(<span style="color: maroon">"#btnConsulta"</span>).click(buscar); }); <span style="color: blue">function </span>buscar() { <span style="color: blue">var </span>postData= <span style="color: blue">null</span>; $.post(<span style="color: maroon">'Handlers/DataHanlder.ashx'</span>, postData, <span style="color: blue">function </span>(result) { $(<span style="color: maroon">"#txtId"</span>).val(result.Id); $(<span style="color: maroon">"#txtNombre"</span>).val(result.Nombre); $(<span style="color: maroon">"#txtApellidos"</span>).val(result.Apellidos); $(<span style="color: maroon">"#txtFechaNacimiento"</span>).val(result.FechaNacimiento); }); } <span style="color: blue">&lt;/</span><span style="color: maroon">script</span><span style="color: blue">&gt; &lt;/</span><span style="color: maroon">head</span><span style="color: blue">&gt; &lt;</span><span style="color: maroon">body</span><span style="color: blue">&gt; &lt;</span><span style="color: maroon">form </span><span style="color: red">id</span><span style="color: blue">="form1" </span><span style="color: red">runat</span><span style="color: blue">="server" </span><span style="color: red">enableviewstate</span><span style="color: blue">="false"&gt; &lt;</span><span style="color: maroon">div</span><span style="color: blue">&gt; &lt;</span><span style="color: maroon">asp</span><span style="color: blue">:</span><span style="color: maroon">Label </span><span style="color: red">ID</span><span style="color: blue">="Label1" </span><span style="color: red">runat</span><span style="color: blue">="server" </span><span style="color: red">Text</span><span style="color: blue">="ID:"&gt;&lt;/</span><span style="color: maroon">asp</span><span style="color: blue">:</span><span style="color: maroon">Label</span><span style="color: blue">&gt; &lt;</span><span style="color: maroon">asp</span><span style="color: blue">:</span><span style="color: maroon">TextBox </span><span style="color: red">ID</span><span style="color: blue">="txtId" </span><span style="color: red">runat</span><span style="color: blue">="server"&gt;&lt;/</span><span style="color: maroon">asp</span><span style="color: blue">:</span><span style="color: maroon">TextBox</span><span style="color: blue">&gt; &lt;</span><span style="color: maroon">asp</span><span style="color: blue">:</span><span style="color: maroon">Label </span><span style="color: red">ID</span><span style="color: blue">="Label2" </span><span style="color: red">runat</span><span style="color: blue">="server" </span><span style="color: red">Text</span><span style="color: blue">="Nombre:"&gt;&lt;/</span><span style="color: maroon">asp</span><span style="color: blue">:</span><span style="color: maroon">Label</span><span style="color: blue">&gt; &lt;</span><span style="color: maroon">asp</span><span style="color: blue">:</span><span style="color: maroon">TextBox </span><span style="color: red">ID</span><span style="color: blue">="txtNombre" </span><span style="color: red">runat</span><span style="color: blue">="server"&gt;&lt;/</span><span style="color: maroon">asp</span><span style="color: blue">:</span><span style="color: maroon">TextBox</span><span style="color: blue">&gt; &lt;</span><span style="color: maroon">asp</span><span style="color: blue">:</span><span style="color: maroon">Label </span><span style="color: red">ID</span><span style="color: blue">="Label3" </span><span style="color: red">runat</span><span style="color: blue">="server" </span><span style="color: red">Text</span><span style="color: blue">="Apellidos:"&gt;&lt;/</span><span style="color: maroon">asp</span><span style="color: blue">:</span><span style="color: maroon">Label</span><span style="color: blue">&gt; &lt;</span><span style="color: maroon">asp</span><span style="color: blue">:</span><span style="color: maroon">TextBox </span><span style="color: red">ID</span><span style="color: blue">="txtApellidos" </span><span style="color: red">runat</span><span style="color: blue">="server"&gt;&lt;/</span><span style="color: maroon">asp</span><span style="color: blue">:</span><span style="color: maroon">TextBox</span><span style="color: blue">&gt; &lt;</span><span style="color: maroon">asp</span><span style="color: blue">:</span><span style="color: maroon">Label </span><span style="color: red">ID</span><span style="color: blue">="Label4" </span><span style="color: red">runat</span><span style="color: blue">="server" </span><span style="color: red">Text</span><span style="color: blue">="Fecha Nacimiento:"&gt;&lt;/</span><span style="color: maroon">asp</span><span style="color: blue">:</span><span style="color: maroon">Label</span><span style="color: blue">&gt; &lt;</span><span style="color: maroon">asp</span><span style="color: blue">:</span><span style="color: maroon">TextBox </span><span style="color: red">ID</span><span style="color: blue">="txtFechaNacimiento" </span><span style="color: red">runat</span><span style="color: blue">="server"&gt;&lt;/</span><span style="color: maroon">asp</span><span style="color: blue">:</span><span style="color: maroon">TextBox</span><span style="color: blue">&gt; &lt;</span><span style="color: maroon">hr </span><span style="color: blue">/&gt; &lt;</span><span style="color: maroon">input </span><span style="color: red">type</span><span style="color: blue">="button" </span><span style="color: red">ID</span><span style="color: blue">="btnConsulta" </span><span style="color: red">value</span><span style="color: blue">="Buscar" /&gt; &lt;/</span><span style="color: maroon">div</span><span style="color: blue">&gt; &lt;/</span><span style="color: maroon">form</span><span style="color: blue">&gt; &lt;/</span><span style="color: maroon">body</span><span style="color: blue">&gt; &lt;/</span><span style="color: maroon">html</span><span style="color: blue">&gt; </span></pre> <p>&nbsp;</p> <p>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 <em>$(document).ready(…); </em>donde establecemos el enlace del evento <em>click</em> del botón <em>btnConsulta</em> y la función <em>buscar</em>,&nbsp; esta función realiza una llamada al handler que hemos creado anteriormente, y procesa el resultado para mostrarlo en pantalla.</p> <p>La aplicación en ejecución:</p> <p><a href="http://devjoker.com/images/UploadFiles/Windows-Live-Writer/JSON.NET_C264/image_6.png"><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"></a></p> <p>Si analizamos el tráfico con <a href="http://fiddler2.com/fiddler2/">Fiddler</a> podemos ver la llamada al hanlder y la respuesta obtenida:</p> <blockquote> <p>HTTP/1.1 200 OK<br>Server: ASP.NET Development Server/10.0.0.0<br>Date: Wed, 25 Jan 2012 14:45:30 GMT<br>X-AspNet-Version: 4.0.30319<br>Cache-Control: private<br>Content-Type: application/json; charset=utf-8<br>Content-Length: 116<br>Connection: Close</p> <p>{"Id":"bb816aa1-feab-4e35-b9be-80f1273d4913","Nombre":"Pedro","Apellidos":"Herrarte","FechaNacimiento":"13/01/1975"}</p></blockquote> <p>Como podemos ver el resultado obtenido está serializado en JSON perfectamente, y sin apenas esfuerzo.</p> <p>En la página del autor - <a href="http://james.newtonking.com/projects/json/help/">http://james.newtonking.com/projects/json/help/</a> - disponemos además de muchos ejemplos que nos permitirán sacar el máximo rendimiento a JSON.NET.</p> <p>Saludos, </p> <p>DJK</p> /contenidos/articulos/505/JSONNET-Mejorando-la-serializacioacuten-JSON-con-NET.aspx Wed, 25 Jan 2012 17:03:05 GMT Recursos de desarrollo para Silverlight /contenidos/articulos/504/Recursos-de-desarrollo-para-Silverlight.aspx <p>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 …</p> <p>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!</p> <p>El primer sitio en el disponemos de una amplia colección de recursos es la propia página de Silverlight - <a href="http://www.silverlight.net/learn">http://www.silverlight.net/learn</a> – y en especial los hands on labs - <a href="http://www.silverlight.net/learn/overview/silverlight-4-hands-on-labs">http://www.silverlight.net/learn/overview/silverlight-4-hands-on-labs</a>. Eso si, no esperéis ser tocados por el <a href="http://es.wikipedia.org/wiki/Pastafarismo">tallarinesco apendice</a> 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 <a href="http://www.microsoft.com/expression/products/blend_overview.aspx">Blend</a> a los diseñadores <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">.</p> <p align="center"><a href="http://devjoker.com/images/UploadFiles/Windows-Live-Writer/0934b12f040d_E743/image_4.png"><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"></a></p> <p>El siguiente recurso que me gustaría destacar es el Silvelight Toolkit en codeplex: <a href="http://silverlight.codeplex.com/">http://silverlight.codeplex.com/</a>, se trata de una colección de controles para Silverlight y Silverlight para Windows Phone, los controles están desarrollados por la propia&nbsp; Microsoft. Podemos descargarlo directamente desde Codeplex pero también está disponible su instalación con NuGet.</p> <p><a href="http://devjoker.com/images/UploadFiles/Windows-Live-Writer/0934b12f040d_E743/image_2.png"><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"></a></p> <p>O desde <a href="http://nuget.codeplex.com/">Nuget</a> directamente con Visual Studio …</p> <p><a href="http://devjoker.com/images/UploadFiles/Windows-Live-Writer/0934b12f040d_E743/image_6.png"><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"></a></p> <p>El sitio demo de Silverlight Toolkit es sencillamente impresionante - <a href="http://www.silverlight.net/content/samples/sl4/toolkitcontrolsamples/run/default.html">http://www.silverlight.net/content/samples/sl4/toolkitcontrolsamples/run/default.html</a>, 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.</p> <p align="center"><a href="http://devjoker.com/images/UploadFiles/Windows-Live-Writer/0934b12f040d_E743/image_8.png"><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"></a></p> <p align="center"><a href="http://devjoker.com/images/UploadFiles/Windows-Live-Writer/0934b12f040d_E743/image_10.png"><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"></a></p> <p>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. </p> <ul> <li>Silverlight MVVM =&gt; <a href="http://channel9.msdn.com/Blogs/channel9spain/Crear-aplicaciones-Silverlight-con-MVVM">http://channel9.msdn.com/Blogs/channel9spain/Crear-aplicaciones-Silverlight-con-MVVM</a></li> <li>Prims: <a href="http://compositewpf.codeplex.com/">http://compositewpf.codeplex.com/</a></li> <li>MEF:<a title="http://mef.codeplex.com/" href="http://mef.codeplex.com/">http://mef.codeplex.com/</a></li></ul> <p>Saludos, DJK</p> /contenidos/articulos/504/Recursos-de-desarrollo-para-Silverlight.aspx Tue, 24 Jan 2012 18:28:44 GMT El FBI cierra Megaupload y detiene a varios de sus trabajadores /contenidos/articulos/503/El-FBI-cierra-Megaupload-y-detiene-a-varios-de-sus-trabajadores.aspx <p>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.</p> <p>Enlace a la noticia: <a href="http://www.elmundo.es/elmundo/2012/01/19/navegante/1327002605.html">http://www.elmundo.es/elmundo/2012/01/19/navegante/1327002605.html</a></p> <p>&nbsp;</p> <p><a href="http://www.elmundo.es/elmundo/2012/01/19/navegante/1327002605.html"><a href="http://www.devjoker.com/images/UploadFiles/WindowsLiveWriter/ElFBIcierraMegauploadydetieneavariosdesu_1426D/image_2.png"><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"></a></a></p> <p>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 - <a href="http://alt1040.com/2012/01/megaupload-cierra">http://alt1040.com/2012/01/megaupload-cierra</a> - habla de delitos de blanqueo de dinero y crimen organizado …, aunque la <a href="http://www.fbi.gov/news/pressrel/press-releases/justice-department-charges-leaders-of-megaupload-with-widespread-online-copyright-infringement">nota oficial del FBI</a> habla de fraude generalizado contra los derechos de autor. La operación además se ha desarrollado internacionalmente en Nueva Zelanda.</p> <p>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 «<em>ley de protección de datos personales</em>», y proceda a cerrar bancos, multinacionales de todo tipo, ya que me consta el incumplimiento generalizado de dicha ley.</p> <p>Lamentable.</p> /contenidos/articulos/503/El-FBI-cierra-Megaupload-y-detiene-a-varios-de-sus-trabajadores.aspx Thu, 19 Jan 2012 23:57:39 GMT Estad&iacute;sticas de utilizaci&oacute;n de tu sitio web en tiempo real con Google Analytics. /contenidos/articulos/502/Estadiacutesticas-de-utilizacioacuten-de-tu-sitio-web-en-tiempo-real-con-Google-Analytics.aspx <p>Google no deja de sorprendernos. Acaba de incorporar a su sistema de estadísticas <a href="http://www.google.com/analytics/">Google Analytics</a> informes en tiempo real. </p> <p>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</p> <p align="center"><a href="http://devjoker.com/images/UploadFiles/Windows-Live-Writer/Estadsticas-de-utilizacin-en-tiempo-rea_CCBC/image_2.png"><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"></a></p> <p>Todo en tiempo real. Alucinante.</p> <p>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.</p> <p>Saludos, DJK.</p> /contenidos/articulos/502/Estadiacutesticas-de-utilizacioacuten-de-tu-sitio-web-en-tiempo-real-con-Google-Analytics.aspx Wed, 18 Jan 2012 14:42:49 GMT HTML5 e integraci&oacute;n con Facebook /contenidos/articulos/501/HTML5-e-integracioacuten-con-Facebook.aspx <p>Si eres un seguidor habitual de <a href="http://www.devjoker.com">www.devjoker.com</a> 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 <a href="http://es.wordpress.com/">wordpress</a>, <a href="http://umbraco.com/">umbraco</a> o&nbsp; <a href="http://www.dotnetblogengine.net/">blogengine</a>, 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.</p> <p>Como consecuencia de lo anterior&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 <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">. </p> <p>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 <a href="http://www.clikear.com/claves_optimizar_web_725.aspx">Google ha modificado el algoritmo de búsqueda</a>, y <a href="www.devjoker.com">devjoker.com</a> ha sido penalizado duramente (hemos pasado de un page rank 6 a 3). </p> <p>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:</p> <ul> <li>Integración con <a href="http://www.facebook.com/pages/devjokercom/188781521219799">facebook</a>. 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.&nbsp; <strong>Así que ya podéis darle al «me gusta»</strong>.</li> <li>HTML5. Estamos modificando el código que genera <a href="http://www.devjoker.com">www.devjoker.com</a> para hacerlo más semántico y de mayor calidad. (aunque HTML5 es mucho, muchísimo mas que esto!)</li> <li>También hemos aprovechado para la corrección de algunos fallos.</li></ul> <p><a href="http://devjoker.com/images/UploadFiles/Windows-Live-Writer/HTML5-e-integracin-con-Facebook_E9F8/image_4.png"><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"></a></p> <p>Esperamos seguir introduciendo novedades, pero lo mas importante – disponer del tiempo necesario para publicar nuevos post y tutoriales. </p> <p>Y si os gusta … pues darle al «me gusta».</p> <p>Saludos, DJK. </p> /contenidos/articulos/501/HTML5-e-integracioacuten-con-Facebook.aspx Mon, 16 Jan 2012 17:25:23 GMT Frikada del d&iacute;a. SSH con tu foto en Ascii Art. /contenidos/articulos/500/Frikada-del-diacutea-SSH-con-tu-foto-en-Ascii-Art.aspx <p>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.</p> <p>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 … </p> <p><a href="http://www.devjoker.com/images/UploadFiles/WindowsLiveWriter/Frikadadelda.SSHcontufotoenAsciiArt_131CB/image_4.png"><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"></a> </p> <p>Para lograr este efecto solo tenemos que pasar nuestra foto a Ascii, que es tremendamente fácil utilizando herramientas como esta: <a href="http://makeascii.com/">http://makeascii.com/</a></p> <p>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: </p> <p>En mi caso: <strong>nano /etc/motd</strong> ,e introducir nuestra foto en ASCII en el archivo. Ahora seguro que ya sabemos a que servidor estamos conectados … </p> <p>Lo dicho: una frikada.</p> <p>Saludos, DJK</p> /contenidos/articulos/500/Frikada-del-diacutea-SSH-con-tu-foto-en-Ascii-Art.aspx Tue, 10 Jan 2012 21:46:27 GMT Disponible la versi&oacute;n Relase del driver ODP.NET de ORACLE para Entity Framework y LINQ. /contenidos/articulos/499/Disponible-la-versioacuten-Relase-del-driver-ODPNET-de-ORACLE-para-Entity-Framework-y-LINQ.aspx <p>Ya esta disponible la versión relase del driver ODP.NET 11.2 Relase 4 con soporte para Entity Framework y LINQ. </p> <p>Habíamos advertido que ORACLE tenia previsto el lanzamiento del driver ODP.NET con soporte para Entity Framework a finales de años - <a href="http://devjoker.com/contenidos/Articulos/494/Driver-ORACLE-para-Entity-FrameworkndashBeta-3.aspx">http://devjoker.com/contenidos/Articulos/494/Driver-ORACLE-para-Entity-FrameworkndashBeta-3.aspx</a> – ¡y han cumplido!</p> <p><a href="http://devjoker.com/images/UploadFiles/Windows-Live-Writer/cb959a6f0c0e_B0CB/image_2.png"><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"></a></p> <p>Podemos descargar el driver desde las siguientes direcciones:</p><span sab="1086"> <ul> <li><a href="http://www.oracle.com/technetwork/topics/dotnet/utilsoft-086879.html" sab="1087"><font color="#0066cc">32-bit ODAC with Oracle Developer Tools for Visual Studio</font></a></li> <li><a href="http://www.oracle.com/technetwork/database/windows/downloads/utilsoft-087491.html" sab="1087"><font color="#0066cc">32-bit ODAC xcopy</font></a></li> <li><a href="http://www.oracle.com/technetwork/database/windows/downloads/index-090165.html" sab="1087"><font color="#0066cc">x64 ODAC installer and xcopy</font></a></li></ul></span> <p>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: <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">http://www.oracle.com/technetwork/database/windows/newfeatures-084113.html#ODP.NET</a></p> <p>En el siguiente articulo tenemos un completo ejemplo de como utilizarlo: <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">http://www.oracle.com/technetwork/issue-archive/2011/11-sep/o51odt-453447.html</a></p> <p>Saludos, DJK.</p> /contenidos/articulos/499/Disponible-la-versioacuten-Relase-del-driver-ODPNET-de-ORACLE-para-Entity-Framework-y-LINQ.aspx Fri, 30 Dec 2011 12:44:23 GMT Interesante recopilaci&oacute;n de plugins de jQuery /contenidos/articulos/498/Interesante-recopilacioacuten-de-plugins-de-jQuery.aspx <p>Los que me conocéis sabéis que soy una fanático de <a href="http://jquery.com/">jQuery</a>. No solo de la librería sino&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 - <a href="http://www.devjoker.com/contenidos/catss/469/Recopilacioacuten-de-150-pluggins-de-jQuery.aspx">http://www.devjoker.com/contenidos/catss/469/Recopilacioacuten-de-150-pluggins-de-jQuery.aspx</a>.</p> <p>En la siguiente dirección he encontrado esta interesantísima lista - <a href="http://www.blog.estudioit.cl/10-nuevos-plugins-para-jquery/">http://www.blog.estudioit.cl/10-nuevos-plugins-para-jquery/</a> – en la que podemos encontrar pluggins de todo tipo. Muy recomendable. Algunos de los que mas me gustan …</p> <p align="center"><a href="http://devjoker.com/images/UploadFiles/Windows-Live-Writer/Interesante-recopilacin-de-plugins-de-jQ_A452/image_11.png"><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"></a></p> <p align="center"><a href="http://nivo.dev7studios.com/">http://nivo.dev7studios.com/</a></p> <p align="center"><a href="http://devjoker.com/images/UploadFiles/Windows-Live-Writer/Interesante-recopilacin-de-plugins-de-jQ_A452/image_13.png"><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"></a></p> <p align="center"><a title="http://tympanus.net/Tutorials/BeautifulBackgroundImageNavigation/" href="http://tympanus.net/Tutorials/BeautifulBackgroundImageNavigation/">http://tympanus.net/Tutorials/BeautifulBackgroundImageNavigation/</a></p> <p align="center"><a href="http://devjoker.com/images/UploadFiles/Windows-Live-Writer/Interesante-recopilacin-de-plugins-de-jQ_A452/image_15.png"><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"></a></p> <p align="center"><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">https://buildinternet.s3.amazonaws.com/live-tutorials/sliding-boxes/index.htm</a></p> <p>Y también algunos que he encontrado por ahí y que son muy recomendables.</p> <p align="center"><a href="http://devjoker.com/images/UploadFiles/Windows-Live-Writer/Interesante-recopilacin-de-plugins-de-jQ_A452/image_2.png"><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"></a><a href="http://devjoker.com/images/UploadFiles/Windows-Live-Writer/Interesante-recopilacin-de-plugins-de-jQ_A452/image_7.png"><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"></a><a href="http://devjoker.com/images/UploadFiles/Windows-Live-Writer/Interesante-recopilacin-de-plugins-de-jQ_A452/image_9.png"><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"></a></p> <p align="center"><a title="http://tympanus.net/Tutorials/CollapsingSiteNavigation/" href="http://tympanus.net/Tutorials/CollapsingSiteNavigation/">http://tympanus.net/Tutorials/CollapsingSiteNavigation/</a></p> <p align="center"><a href="http://devjoker.com/images/UploadFiles/Windows-Live-Writer/Interesante-recopilacin-de-plugins-de-jQ_A452/image_17.png"><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"></a><a href="http://devjoker.com/images/UploadFiles/Windows-Live-Writer/Interesante-recopilacin-de-plugins-de-jQ_A452/image_19.png"><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"></a></p> <p align="center"><a href="http://vegas.jaysalvat.com/">http://vegas.jaysalvat.com/</a></p> <p>Saludos, DJK!</p> /contenidos/articulos/498/Interesante-recopilacioacuten-de-plugins-de-jQuery.aspx Wed, 21 Dec 2011 12:57:17 GMT Gesti&oacute;n de Timeouts con EventWaitHandle. /contenidos/articulos/497/Gestioacuten-de-Timeouts-con-EventWaitHandle.aspx <p>Trabajar con componentes – ya sea propios o externos - es algo muy habitual. En la mayoría de los casos&nbsp; el componente se comporta como debe y todo parece funcionar correctamente. </p> <p>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:</p> <ul> <li>un exceso de carga de la máquina <li>un bloqueo sobre algún recurso <li>ejecución de un servicio externo …</li></ul> <p>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.</p> <p>Vamos a intentar hacer un ejemplo, supongamos que trabajamos con el siguiente componente:</p><pre class="code"><span style="color: blue">public class </span><span style="color: #2b91af">Component </span>{ <span style="color: blue">public void </span>ComponentProcess(<span style="color: blue">int </span>miliseconds, <span style="color: blue">int </span>delay) { <span style="color: blue">var </span>start = <span style="color: #2b91af">DateTime</span>.Now ; <span style="color: #2b91af">Console</span>.WriteLine(<span style="color: #a31515">"Inicio de ComponentProcess. Ms:{0}, delay:{1}"</span>, miliseconds, delay); <span style="color: #2b91af">Thread</span>.Sleep(miliseconds*delay); <span style="color: blue">var </span>end = <span style="color: #2b91af">DateTime</span>.Now ; <span style="color: #2b91af">Console</span>.WriteLine(<span style="color: #a31515">"Inicio de Fin ComponentProcess. Tiempo de ejecucion(ms): {0}"</span>, end.Subtract(start) ); } } </pre> <p>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.</p> <p>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!)</p><pre class="code"><span style="color: blue">class </span><span style="color: #2b91af">Program </span>{ <span style="color: blue">public static void </span>Main(<span style="color: blue">string</span>[] args) { <span style="color: blue">var </span>a = <span style="color: blue">new </span><span style="color: #2b91af">Component</span>(); <span style="color: blue">for </span>(<span style="color: blue">var </span>i = 0; i &lt;= 5; i++) { a.ComponentProcess(1000, i); } <span style="color: #2b91af">Console</span>.WriteLine(<span style="color: #a31515">"Finaliza ejecucion del programa"</span>); <span style="color: #2b91af">Console</span>.ReadLine(); } }</pre> <p>El resultado de la ejecución del código anterior es este:</p> <p><a href="http://devjoker.com/images/UploadFiles/Windows-Live-Writer/5c6b67e112d4_9F15/image_2.png"><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"></a></p> <p>Como podemos ver el tiempo de ejecución tiende a infinito … comprometiendo la estabilidad y escalabilidad de nuestro sistema, y por supuesto el rendimiento. </p> <p>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 …</p> <ul> <li><em>ITimeoutTask</em> – Que representa una tarea con timeout. <li><em>ITaskResult</em> – Que representa el resultado de la tarea.</li></ul><pre class="code"><span style="color: blue">public interface </span><span style="color: #2b91af">ITimeoutTask </span>{ <span style="color: blue">void </span>Process(<span style="color: blue">int </span>timeout); <span style="color: #2b91af">ITaskResult </span>Result { <span style="color: blue">get</span>; } } <span style="color: blue">public interface </span><span style="color: #2b91af">ITaskResult </span>{ <span style="color: #2b91af">Exception </span>Error {<span style="color: blue">get</span>;} <span style="color: blue">bool </span>Sucess {<span style="color: blue">get</span>;} } </pre> <p>Ahora hay que realizar las implementaciones de las interfaces. Primero el resultado del proceso <em>ITaskResult</em> – 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.</p><pre class="code"><span style="color: blue">public class </span><span style="color: #2b91af">ComponentTaskResult </span>: <span style="color: #2b91af">ITaskResult </span>{ <span style="color: blue">private </span><span style="color: #2b91af">Exception </span>_error; <span style="color: blue">private bool </span>_sucess; <span style="color: blue">public </span>ComponentTaskResult(<span style="color: blue">bool </span>sucess, <span style="color: #2b91af">Exception </span>error) { _sucess = sucess; _error = error; } <span style="color: blue">public </span><span style="color: #2b91af">Exception </span>Error { <span style="color: blue">get </span>{ <span style="color: blue">return </span>_error; } } <span style="color: blue">public bool </span>Sucess { <span style="color: blue">get </span>{ <span style="color: blue">return </span>_sucess; } } } </pre> <p>Y ahora la clase que implementa <em>ITimeoutTask</em> , 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).</p><pre class="code"><span style="color: blue">public class </span><span style="color: #2b91af">ComponentTask </span>: <span style="color: #2b91af">ITimeoutTask </span>{ <span style="color: #2b91af">EventWaitHandle </span>eventWait; <span style="color: #2b91af">Component </span>componente; <span style="color: #2b91af">ITaskResult </span>result; <span style="color: blue">private int </span>i_param = 0; <span style="color: blue">private int </span>b_param = 0; <span style="color: blue">public </span>ComponentTask (<span style="color: blue">int </span>ms, <span style="color: blue">int </span>delay ) { componente = <span style="color: blue">new </span><span style="color: #2b91af">Component</span>(); i_param = ms; b_param = delay; <pre class="code"> <font style="background-color: #ffff00">eventWait</font> = <span style="color: blue">new </span><span style="color: #2b91af">EventWaitHandle</span>(<span style="color: blue">false</span>, <span style="color: #2b91af">EventResetMode</span>.AutoReset); result = <span style="color: blue">new </span><span style="color: #2b91af">ComponentTaskResult</span>(<span style="color: blue">false</span>, <span style="color: blue">null</span>); } <span style="color: blue">public void </span>Process(<span style="color: blue">int </span>timeout) { <span style="color: #2b91af">Thread </span>hilo = <span style="color: blue">new </span><span style="color: #2b91af">Thread</span>(InternalTask); hilo.Start(); <span style="color: blue">if </span>(<font style="background-color: #ffff00">!eventWait.WaitOne(timeout)</font>) { hilo.Abort(); result = <span style="color: blue">new </span><span style="color: #2b91af">ComponentTaskResult</span>(<span style="color: blue">false</span>, <span style="color: blue">new </span><span style="color: #2b91af">TimeoutException</span>(<span style="color: #a31515">"TimeOut"</span>) ); } } <span style="color: blue">private void </span>InternalTask() { <span style="color: blue">try </span>{ componente.ComponentProcess(i_param, b_param); result = <span style="color: blue">new </span><span style="color: #2b91af">ComponentTaskResult</span>(<span style="color: blue">true</span>, <span style="color: blue">null</span>); } <span style="color: blue">catch </span>(<span style="color: #2b91af">Exception </span>ex) { result = <span style="color: blue">new </span><span style="color: #2b91af">ComponentTaskResult</span>(<span style="color: blue">false</span>, ex); } <span style="color: blue">finally </span>{ <font style="background-color: #ffff00">eventWait.Set()</font>; } } <span style="color: blue">public </span><span style="color: #2b91af">ITaskResult </span>Result { <span style="color: blue">get </span>{ <span style="color: blue">return </span>result; } } } </pre></pre> <p>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 <a href="http://msdn.microsoft.com/es-es/library/system.threading.eventwaithandle%28v=VS.100%29.aspx">EventWaitHandle</a>, que será el objeto encargado de monitorizar el tiempo ejecución y nos va a permitir sincronizar los procesos.</p> <p>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<font style="background-color: #ffff00"> WaitOne(int)</font> del objeto <a href="http://msdn.microsoft.com/es-es/library/system.threading.eventwaithandle%28v=VS.100%29.aspx">EventWaitHandle</a>. Este método, esperará al tiempo que hemos establecido o a que se realice la llamada al método <font style="background-color: #ffff00">Set()</font> – que le indicará al proceso principal que se ha finalizado el trabajo. Si se llama al método <font style="background-color: #ffff00">Set()</font> antes de que finalice el timeout el método <font style="background-color: #ffff00">WaitOne(int)</font> 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).</p> <p>Ahora vamos a ver como modificamos el método Main para utilizar nuestra <em>ITimeoutTask</em> ….</p><pre class="code"><span style="color: blue">class </span><span style="color: #2b91af">ProgramWithTimeout </span>{ <span style="color: blue">public static void </span>Main(<span style="color: blue">string</span>[] args) { <span style="color: blue">var </span>timeout = 3200; <span style="color: green">//3.2 segundos </span><span style="color: blue">for </span>(<span style="color: blue">var </span>i = 0; i &lt;= 5; i++) { <span style="color: blue">var </span>task = <span style="color: blue">new </span><span style="color: #2b91af">ComponentTask</span>(1000, i); task.Process(timeout); <span style="color: blue">if </span>(task.Result.Sucess) { <span style="color: #2b91af">Console</span>.WriteLine(<span style="color: #a31515">"OK, el proceso ha sido correcto"</span>); } <span style="color: blue">else </span>{ <span style="color: #2b91af">Console</span>.WriteLine(<span style="color: #a31515">"Se ha producido un error. {0}"</span>, task.Result.Error.Message); } } <span style="color: #2b91af">Console</span>.WriteLine(<span style="color: #a31515">"Finaliza ejecucion del programa"</span>); <span style="color: #2b91af">Console</span>.ReadLine(); } } </pre> <p>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.</p> <p>La ejecución del programa es la siguiente:</p> <p><a href="http://devjoker.com/images/UploadFiles/Windows-Live-Writer/5c6b67e112d4_9F15/image_6.png"><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"></a></p> <p>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.</p> <p>Saludos, </p> <p>DJK!</p> /contenidos/articulos/497/Gestioacuten-de-Timeouts-con-EventWaitHandle.aspx Tue, 20 Dec 2011 14:53:11 GMT Datos de ejemplo para probar nuestras aplicaciones /contenidos/articulos/496/Datos-de-ejemplo-para-probar-nuestras-aplicaciones.aspx <p>Cuando desarrollamos software tenemos que probar nuestros programas. No me refiero a realizar <a href="http://geeks.ms/blogs/ilanda/archive/2009/06/16/pruebas-unitarias-resumiendo.aspx">test unitarios</a> (cosa que recomiendo encarecidamente), sino a probar la aplicación como usuarios. En este punto tenemos introducir datos,&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 <strike>tecleando</strike> 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</p> <p>El resultado es que el al final es una perdida considerable de tiempo y&nbsp; nuestro entorno de desarrollo acaba teniendo una <u><em>mierda</em> de datos</u>.¿Os ha pasado alguna vez verdad?</p> <p>Para evitarlo os recomiendo utilizar datos que “parezcan reales”, a continuación mostramos algunos trucos para obtener estos datos “casi reales”. </p> <ul> <li><strong>Nombres y apellidos</strong>: Crear clientes, usuarios, … es innumerable la cantidad de veces que tenemos que introducir el nombre y&nbsp; los apellidos en una pantalla.&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.<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"><br><br><a href="http://devjoker.com/images/UploadFiles/Windows-Live-Writer/Datos-de-ejemplo-para-las-aplicaciones_997F/image_2.png"><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"></a> <li><strong>Emails. </strong>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 <a href="http://www.devjoker.com/contenidos/Articulos/242/El-email-de-diez-minutos.aspx">artículo</a>.<strong>&nbsp;<br><br><a href="http://devjoker.com/images/UploadFiles/Windows-Live-Writer/Datos-de-ejemplo-para-las-aplicaciones_997F/image_4.png"><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"></a></strong> <li><strong>Direcciones postales</strong>: 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.<br><br><a href="http://devjoker.com/images/UploadFiles/Windows-Live-Writer/Datos-de-ejemplo-para-las-aplicaciones_997F/image_6.png"><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"></a> <li><strong>Teléfonos</strong>. 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 …) <li><strong>DNI, NIE, CIF</strong>. Otro dato molesto. Utiliza este servicio para generarlo: <a href="http://niednicifgenerador.appspot.com/">http://niednicifgenerador.appspot.com/</a><br><br><a href="http://devjoker.com/images/UploadFiles/Windows-Live-Writer/Datos-de-ejemplo-para-las-aplicaciones_997F/image_8.png"><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"></a> <li><strong>Números de tarjeta</strong>: De nuevo otro servicio para estos casos - <a href="http://generadores.arredemo.org/ccgenerador/">http://generadores.arredemo.org/ccgenerador/</a>. 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.<br><a href="http://devjoker.com/images/UploadFiles/Windows-Live-Writer/Datos-de-ejemplo-para-las-aplicaciones_997F/image_10.png"><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"></a><br> <li><strong>Datos bancarios</strong>:Utiliza esta página - <a href="http://www.genware.es">http://www.genware.es</a>. Dispones de opciones para generar CCC, ISBAN, … de nuevo que nadie espere poder domiciliar el recibo de la luz en estas cuentas ….</li></ul> <p><br></p> <p><a href="http://devjoker.com/images/UploadFiles/Windows-Live-Writer/Datos-de-ejemplo-para-las-aplicaciones_997F/image_12.png"><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"></a></p> <p>En esta última página disponemos de opciones para generar casi todo tipo de datos, hasta código de barras.</p> <p>Saludos, DJK!</p> /contenidos/articulos/496/Datos-de-ejemplo-para-probar-nuestras-aplicaciones.aspx Fri, 16 Dec 2011 12:01:06 GMT Productivity Power Tools para Visual Studio 2010 /contenidos/articulos/495/Productivity-Power-Tools-para-Visual-Studio-2010.aspx <p>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 <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">&nbsp;</p> <p>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 <a href="http://visualstudiogallery.msdn.microsoft.com/d0d33361-18e2-46c0-8ff2-4adea1e34fef">este enlace</a>.</p> <p align="center"><a href="http://devjoker.com/images/UploadFiles/Windows-Live-Writer/Visual-Studio-product_C4FF/image_4.png"><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"></a>&nbsp;<a href="http://devjoker.com/images/UploadFiles/Windows-Live-Writer/Visual-Studio-product_C4FF/image_16.png"><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"></a></p> <p>Entre las opciones que mas gustan quisiera destacar el «Solution Navigator», se trata de un explorador de soluciones mejorado,&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.</p> <p align="center"><a href="http://devjoker.com/images/UploadFiles/Windows-Live-Writer/Visual-Studio-product_C4FF/image_6.png"><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"></a>&nbsp;<a href="http://devjoker.com/images/UploadFiles/Windows-Live-Writer/Visual-Studio-product_C4FF/image_8.png"><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"></a>&nbsp;<a href="http://devjoker.com/images/UploadFiles/Windows-Live-Writer/Visual-Studio-product_C4FF/image_10.png"><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"></a></p> <p>Pero no solo nos ayuda a nivel de utilidades en Visual Studio, también lo hace al escribir el código.&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.</p> <p align="center"><a href="http://devjoker.com/images/UploadFiles/Windows-Live-Writer/Visual-Studio-product_C4FF/image_20.png"><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"></a>&nbsp;<a href="http://devjoker.com/images/UploadFiles/Windows-Live-Writer/Visual-Studio-product_C4FF/image_22.png"><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"></a></p> <p>Otra opción interesante es buscador rápido que se integra en la ventana principal resaltando todas las ocurrencias del texto a buscar.</p> <p><a href="http://devjoker.com/images/UploadFiles/Windows-Live-Writer/Visual-Studio-product_C4FF/image_24.png"><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"></a></p> <p>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!)</p> <p><a href="http://devjoker.com/images/UploadFiles/Windows-Live-Writer/Visual-Studio-product_C4FF/image_12.png"><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"></a></p> <p>Hay mas opciones que no comentare aquí, pero ver la lista completa de funcionalidades en el siguiente enlace <a title="http://visualstudiogallery.msdn.microsoft.com/d0d33361-18e2-46c0-8ff2-4adea1e34fef" href="http://visualstudiogallery.msdn.microsoft.com/d0d33361-18e2-46c0-8ff2-4adea1e34fef">http://visualstudiogallery.msdn.microsoft.com/d0d33361-18e2-46c0-8ff2-4adea1e34fef</a></p> <p>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!.</p> <p><a href="http://devjoker.com/images/UploadFiles/Windows-Live-Writer/Visual-Studio-product_C4FF/image_14.png"><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"></a></p> <p>Saludos, DJK</p> /contenidos/articulos/495/Productivity-Power-Tools-para-Visual-Studio-2010.aspx Tue, 13 Dec 2011 17:53:26 GMT Driver ORACLE para Entity Framework&ndash;Beta 3 /contenidos/articulos/494/Driver-ORACLE-para-Entity-FrameworkndashBeta-3.aspx <p>ORACLE acaba de lanzar la tercera beta del driver para Entity Framework. </p> <p>Podemos descargar la beta desde el siguiente enlace :<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">http://www.oracle.com/technetwork/topics/dotnet/downloads/oracleefbeta-302521.html</a></p> <p align="center"><a href="http://devjoker.com/images/UploadFiles/Windows-Live-Writer/Driver-ORACLE-para-Entity-FrameworkBeta-_CBAB/image_2.png"><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"></a></p> <p>Mas información: <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">http://geeks.ms/blogs/jtorrecilla/archive/2011/10/20/oracle-oracle-lanza-la-beta-3-del-driver-para-ef.aspx</a></p> /contenidos/articulos/494/Driver-ORACLE-para-Entity-FrameworkndashBeta-3.aspx Thu, 20 Oct 2011 14:32:44 GMT Fallece Steve Jobs, Fundador de Apple. /contenidos/articulos/493/Fallece-Steve-Jobs-Fundador-de-Apple.aspx <p>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. <p>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. <p>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. <p>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. <p>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. <p>Descanse en paz. <p><a href="http://www.devjoker.com/images/UploadFiles/WindowsLiveWriter/FalleceSteveJobsFundadordeApple_2850/image_2.png"><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"></a> <p align="center">&nbsp; <p>&nbsp; <a href="http://devjoker.com/images/UploadFiles/Windows-Live-Writer/Fallece-Steve-Jobs-Fundador-de-Apple_A871/image_2.png"><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"></a> <p>Fuente: <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">http://es.noticias.yahoo.com/muere-steve-jobs-fundador-apple-235510851.html</a></p> /contenidos/articulos/493/Fallece-Steve-Jobs-Fundador-de-Apple.aspx Tue, 11 Oct 2011 12:00:20 GMT