<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10spanishfull.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearch/1.1/" xmlns:georss="http://www.georss.org/georss" xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr="http://purl.org/syndication/thread/1.0" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" gd:etag="W/&quot;D0MEQX0zfyp7ImA9WhVbEkw.&quot;"><id>tag:blogger.com,1999:blog-27752126</id><updated>2012-05-28T16:30:00.387+02:00</updated><category term="flash" /><category term="navidad" /><category term="2009" /><category term="vacaciones" /><category term="historias" /><category term="cadenas de conexión" /><category term="vs2008" /><category term="interfaces" /><category term="analytics" /><category term="signalr" /><category term="calidad" /><category term="curiosidades" /><category term="arquitectura" /><category term="opinión" /><category term="bytecode" /><category term="reflexiones" /><category term="webgrid" /><category term="spam" /><category term="inocentadas" /><category term="haloscan" /><category term="validadores" /><category term="eswebcamp" /><category term="xhtml" /><category term="errores" /><category term="connection strings" /><category term="antipatrones" /><category term="leyes" /><category term="scripting" /><category term="linq" /><category term="nupack" /><category term="xVal" /><category term="paranoias" /><category term="java" /><category term="árboles de expresión" /><category term="azure" /><category term="aniversario" /><category term="optimización" /><category term="liame" /><category term="niftydotnet" /><category term="rest" /><category term="nivel básico" /><category term="curso" /><category term="1337" /><category term="nivel medio" /><category term="proyectos" /><category term="nivel alto" /><category term="estándares" /><category term="2.0" /><category term="dsl" /><category term="viajes" /><category term="asp.net" /><category term="patrones" /><category term="blogging" /><category term="error" /><category term="dans" /><category term="depuración" /><category term="google" /><category term="trabajo" /><category term="knockout" /><category term="ensamblador" /><category term="fluent interfaces" /><category term="technorati" /><category term="webpages" /><category term="chuletas" /><category term="navegadores" /><category term="msdewey" /><category term="delegados" /><category term="emoticonos" /><category term="epónimos" /><category term="aspnetmvc" /><category term="escaneo de puertos" /><category term="mvp" /><category term="productos" /><category term="envidia" /><category term="buenas prácticas" /><category term="Spectrum" /><category term="frameworks" /><category term="frases célebres" /><category term="servicios on-line" /><category term="equipos" /><category term="planetas" /><category term="redes" /><category term="troyanos" /><category term="vs" /><category term="técnicas de spam" /><category term="lambdas" /><category term="antispam" /><category term="silverlight" /><category term="chacha" /><category term="entrevistas" /><category term="leet speak" /><category term="ie" /><category term="charlas" /><category term="desarollo" /><category term="jqGrid" /><category term="jquery" /><category term="historia" /><category term="phishing" /><category term="ado.net" /><category term="scrum" /><category term="homenaje" /><category term="problema" /><category term="virus" /><category term="entity framework" /><category term="webmatrix" /><category term="conquista del mundo" /><category term="consultas" /><category term="nostalgia" /><category term="software libre" /><category term="ayuda" /><category term="web" /><category term="seguridad" /><category term="rendimiento" /><category term="desarrollo" /><category term="redes sociales" /><category term="interacción" /><category term="c#" /><category term="desastres" /><category term="css" /><category term="libros" /><category term="portales" /><category term="cultura" /><category term="creatividad" /><category term=".net" /><category term="diseño" /><category term="visualstudio" /><category term="vb.net" /><category term="humor" /><category term="métodos anónimos" /><category term="productividad" /><category term="summit2012" /><category term="emuladores" /><category term="motores de física" /><category term="bases de datos" /><category term="auges" /><category term="interfaces fluidos" /><category term="webforms" /><category term="t4" /><category term="análisis" /><category term="frikadas" /><category term="programación" /><category term="componentes" /><category term="software" /><category term="html" /><category term="utilidades" /><category term="riqueza" /><category term="cartujadotnet" /><category term="comentarios" /><category term="msil" /><category term="enlaces" /><category term="webapi" /><category term="javascript" /><category term="autobombo" /><category term="localizacion" /><category term="communityday" /><category term="redondear esquinas" /><category term="óscar" /><category term="trucos" /><category term="innovadores" /><category term="cms" /><category term="vs2010" /><category term="tecnología" /><category term="instalación" /><category term="resumen" /><category term="glimpse" /><category term="ttt" /><category term="vs2005" /><category term="recomendaciones" /><category term="linux" /><category term="office" /><category term="personal" /><category term="ajax" /><category term="empresa" /><category term="genios" /><category term="herramientas" /><category term="protocolos" /><category term="colaboraciones" /><category term="variablenotfound.com" /><category term="tags" /><category term="blogger" /><category term="SEO" /><category term="buscadores" /><category term="noticias" /><category term="novedades" /><category term="ofuscación de emails" /><category term="orcas" /><category term="orm" /><category term="razor" /><category term="eventos" /><category term="microsoft" /><category term="quaere" /><category term="actualidad" /><category term="mono" /><category term="alegrías" /><category term="data" /><category term="fiddler" /><title>Variable not found</title><subtitle type="html">Artículos, noticias, curiosidades, reflexiones... sobre el mundo del desarrollo de software, internet, u otros temas relacionados con la tecnología.</subtitle><link rel="http://schemas.google.com/g/2005#feed" type="application/atom+xml" href="http://www.variablenotfound.com/feeds/posts/default" /><link rel="alternate" type="text/html" href="http://www.variablenotfound.com/" /><link rel="next" type="application/atom+xml" href="http://www.blogger.com/feeds/27752126/posts/default?start-index=26&amp;max-results=25&amp;redirect=false&amp;v=2" /><author><name>José M. Aguilar</name><uri>http://www.blogger.com/profile/11683750380776435448</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://3.bp.blogspot.com/_O9D62hXq-ng/S6Hfc0RM0YI/AAAAAAAABOg/bEEA3DZ7Uac/S220/fb1.png" /></author><generator version="7.00" uri="http://www.blogger.com">Blogger</generator><openSearch:totalResults>528</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/atom+xml" href="http://feeds.feedburner.com/vnf" /><feedburner:info uri="vnf" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><feedburner:emailServiceId>vnf</feedburner:emailServiceId><feedburner:feedburnerHostname>http://feedburner.google.com</feedburner:feedburnerHostname><feedburner:feedFlare href="http://www.newsgator.com/ngs/subscriber/subext.aspx?url=http%3A%2F%2Ffeeds.feedburner.com%2Fvnf" src="http://www.newsgator.com/images/ngsub1.gif">Subscribe with NewsGator</feedburner:feedFlare><feedburner:feedFlare href="http://www.bloglines.com/sub/http://feeds.feedburner.com/vnf" src="http://www.bloglines.com/images/sub_modern11.gif">Subscribe with Bloglines</feedburner:feedFlare><feedburner:feedFlare href="http://www.netvibes.com/subscribe.php?url=http%3A%2F%2Ffeeds.feedburner.com%2Fvnf" src="http://www.netvibes.com/img/add2netvibes.gif">Subscribe with Netvibes</feedburner:feedFlare><feedburner:feedFlare href="http://fusion.google.com/add?feedurl=http%3A%2F%2Ffeeds.feedburner.com%2Fvnf" src="http://buttons.googlesyndication.com/fusion/add.gif">Subscribe with Google</feedburner:feedFlare><feedburner:feedFlare href="http://www.pageflakes.com/subscribe.aspx?url=http%3A%2F%2Ffeeds.feedburner.com%2Fvnf" src="http://www.pageflakes.com/ImageFile.ashx?instanceId=Static_4&amp;fileName=ATP_blu_91x17.gif">Subscribe with Pageflakes</feedburner:feedFlare><feedburner:feedFlare href="http://add.my.yahoo.com/content?lg=es&amp;url=http%3A%2F%2Ffeeds.feedburner.com%2Fvnf" src="http://eur.i1.yimg.com/eur.yimg.com/i/es/my/addto1.gif">Subscribe with My Yahoo!</feedburner:feedFlare><feedburner:feedFlare href="http://www.feedness.com/alta/http://feeds.feedburner.com/vnf" src="http://www.feedness.com/ayuda/wp-content/square_b_sh_feed.gif">Subscribe with Feedness</feedburner:feedFlare><entry gd:etag="W/&quot;D0MEQX0yeip7ImA9WhVbEkw.&quot;"><id>tag:blogger.com,1999:blog-27752126.post-2876511708954202090</id><published>2012-05-28T16:30:00.000+02:00</published><updated>2012-05-28T16:30:00.392+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-05-28T16:30:00.392+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="charlas" /><category scheme="http://www.blogger.com/atom/ns#" term="auges" /><category scheme="http://www.blogger.com/atom/ns#" term="signalr" /><category scheme="http://www.blogger.com/atom/ns#" term="eventos" /><title>[Auges] Vídeo y materiales del webcast sobre SignalR. ¡uau!</title><content type="html">&lt;img align="right" alt="SignalR, ¡uau!" border="0" height="158" src="http://lh5.ggpht.com/-f0WjH8bc1e0/T8M73wpWuMI/AAAAAAAACEA/HmdIF6tgde4/image18.png?imgmax=800" style="background-image: none; border-width: 0px; display: inline; float: right; margin: 0px 0px 10px 10px; padding-left: 0px; padding-right: 0px; padding-top: 0px;" title="SignalR, ¡uau!" width="210" /&gt;Como sabéis, el pasado jueves tuve el placer de hablar sobre SignalR en un Webcast organizado por &lt;a href="http://auges.org/"&gt;Auges&lt;/a&gt;, el grupo de usuarios de ASP.NET de España. &lt;br /&gt;
&lt;br /&gt;
Ante todo, agradeceros a los asistentes que decidierais pasar esa tarde con nosotros. Una audiencia bastante numerosa para estos tiempos que corren, y un gran número de amigos que os quedasteis hasta el final las dos horas que estuvimos hablando sobre esta pequeña maravilla. Incluso hubo quien comentó que &lt;a href="https://twitter.com/#!/fpontiDev"&gt;se le habían hecho cortas&lt;/a&gt; ;-) Muchas gracias a todos.&lt;br /&gt;
&lt;br /&gt;
La charla la empezamos hablando sobre HTTP, y las limitaciones de éste en escenarios en los que el tiempo real era un requisito imprescindible. Sobrevolamos soluciones tradicionales como el polling, presentamos el concepto Push, revisamos los estándares que están en la cocina por parte de IETF y W3C, y explicamos técnicas que podemos usar hoy en día para implementar aplicaciones en las que el servidor debe tomar la iniciativa en la comunicación con el cliente.&lt;br /&gt;
&lt;a href="http://lh6.ggpht.com/-smKyqBw8vkw/T8M74_PTgvI/AAAAAAAACEE/oIorXTAsIyM/image19.png?imgmax=800" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em; margin-top: 0px;"&gt;&lt;img align="right" alt="El cliente siempre manda, incluso en HTTP" border="0" height="147" src="http://lh6.ggpht.com/-smKyqBw8vkw/T8M74_PTgvI/AAAAAAAACEE/oIorXTAsIyM/image19.png?imgmax=800" style="background-image: none; border-width: 0px; display: inline; margin-top: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;" title="El cliente siempre manda, incluso en HTTP" width="195" /&gt;&lt;/a&gt;&lt;br /&gt;
Seguidamente, tras una breve presentación de SignalR, entramos de lleno en terreno práctico, implementamos desde cero varias demostraciones de las capacidades del framework y revisamos otro buen número de ellas, mediante las cuales intenté mostrar las bases de la programación con esta joya: conexiones persistentes, hubs, acceso a clientes desde procesos externos, e incluso llegamos a implementar un cliente con Windows Forms. &lt;br /&gt;
&lt;br /&gt;
Un total de ocho demos que espero que hayan conseguido transmitir mi entusiasmo por este framework, y las posibilidades que brinda a la hora de dotar a nuestros sistemas de la espectacularidad que sólo los sistemas colaborativos, multiusuarios y en tiempo real son capaces de proporcionar.&lt;br /&gt;
&lt;br /&gt;
Bueno, a lo que iba en el post… el caso es que ya está disponible el vídeo y los materiales de la charla:&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://msevents.microsoft.com/CUI/EventDetail.aspx?culture=es-ES&amp;amp;EventID=1032512979&amp;amp;CountryCode=ES"&gt;Ver/descargar grabación de la charla&lt;/a&gt; (en el mismo sitio de registro del evento)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://skydrive.live.com/redir?resid=90F54D9FF9D3F9EA!812&amp;amp;authkey=!AKm7AyB2EKg14t0"&gt;Descargar material&lt;/a&gt; (PPTs, Solución para Visual Studio). Encontraréis también los cupones descuento que &lt;a href="http://www.campusmvp.com/"&gt;CampusMVP&lt;/a&gt; y &lt;a href="http://www.manning.com/"&gt;Manning&lt;/a&gt; han ofrecido a los asistentes.&lt;/li&gt;
&lt;/ul&gt;
¡Hasta la próxima!&lt;br /&gt;
&lt;br /&gt;
Publicado en &lt;a href="http://www.variablenotfound.com/"&gt;Variable not found&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/27752126-2876511708954202090?l=www.variablenotfound.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/i_tUkplMDdUKA17UdnDhu_xO8YQ/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/i_tUkplMDdUKA17UdnDhu_xO8YQ/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/i_tUkplMDdUKA17UdnDhu_xO8YQ/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/i_tUkplMDdUKA17UdnDhu_xO8YQ/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/vnf?a=q-_SUFIkli0:yYMICzcrPyY:ecdYMiMMAMM"&gt;&lt;img src="http://feeds.feedburner.com/~ff/vnf?d=ecdYMiMMAMM" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/vnf?a=q-_SUFIkli0:yYMICzcrPyY:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/vnf?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/vnf?a=q-_SUFIkli0:yYMICzcrPyY:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/vnf?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/vnf?a=q-_SUFIkli0:yYMICzcrPyY:4cEx4HpKnUU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/vnf?i=q-_SUFIkli0:yYMICzcrPyY:4cEx4HpKnUU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/vnf?a=q-_SUFIkli0:yYMICzcrPyY:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/vnf?i=q-_SUFIkli0:yYMICzcrPyY:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/vnf?a=q-_SUFIkli0:yYMICzcrPyY:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/vnf?i=q-_SUFIkli0:yYMICzcrPyY:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/vnf?a=q-_SUFIkli0:yYMICzcrPyY:I9og5sOYxJI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/vnf?d=I9og5sOYxJI" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/vnf/~4/q-_SUFIkli0" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.variablenotfound.com/feeds/2876511708954202090/comments/default" title="Enviar comentarios" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=27752126&amp;postID=2876511708954202090" title="0 comentarios" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/27752126/posts/default/2876511708954202090?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/27752126/posts/default/2876511708954202090?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/vnf/~3/q-_SUFIkli0/auges-video-y-materiales-del-webcast.html" title="[Auges] Vídeo y materiales del webcast sobre SignalR. ¡uau!" /><author><name>José M. Aguilar</name><uri>http://www.blogger.com/profile/11683750380776435448</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://3.bp.blogspot.com/_O9D62hXq-ng/S6Hfc0RM0YI/AAAAAAAABOg/bEEA3DZ7Uac/S220/fb1.png" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://lh5.ggpht.com/-f0WjH8bc1e0/T8M73wpWuMI/AAAAAAAACEA/HmdIF6tgde4/s72-c/image18.png?imgmax=800" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://www.variablenotfound.com/2012/05/auges-video-y-materiales-del-webcast.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A0YGQX08cSp7ImA9WhVbEUU.&quot;"><id>tag:blogger.com,1999:blog-27752126.post-1679231548157102211</id><published>2012-05-28T09:12:00.000+02:00</published><updated>2012-05-28T09:12:00.379+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-05-28T09:12:00.379+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="enlaces" /><title>Enlaces interesantes 84</title><content type="html">&lt;a href="http://lh3.ggpht.com/-bOfTwJui4bA/T8Mb1n4JTYI/AAAAAAAACDs/_apEWYdc1dk/s1600-h/image7_thumb_thumb_thumb_thumb_thumb%25255B1%25255D.png"&gt;&lt;img align="right" alt="image7_thumb_thumb_thumb_thumb_thumb" border="0" height="129" src="http://lh3.ggpht.com/-_GGYbvDLw8Q/T8Mb3NsfmII/AAAAAAAACD0/_Xl3Jo-Qpa8/image7_thumb_thumb_thumb_thumb_thumb%25255B2%25255D.png?imgmax=800" style="background-image: none; border-width: 0px; display: inline; float: right; margin: 0px 0px 10px 10px; padding-left: 0px; padding-right: 0px; padding-top: 0px;" title="image7_thumb_thumb_thumb_thumb_thumb" width="172" /&gt;&lt;/a&gt;Estos son los enlaces publicados en &lt;a href="http://www.facebook.com/variablenotfound"&gt;Variable not found en Facebook&lt;/a&gt; y &lt;a href="http://twitter.com/jmaguilar"&gt;Twitter&lt;/a&gt; del 21 al 27 de mayo de 2012. Espero que os resulten interesantes :-)&lt;br /&gt;
&lt;h4&gt;
.Net&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://blog.koalite.com/2012/05/assemblies-embebidos/" title="Assemblies embebidos"&gt;Assemblies embebidos&lt;/a&gt;       &lt;br /&gt;Juan María Hernández &lt;/li&gt;
&lt;li&gt;&lt;a href="http://geeks.ms/blogs/lontivero/archive/2012/05/24/c-closures-y-tipos-an-243-nimos-a-la-javascript.aspx"&gt;C# Closures y tipos anónimos a la Javascript&lt;/a&gt;       &lt;br /&gt;Lucas Ontivero &lt;/li&gt;
&lt;li&gt;&lt;a href="http://geeks.ms/blogs/lruiz/archive/2012/05/22/pregunta-191-cu-225-l-es-la-salida-de-este-programa.aspx"&gt;[Pregunta] ¿Cuál es la salida de este programa?&lt;/a&gt;       &lt;br /&gt;Luis Ruíz Pavón &lt;/li&gt;
&lt;li&gt;&lt;a href="http://blog.koalite.com/2012/05/mono-cecil-en-5-minutos/"&gt;Mono.cecil en 5 minutos&lt;/a&gt;       &lt;br /&gt;Juan María Hernández &lt;/li&gt;
&lt;li&gt;&lt;a href="http://coolthingoftheday.blogspot.com.es/2012/05/net-45-gets-zippy-zip-support-is-baked.html" title=".Net 4.5 Gets Zippy... Zip support is baked into the .Net 4.5 Framework"&gt;.Net 4.5 Gets Zippy... Zip support is baked into the .Net 4.5 Framework&lt;/a&gt;       &lt;br /&gt;Greg Duncan &lt;/li&gt;
&lt;li&gt;&lt;a href="http://blog.koalite.com/2012/05/programacion-de-tareas-con-quarz-net/"&gt;Programación de Tareas con Quarz.Net&lt;/a&gt;       &lt;br /&gt;Juan María Hernández &lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;
Asp.net&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://mrubino.net/2012/05/25/mvc-exportar-datos-a-xls-excel-files/"&gt;MVC Exportar Datos a .XLS “Excel Files”&lt;/a&gt;       &lt;br /&gt;Marc Rubiño &lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.hanselman.com/blog/ASPNETMVCBetaAndRCUpgradesConfirmYourExpectationsAndVersionNumbersInProductionEnvironments.aspx"&gt;ASP.NET MVC Beta and RC Upgrades - Confirm your Expectations and Version Numbers in Production Environments&lt;/a&gt;       &lt;br /&gt;Scott Hanselman &lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.geekbeing.com/2012/05/18/implement-live-web-chat-part-1/"&gt;Implement Live Web Chat With ASP.NET MVC 4, Pusher and jQuery&lt;/a&gt;       &lt;br /&gt;Piotr K. &lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;
Conceptos&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://estoyfataldeprogramar.blogspot.com.es/2012/05/patrones-de-diseno-implementando.html"&gt;Patrones de diseño: implementando Abstract Factory&lt;/a&gt;       &lt;br /&gt;Antonio Chamorro &lt;/li&gt;
&lt;li&gt;&lt;a href="http://net.tutsplus.com/tutorials/tools-and-tips/3-key-software-principles-you-must-understand/"&gt;3 Key Software Principles You Must Understand&lt;/a&gt;       &lt;br /&gt;Chris Peters &lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;
Html/Css/Javascript&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://css.dzone.com/articles/naked-javascript-closure"&gt;Naked JavaScript - Closure Dynamics&lt;/a&gt;       &lt;br /&gt;Ryan Sukale &lt;/li&gt;
&lt;li&gt;&lt;a href="http://boagworld.com/mobile-web/separate-mobile-site-vs-responsive-design/"&gt;Mobile: Separate mobile site vs. responsive design&lt;/a&gt;       &lt;br /&gt;Paul Boag &lt;/li&gt;
&lt;li&gt;&lt;a href="http://lostechies.com/derickbailey/2012/05/22/function%e2%80%a6-vs-function%e2%80%a6-or-domready-vs-the-module-pattern/"&gt;$(function(){…}) vs (function($){…})($) or DOMReady vs The Module Pattern&lt;/a&gt;       &lt;br /&gt;Derick Bailey &lt;/li&gt;
&lt;li&gt;&lt;a href="http://weblogs.asp.net/dwahlin/archive/2012/05/22/getting-started-with-css-media-queries.aspx"&gt;Getting Started with CSS Media Queries&lt;/a&gt;       &lt;br /&gt;Dan Wahlin &lt;/li&gt;
&lt;li&gt;&lt;a href="http://derans.blogspot.com.es/2012/05/file-icons-using-css-selectors.html" title="File Icons using CSS Selectors"&gt;File Icons using CSS Selectors&lt;/a&gt;       &lt;br /&gt;Deran Schilling &lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.etnassoft.com/2012/05/21/bloques-en-javascript-reorganizando-codigo/" title="Enlace permanente a Bloques en Javascript- reorganizando código"&gt;Bloques en Javascript- reorganizando código&lt;/a&gt;       &lt;br /&gt;Carlos Benítez &lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;
Visual Studio/Complementos/Herramientas&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://docs.nuget.org/docs/release-notes/nuget-1.8"&gt;NuGet 1.8 Release Notes&lt;/a&gt;       &lt;br /&gt;NuGet Team &lt;/li&gt;
&lt;li&gt;&lt;a href="http://haacked.com/archive/2012/05/21/introducing-github-for-windows.aspx"&gt;Introducing GitHub For Windows&lt;/a&gt;       &lt;br /&gt;Phil Haack &lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.infoq.com/news/2012/05/monodevelop-3" title="MonoDevelop 3.0 – Better Code Completion, Performance, Quick-Fix Suggestions"&gt;MonoDevelop 3.0 – Better Code Completion, Performance, Quick-Fix Suggestions&lt;/a&gt;       &lt;br /&gt;Roopesh Shenoy &lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;
Otros&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://jmalarcon.es/post/La-experiencia-es-un-peine.aspx" title="La experiencia es un peine"&gt;La experiencia es un peine&lt;/a&gt;       &lt;br /&gt;José Manuel Alarcón &lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.boris-lipschitz.com/code-reviews" title="Code Reviews"&gt;Code Reviews&lt;/a&gt;       &lt;br /&gt;Boris Lipschitz &lt;/li&gt;
&lt;/ul&gt;
Y no olvidéis que podéis seguir esta información en vivo y en directo desde &lt;a href="http://www.facebook.com/variablenotfound"&gt;Variable not found en Facebook&lt;/a&gt;, o a través de &lt;a href="http://twitter.com/jmaguilar"&gt;Twitter&lt;/a&gt;.     &lt;br /&gt;    &lt;br /&gt;Publicado en &lt;a href="http://www.variablenotfound.com/"&gt;Variable not found&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/27752126-1679231548157102211?l=www.variablenotfound.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/ULX3iNiXhRwEYs_9Ag4WL9yzNng/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/ULX3iNiXhRwEYs_9Ag4WL9yzNng/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/ULX3iNiXhRwEYs_9Ag4WL9yzNng/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/ULX3iNiXhRwEYs_9Ag4WL9yzNng/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/vnf?a=OrcD2xg2sa0:NJG1M4VEOfc:ecdYMiMMAMM"&gt;&lt;img src="http://feeds.feedburner.com/~ff/vnf?d=ecdYMiMMAMM" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/vnf?a=OrcD2xg2sa0:NJG1M4VEOfc:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/vnf?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/vnf?a=OrcD2xg2sa0:NJG1M4VEOfc:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/vnf?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/vnf?a=OrcD2xg2sa0:NJG1M4VEOfc:4cEx4HpKnUU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/vnf?i=OrcD2xg2sa0:NJG1M4VEOfc:4cEx4HpKnUU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/vnf?a=OrcD2xg2sa0:NJG1M4VEOfc:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/vnf?i=OrcD2xg2sa0:NJG1M4VEOfc:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/vnf?a=OrcD2xg2sa0:NJG1M4VEOfc:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/vnf?i=OrcD2xg2sa0:NJG1M4VEOfc:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/vnf?a=OrcD2xg2sa0:NJG1M4VEOfc:I9og5sOYxJI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/vnf?d=I9og5sOYxJI" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/vnf/~4/OrcD2xg2sa0" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.variablenotfound.com/feeds/1679231548157102211/comments/default" title="Enviar comentarios" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=27752126&amp;postID=1679231548157102211" title="0 comentarios" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/27752126/posts/default/1679231548157102211?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/27752126/posts/default/1679231548157102211?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/vnf/~3/OrcD2xg2sa0/enlaces-interesantes-84.html" title="Enlaces interesantes 84" /><author><name>José M. Aguilar</name><uri>http://www.blogger.com/profile/11683750380776435448</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://3.bp.blogspot.com/_O9D62hXq-ng/S6Hfc0RM0YI/AAAAAAAABOg/bEEA3DZ7Uac/S220/fb1.png" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://lh3.ggpht.com/-_GGYbvDLw8Q/T8Mb3NsfmII/AAAAAAAACD0/_Xl3Jo-Qpa8/s72-c/image7_thumb_thumb_thumb_thumb_thumb%25255B2%25255D.png?imgmax=800" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://www.variablenotfound.com/2012/05/enlaces-interesantes-84.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CEADQX4_cCp7ImA9WhVUFko.&quot;"><id>tag:blogger.com,1999:blog-27752126.post-5698133456554506423</id><published>2012-05-22T09:45:00.000+02:00</published><updated>2012-05-22T09:46:10.048+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-05-22T09:46:10.048+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="novedades" /><category scheme="http://www.blogger.com/atom/ns#" term="asp.net" /><category scheme="http://www.blogger.com/atom/ns#" term="aspnetmvc" /><title>AllowAnonymous en ASP.NET MVC 4</title><content type="html">&lt;img align="right" alt="ASP.NET MVC" border="0" height="77" src="http://lh4.ggpht.com/-HqCe_h74tas/T4cHPfpT96I/AAAAAAAAB6w/YEQ2usuH4H8/ASPNETMVC---COPIA2.png?imgmax=800" style="background-image: none; border-width: 0px; display: inline; float: right; margin: 0px 0px 10px 10px; padding-left: 0px; padding-right: 0px; padding-top: 0px;" title="ASP.NET MVC" width="142" /&gt;Desde el principio de los tiempos, ASP.NET MVC dispone de un mecanismo muy sencillo para controlar el acceso a acciones, basado en los sistemas de autenticación por formulario estándar de ASP.NET.&lt;br /&gt;
&lt;br /&gt;
A grandes rasgos, el asunto consiste en &lt;strong&gt;decorar acciones, o incluso los controladores completos, con el atributo &lt;code&gt;[Authorize]&lt;/code&gt;&lt;/strong&gt;, de forma que si el usuario no ha superado el procedimiento de autenticación, no se podrá acceder a ellas. Además, gracias a los parámetros admitidos por este filtro, es posible indicar qué usuarios concretos pueden ejecutar la acción, o qué roles son los permitidos:&lt;br /&gt;
&lt;pre style="background-color: transparent; overflow: visible; padding: 0px;"&gt;&lt;span style="font-family: Consolas;"&gt;&lt;span style="color: blue;"&gt;&lt;span style="font-size: 10pt;"&gt;public&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 10pt;"&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;class&lt;/span&gt;&amp;nbsp;&lt;span style="color: #2b91af;"&gt;CustomersController&lt;/span&gt; : &lt;span style="color: #2b91af;"&gt;Controller&lt;/span&gt;
{
&amp;nbsp;&amp;nbsp;&amp;nbsp; [&lt;span style="color: #2b91af;"&gt;Authorize&lt;/span&gt;(Roles = &lt;span style="color: #a31515;"&gt;"manager"&lt;/span&gt;)]
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: #2b91af;"&gt;ActionResult&lt;/span&gt; Delete(&lt;span style="color: blue;"&gt;int&lt;/span&gt; id)
&amp;nbsp;&amp;nbsp;&amp;nbsp; {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: green;"&gt;// &lt;/span&gt;&lt;span style="color: darkblue;"&gt;&lt;strong&gt;TODO: Delete a customer&lt;/strong&gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; }

&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: green;"&gt;//...&lt;/span&gt;
}&lt;/span&gt;&lt;/span&gt;
&lt;/pre&gt;
Sin embargo,&lt;strong&gt; había algunos escenarios que eran algo molestos de implementar&lt;/strong&gt; usando esta técnica. Imaginad que estáis desarrollando una web totalmente privada, en la que es necesario incluir el atributo &lt;code&gt;[Authorize]&lt;/code&gt; a todos los controladores: el ideal sería utilizar filtros globales, ¿no? En vez de modificar cada uno de los controladores, haríamos lo siguiente en el global.asax.cs:&lt;br /&gt;
&lt;pre style="background-color: transparent; overflow: visible; padding: 0px;"&gt;&lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size: 10pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;static&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;void&lt;/span&gt; RegisterGlobalFilters(&lt;span style="color: #2b91af;"&gt;GlobalFilterCollection&lt;/span&gt; filters)
&amp;nbsp;&amp;nbsp;&amp;nbsp; {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; filters.Add(&lt;span style="color: blue;"&gt;new&lt;/span&gt;&amp;nbsp;&lt;span style="color: #2b91af;"&gt;HandleErrorAttribute&lt;/span&gt;());
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="background-color: yellow;"&gt;filters.Add(&lt;span style="color: blue;"&gt;new&lt;/span&gt;&amp;nbsp;&lt;span style="color: #2b91af;"&gt;AuthorizeAttribute&lt;/span&gt;());&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;/span&gt;
&lt;/pre&gt;
Y como casi todo en la vida, no es tan sencillo. Este atributo afectaría a las acciones que retornan las vistas del propio&amp;nbsp;formulario de login, por lo que simplemente no sería posible acceder a la aplicación. Lógicamente hay varias soluciones para este problema; por ejemplo, podríamos introducir a mano el filtro en los controladores, o incluso mejor aún, crear un controlador base con el atributo y heredar de él todos los controladores menos los destinados a facilitar la identificación del usuario.&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;ASP.NET MVC 4 introduce un nuevo filtro, denominado &lt;code&gt;[AllowAnonymous]&lt;/code&gt;&lt;/strong&gt; cuya utilidad seguro que podéis deducir en este momento: aplicado a un controlador o acción, hace que se ignore en éste cualquier posible atributo &lt;code&gt;[Authorize]&lt;/code&gt; que pudiera haberse aplicado al mismo. De hecho, en la misma plantilla de proyectos MVC 4 ya vemos que se utiliza bastante en el controlador &lt;code&gt;AccountController&lt;/code&gt; , tradicionalmente destinado a realizar las tareas de conexión, registro y desconexión de usuarios:&lt;br /&gt;
&lt;pre style="background-color: transparent; overflow: visible; padding: 0px;"&gt;&lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size: 10pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; [&lt;span style="color: #2b91af;"&gt;Authorize&lt;/span&gt;]
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;class&lt;/span&gt;&amp;nbsp;&lt;span style="color: #2b91af;"&gt;AccountController&lt;/span&gt; : &lt;span style="color: #2b91af;"&gt;Controller&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; {

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: green;"&gt;//&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: green;"&gt;// GET: /Account/Login&lt;/span&gt;

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; [&lt;span style="color: #2b91af;"&gt;AllowAnonymous&lt;/span&gt;]
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: #2b91af;"&gt;ActionResult&lt;/span&gt; Login()
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: green;"&gt;// ... &lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }
&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;
Y este post podría acabar aquí, pero hay una curiosidad que quería comentar sobre la forma en que está implementado este filtro. Si observamos su &lt;a href="http://aspnetwebstack.codeplex.com/SourceControl/list/changesets"&gt;código fuente&lt;/a&gt;, vemos que es, poco más o menos, así:&lt;br /&gt;
&lt;pre style="background-color: transparent; overflow: visible; padding: 0px;"&gt;&lt;span style="font-family: Consolas;"&gt;&lt;span style="background-color: #f9f9f9; font-size: 9.6pt;"&gt;﻿&lt;span style="white-space: pre;"&gt;&lt;span style="color: blue;"&gt;namespace&lt;/span&gt;&lt;/span&gt; System.Web.Mvc 
{&amp;nbsp; 
&amp;nbsp;&amp;nbsp; [AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; AllowMultiple = &lt;span style="white-space: pre;"&gt;&lt;span style="color: blue;"&gt;false&lt;/span&gt;&lt;/span&gt;, Inherited = &lt;span style="white-space: pre;"&gt;&lt;span style="color: blue;"&gt;true&lt;/span&gt;&lt;/span&gt;)] 

&amp;nbsp;&amp;nbsp; &lt;span style="white-space: pre;"&gt;&lt;span style="color: blue;"&gt;public&lt;/span&gt;&lt;/span&gt; &lt;span style="white-space: pre;"&gt;&lt;span style="color: blue;"&gt;sealed&lt;/span&gt;&lt;/span&gt; &lt;span style="white-space: pre;"&gt;&lt;span style="color: blue;"&gt;class&lt;/span&gt;&lt;/span&gt; AllowAnonymousAttribute : Attribute 
&amp;nbsp;&amp;nbsp; { 

&amp;nbsp;&amp;nbsp; } 
}&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;
Salvo la metainformación contenida en el &lt;code&gt;AttributeUsage&lt;/code&gt;, el resto es una clase vacía (!). Aunque al principio puede parecer raro, es muy lógico: la magia la pone el atributo &lt;code&gt;[Authorize]&lt;/code&gt; en cuya implementación encontramos la lógica que posibilitará la ejecución de una acción si se encuentra decorada (ella o su controlador) con &lt;code&gt;[AllowAnonymous]&lt;/code&gt;, saltándose todas las comprobaciones de autorización:&lt;br /&gt;
&lt;pre style="background-color: transparent; overflow: visible; padding: 0px;"&gt;&lt;span style="font-family: Consolas;"&gt;&lt;span style="color: blue;"&gt;&lt;span style="font-size: 10pt;"&gt;bool&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 10pt;"&gt; skipAuthorization = 
&amp;nbsp;&amp;nbsp;&amp;nbsp; context.ActionDescriptor.IsDefined(&lt;span style="color: blue;"&gt;typeof&lt;/span&gt;(&lt;span style="color: #2b91af;"&gt;AllowAnonymousAttribute&lt;/span&gt;), inherit: &lt;span style="color: blue;"&gt;true)
&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; || context.ActionDescriptor.ControllerDescriptor.IsDefined(
&lt;span style="color: blue;"&gt;                typeof&lt;/span&gt;(&lt;span style="color: #2b91af;"&gt;AllowAnonymousAttribute&lt;/span&gt;), inherit: &lt;span style="color: blue;"&gt;true&lt;/span&gt;);

&lt;span style="color: blue;"&gt;if&lt;/span&gt; (skipAuthorization)
{
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;return&lt;/span&gt;; 
}&lt;/span&gt;&lt;/span&gt;
&lt;/pre&gt;
&lt;br /&gt;
Publicado en &lt;a href="http://www.variablenotfound.com/"&gt;Variable not found&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/27752126-5698133456554506423?l=www.variablenotfound.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/8rJZhc65EC4tCG5lw0EmvBosf44/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/8rJZhc65EC4tCG5lw0EmvBosf44/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/8rJZhc65EC4tCG5lw0EmvBosf44/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/8rJZhc65EC4tCG5lw0EmvBosf44/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/vnf?a=kBFMl0lO71o:xjI7Xtn4Txw:ecdYMiMMAMM"&gt;&lt;img src="http://feeds.feedburner.com/~ff/vnf?d=ecdYMiMMAMM" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/vnf?a=kBFMl0lO71o:xjI7Xtn4Txw:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/vnf?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/vnf?a=kBFMl0lO71o:xjI7Xtn4Txw:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/vnf?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/vnf?a=kBFMl0lO71o:xjI7Xtn4Txw:4cEx4HpKnUU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/vnf?i=kBFMl0lO71o:xjI7Xtn4Txw:4cEx4HpKnUU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/vnf?a=kBFMl0lO71o:xjI7Xtn4Txw:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/vnf?i=kBFMl0lO71o:xjI7Xtn4Txw:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/vnf?a=kBFMl0lO71o:xjI7Xtn4Txw:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/vnf?i=kBFMl0lO71o:xjI7Xtn4Txw:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/vnf?a=kBFMl0lO71o:xjI7Xtn4Txw:I9og5sOYxJI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/vnf?d=I9og5sOYxJI" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/vnf/~4/kBFMl0lO71o" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.variablenotfound.com/feeds/5698133456554506423/comments/default" title="Enviar comentarios" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=27752126&amp;postID=5698133456554506423" title="0 comentarios" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/27752126/posts/default/5698133456554506423?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/27752126/posts/default/5698133456554506423?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/vnf/~3/kBFMl0lO71o/allowanonymous-en-asp-mvc-4.html" title="AllowAnonymous en ASP.NET MVC 4" /><author><name>José M. Aguilar</name><uri>http://www.blogger.com/profile/11683750380776435448</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://3.bp.blogspot.com/_O9D62hXq-ng/S6Hfc0RM0YI/AAAAAAAABOg/bEEA3DZ7Uac/S220/fb1.png" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://lh4.ggpht.com/-HqCe_h74tas/T4cHPfpT96I/AAAAAAAAB6w/YEQ2usuH4H8/s72-c/ASPNETMVC---COPIA2.png?imgmax=800" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://www.variablenotfound.com/2012/05/allowanonymous-en-asp-mvc-4.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A0IAQ3Y4cSp7ImA9WhVUFUU.&quot;"><id>tag:blogger.com,1999:blog-27752126.post-5838269949020630378</id><published>2012-05-21T10:39:00.001+02:00</published><updated>2012-05-21T10:39:02.839+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-05-21T10:39:02.839+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="enlaces" /><title>Enlaces interesantes 83</title><content type="html">&lt;a href="http://lh4.ggpht.com/-x4tjkIm0qIs/T7kReljwuuI/AAAAAAAACDE/1M-GH1zBDLU/s1600-h/image7_thumb_thumb_thumb_thumb_thumb%25255B1%25255D.png"&gt;&lt;img align="right" alt="Enlaces interesantes" border="0" height="129" src="http://lh5.ggpht.com/-DHJRSj991b0/T7kRf8d8LBI/AAAAAAAACDM/SrRwtDqSevc/image7_thumb_thumb_thumb_thumb_thumb.png?imgmax=800" style="background-image: none; border-width: 0px; display: inline; float: right; margin: 0px 0px 10px 10px; padding-left: 0px; padding-right: 0px; padding-top: 0px;" title="Enlaces interesantes" width="172" /&gt;&lt;/a&gt;Estos son los enlaces publicados en &lt;a href="http://www.facebook.com/variablenotfound"&gt;Variable not found en Facebook&lt;/a&gt; y &lt;a href="http://twitter.com/jmaguilar"&gt;Twitter&lt;/a&gt; del 14 al 20 de mayo de 2012. Espero que os resulten interesantes :-)&lt;br /&gt;
&lt;h4&gt;

.Net&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.kunal-chowdhury.com/2012/05/introducing-dotpeek-free-net-decompiler.html" title="Introducing “dotPeek” - A free .NET Decompiler by JetBrains"&gt;Introducing “dotPeek” - A free .NET Decompiler by JetBrains&lt;/a&gt;       &lt;br /&gt;Kunal Chowdhury &lt;/li&gt;
&lt;li&gt;&lt;a href="http://blackrabbitcoder.net/archive/2012/05/17/c.net-little-wonders-select-and-where-with-indexes.aspx"&gt;C#/.NET Little Wonders: Select() and Where() with Indexes&lt;/a&gt;       &lt;br /&gt;James Michael Hare&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.kodefuguru.com/post/2012/05/16/Post-increment-Operator-and-Precedence.aspx"&gt;Post-increment Operator and Precedence&lt;/a&gt;       &lt;br /&gt;Chris Eargle &lt;/li&gt;
&lt;li&gt;&lt;a href="http://geeks.ms/blogs/phurtado/archive/2012/05/16/var-en-c-si-o-var-no.aspx"&gt;Var en c# si, o var no&lt;/a&gt; y &lt;a href="http://geeks.ms/blogs/phurtado/archive/2012/05/17/var-ii-los-hermanos-de-simba.aspx"&gt;Var (II).Los hermanos de Simba&lt;/a&gt;       &lt;br /&gt;Pedro Hurtado &lt;/li&gt;
&lt;li&gt;&lt;a href="http://blogs.msdn.com/b/somasegar/archive/2012/05/16/net-improvements-for-cloud-and-server-applications.aspx"&gt;.NET 4.5 Improvements for Cloud and Server Applications&lt;/a&gt;       &lt;br /&gt;S. Somasegar &lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.blackwasp.co.uk/TypeAlias.aspx"&gt;Creating Type Aliases in C#&lt;/a&gt;       &lt;br /&gt;Richard Carr &lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.codeproject.com/Articles/76153/Six-important-NET-concepts-Stack-heap-value-types"&gt;Six important .NET concepts: Stack, heap, value types, reference types, boxing, and unboxing&lt;/a&gt;       &lt;br /&gt;Shivprasad koirala &lt;/li&gt;
&lt;li&gt;&lt;a href="http://geeks.ms/blogs/etomas/archive/2012/05/15/el-misterioso-caso-de-la-listbox-con-un-solo-elemento.aspx"&gt;El misterioso caso de la ListBox con un solo elemento&lt;/a&gt;       &lt;br /&gt;Eduard Tomás &lt;/li&gt;
&lt;li&gt;&lt;a href="http://geeks.ms/blogs/lruiz/archive/2012/05/14/pregunta-sobre-m-233-todos-extensores.aspx"&gt;[Pregunta] Sobre métodos extensores&lt;/a&gt;       &lt;br /&gt;Luis Ruiz Pavón &lt;a name='more'&gt;&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;

Asp.net&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.overflowexception.es/2012/05/generacion-de-clases-poco.html"&gt;Generación de clases POCO&lt;/a&gt;       &lt;br /&gt;Juan Manuel Fenoll &lt;/li&gt;
&lt;li&gt;&lt;a href="http://sebys.com.ar/2012/05/14/asp-net-web-api-aplicando-validaciones/"&gt;ASP.NET Web API – Aplicando Validaciones&lt;/a&gt;       &lt;br /&gt;Sebastián Henzenn &lt;/li&gt;
&lt;li&gt;&lt;a href="http://blogs.msdn.com/b/edhintz/archive/2012/05/14/additional-considerations-when-using-asp-net-mvc-cross-site-request-forgery-prevention.aspx"&gt;Additional Considerations When Using ASP.Net MVC Cross-site Request Forgery Prevention&lt;/a&gt;       &lt;br /&gt;Ed Hintz &lt;/li&gt;
&lt;li&gt;&lt;a href="http://blogs.msdn.com/b/henrikn/archive/2012/05/14/asp-net-web-api-updates-may-14.aspx"&gt;ASP.NET Web API Updates – May 14&lt;/a&gt;       &lt;br /&gt;Henrik F. Nielsen&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;

Data access&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://code-inside.de/blog-in/2012/05/18/introduction-to-redis-on-windows-redis-usage-with-net"&gt;Introduction to Redis on Windows &amp;amp; Redis usage with .NET&lt;/a&gt;       &lt;br /&gt;Code Inside Team&lt;/li&gt;
&lt;li&gt;&lt;a href="http://blogs.msdn.com/b/adonet/archive/2012/05/15/ef5-release-candidate-available-on-nuget.aspx"&gt;EF5 Release Candidate Available on NuGet&lt;/a&gt;       &lt;br /&gt;Entity Framework Team&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;

Html/Css/Javascript&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.returngis.net/2012/05/multiple-backgrounds-con-css-3/" title="Permanent Link to Múltiples Backgrounds con CSS 3"&gt;Múltiples Backgrounds con CSS 3&lt;/a&gt;       &lt;br /&gt;Gisela Torres &lt;/li&gt;
&lt;li&gt;&lt;a href="http://css-tricks.com/sass-vs-less/"&gt;SASS vs. LESS&lt;/a&gt;       &lt;br /&gt;Chris Coyier &lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.impressivewebs.com/jquery-javascript-tools-plugins/"&gt;jQuery/JavaScript Tools and Plugins Worth Checking Out&lt;/a&gt;       &lt;br /&gt;Louis Lazaris &lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.knockmeout.net/2012/05/quick-tip-skip-binding.html"&gt;Quick Tip: Telling Knockout to Skip Binding Part of a Page&lt;/a&gt;       &lt;br /&gt;Ryan Niemeyer &lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.returngis.net/2012/05/css-media-queries-responsive-web-design/"&gt;CSS Media Queries (Responsive Web Design)&lt;/a&gt;       &lt;br /&gt;Gisela Torres &lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.etnassoft.com/2012/05/17/mejorando-el-rendimiento-con-el-api-dom-desde-javascript/"&gt;Mejorando el rendimiento con el API DOM desde Javascript&lt;/a&gt;       &lt;br /&gt;Carlos Benítez &lt;/li&gt;
&lt;li&gt;&lt;a href="http://benalman.com/news/2012/05/multiple-var-statements-javascript/"&gt;Multiple var statements in JavaScript, not superfluous&lt;/a&gt;       &lt;br /&gt;Ben Alman &lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;

Visual Studio/Complementos/Herramientas&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://weblogs.asp.net/owscott/archive/2012/05/14/introducing-testing-domain-localtest-me.aspx"&gt;Introducing Testing Domain - localtest.me&lt;/a&gt;       &lt;br /&gt;Scott Forsyth &lt;/li&gt;
&lt;li&gt;&lt;a href="http://blogs.msdn.com/b/jasonz/archive/2012/05/10/my-favorite-features-improved-tooling-in-visual-studio-11-for-javascript-developers.aspx"&gt;My Favorite Features: Improved Tooling in Visual Studio 11 for JavaScript Developers&lt;/a&gt;       &lt;br /&gt;Jason Zanders &lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;

Otros&amp;nbsp;&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://jmalarcon.es/post/Drosophila-ajedrez-e-innovacion-en-la-empresa.aspx" title="Drosophila, ajedrez e innovación en la empresa tecnológica"&gt;Drosophila, ajedrez e innovación en la empresa tecnológica&lt;/a&gt;       &lt;br /&gt;José Manuel Alarcón&lt;/li&gt;
&lt;/ul&gt;
Y no olvidéis que podéis seguir esta información en vivo y en directo desde &lt;a href="http://www.facebook.com/variablenotfound"&gt;Variable not found en Facebook&lt;/a&gt;, o a través de &lt;a href="http://twitter.com/jmaguilar"&gt;Twitter&lt;/a&gt;.     &lt;br /&gt;
&lt;br /&gt;
Publicado en &lt;a href="http://www.variablenotfound.com/"&gt;Variable not found&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/27752126-5838269949020630378?l=www.variablenotfound.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/gVuDlxiytVtsjABCI3CN14Yeib8/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/gVuDlxiytVtsjABCI3CN14Yeib8/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/gVuDlxiytVtsjABCI3CN14Yeib8/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/gVuDlxiytVtsjABCI3CN14Yeib8/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/vnf?a=0lTJuQBDk6Q:9K4wTlKFG2c:ecdYMiMMAMM"&gt;&lt;img src="http://feeds.feedburner.com/~ff/vnf?d=ecdYMiMMAMM" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/vnf?a=0lTJuQBDk6Q:9K4wTlKFG2c:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/vnf?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/vnf?a=0lTJuQBDk6Q:9K4wTlKFG2c:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/vnf?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/vnf?a=0lTJuQBDk6Q:9K4wTlKFG2c:4cEx4HpKnUU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/vnf?i=0lTJuQBDk6Q:9K4wTlKFG2c:4cEx4HpKnUU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/vnf?a=0lTJuQBDk6Q:9K4wTlKFG2c:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/vnf?i=0lTJuQBDk6Q:9K4wTlKFG2c:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/vnf?a=0lTJuQBDk6Q:9K4wTlKFG2c:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/vnf?i=0lTJuQBDk6Q:9K4wTlKFG2c:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/vnf?a=0lTJuQBDk6Q:9K4wTlKFG2c:I9og5sOYxJI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/vnf?d=I9og5sOYxJI" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/vnf/~4/0lTJuQBDk6Q" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.variablenotfound.com/feeds/5838269949020630378/comments/default" title="Enviar comentarios" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=27752126&amp;postID=5838269949020630378" title="0 comentarios" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/27752126/posts/default/5838269949020630378?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/27752126/posts/default/5838269949020630378?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/vnf/~3/0lTJuQBDk6Q/enlaces-interesantes-83.html" title="Enlaces interesantes 83" /><author><name>José M. Aguilar</name><uri>http://www.blogger.com/profile/11683750380776435448</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://3.bp.blogspot.com/_O9D62hXq-ng/S6Hfc0RM0YI/AAAAAAAABOg/bEEA3DZ7Uac/S220/fb1.png" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://lh5.ggpht.com/-DHJRSj991b0/T7kRf8d8LBI/AAAAAAAACDM/SrRwtDqSevc/s72-c/image7_thumb_thumb_thumb_thumb_thumb.png?imgmax=800" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://www.variablenotfound.com/2012/05/enlaces-interesantes-83.html</feedburner:origLink></entry><entry gd:etag="W/&quot;Ak4NQH4yeSp7ImA9WhVUEUo.&quot;"><id>tag:blogger.com,1999:blog-27752126.post-5937086874500553024</id><published>2012-05-16T13:53:00.000+02:00</published><updated>2012-05-16T16:36:31.091+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-05-16T16:36:31.091+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="charlas" /><category scheme="http://www.blogger.com/atom/ns#" term="auges" /><category scheme="http://www.blogger.com/atom/ns#" term="signalr" /><category scheme="http://www.blogger.com/atom/ns#" term="eventos" /><title>[Auges] Webcast sobre SignalR: ¡uau!</title><content type="html">&lt;img align="right" alt="AUGES: ASP.NET User Group España" border="0" src="http://lh4.ggpht.com/-r9SV68Em5Jc/TnopO3YqltI/AAAAAAAABno/Oiiof6sGueA/image%25255B2%25255D.png?imgmax=800" style="margin: 0px 0px 10px 10px;" title="AUGES: ASP.NET User Group España" width="200" /&gt;Simplemente informaros de que el próximo jueves 24 de mayo a las 19:00h (hora peninsular española), participaré en una charla con &lt;a href="http://auges.org/"&gt;AUGES&lt;/a&gt; sobre SignalR, esa pequeña maravilla de la que ya &lt;a href="http://www.variablenotfound.com/search/label/signalr"&gt;os he hablado por aquí en varias ocasiones&lt;/a&gt;, una ayuda imprescindible a la hora de crear sistemas interactivos, multiusuario y en tiempo real para la web.&lt;br /&gt;
&lt;br /&gt;
El “cartel” oficial del evento es el siguiente:&lt;br /&gt;
&lt;br /&gt;
&lt;div style="-moz-border-radius: 5px; -moz-box-shadow: 5px 5px 5px #888; -webkit-box-shadow: 5px 5px 5px #888; background-color: ivory; border-radius: 5px; border: 1px solid black; box-shadow: 5px 5px 5px #888; margin: 10px auto; padding: 10px; width: 509px;"&gt;
&lt;h4 style="margin-top: 0px;"&gt;


SIGNALR: APLICACIONES MULTIUSUARIO, ASÍNCRONAS, Y EN TIEMPO REAL. ¡UAU!&lt;/h4&gt;
¿Te has preguntado alguna vez cómo es posible que en una aplicación web como Google Docs &lt;strong&gt;varios usuarios puedan interactuar&lt;/strong&gt; de forma simultánea? ¿Te interesa &lt;strong&gt;la tecnología que usan los grandes&lt;/strong&gt; como Facebook o Twitter para informarte en tiempo real de que algo ha ocurrido? ¿Piensas que &lt;strong&gt;crear un chat&lt;/strong&gt; basado puramente en ASP.NET no es tarea sencilla? ¿Te gustaría que el servidor pudiera &lt;strong&gt;enviar información a los clientes&lt;/strong&gt; en cualquier momento, sin esperar a que éstos soliciten una página o recurso?&lt;br /&gt;
&lt;br /&gt;
&lt;img alt="image" border="0" height="54" src="http://lh4.ggpht.com/-3wcP7VaADnw/T607SXZZDAI/AAAAAAAACCQ/8gTEMgwQ3aQ/image%25255B7%25255D.png?imgmax=800" style="background-image: none; border: 0px currentColor; display: inline; float: right; margin: 0px 0px 10px 10px; padding-left: 0px; padding-right: 0px; padding-top: 0px;" title="image" width="54" /&gt;Si has respondido que sí a alguna de estas preguntas, &lt;strong&gt;SignalR te entusiasmará&lt;/strong&gt;. Es un marco de trabajo open source que permite saltarse las barreras impuestas por HTTP y su clásico modelo de petición/respuesta para conseguir aplicaciones más interactivas, dinámicas y colaborativas, en las que el servidor toma la iniciativa.&lt;br /&gt;
&lt;br /&gt;
No te pierdas este evento y aprende a poner un factor “¡uau!” en tus desarrollos.&lt;/div&gt;
&lt;br /&gt;
Os recuerdo que se trata de &lt;strong&gt;un Webcast&lt;/strong&gt;, o sea, que podéis asistir a este evento desde vuestro sillón favorito, acompañados de una buena cerveza y un saco de palomitas. Y por supuesto, es &lt;strong&gt;totalmente gratuito&lt;/strong&gt;.&lt;br /&gt;
&lt;br /&gt;
Lo único que debéis hacer para poder asistir es registraros:&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;Día: jueves 24 de mayo, 19:00h (hora peninsular española)&lt;/li&gt;
&lt;li&gt;URL del registro: &lt;a href="https://msevents.microsoft.com/CUI/EventDetail.aspx?EventID=1032512978&amp;amp;Culture=es-ES" title="https://msevents.microsoft.com/CUI/EventDetail.aspx?EventID=1032512978&amp;amp;Culture=es-ES"&gt;https://msevents.microsoft.com/CUI/EventDetail.aspx?EventID=1032512978&amp;amp;Culture=es-ES&lt;/a&gt; &lt;/li&gt;
&lt;/ul&gt;
No me faltéis, que paso lista ;-)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/27752126-5937086874500553024?l=www.variablenotfound.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/Z2EmKB85Krv482L7EgLpeqhKtoc/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/Z2EmKB85Krv482L7EgLpeqhKtoc/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/Z2EmKB85Krv482L7EgLpeqhKtoc/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/Z2EmKB85Krv482L7EgLpeqhKtoc/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/vnf?a=pUYTPASIuPI:B_-9KpTd6ps:ecdYMiMMAMM"&gt;&lt;img src="http://feeds.feedburner.com/~ff/vnf?d=ecdYMiMMAMM" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/vnf?a=pUYTPASIuPI:B_-9KpTd6ps:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/vnf?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/vnf?a=pUYTPASIuPI:B_-9KpTd6ps:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/vnf?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/vnf?a=pUYTPASIuPI:B_-9KpTd6ps:4cEx4HpKnUU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/vnf?i=pUYTPASIuPI:B_-9KpTd6ps:4cEx4HpKnUU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/vnf?a=pUYTPASIuPI:B_-9KpTd6ps:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/vnf?i=pUYTPASIuPI:B_-9KpTd6ps:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/vnf?a=pUYTPASIuPI:B_-9KpTd6ps:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/vnf?i=pUYTPASIuPI:B_-9KpTd6ps:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/vnf?a=pUYTPASIuPI:B_-9KpTd6ps:I9og5sOYxJI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/vnf?d=I9og5sOYxJI" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/vnf/~4/pUYTPASIuPI" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.variablenotfound.com/feeds/5937086874500553024/comments/default" title="Enviar comentarios" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=27752126&amp;postID=5937086874500553024" title="6 comentarios" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/27752126/posts/default/5937086874500553024?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/27752126/posts/default/5937086874500553024?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/vnf/~3/pUYTPASIuPI/auges-webcast-sobre-signalr-uau.html" title="[Auges] Webcast sobre SignalR: ¡uau!" /><author><name>José M. Aguilar</name><uri>http://www.blogger.com/profile/11683750380776435448</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://3.bp.blogspot.com/_O9D62hXq-ng/S6Hfc0RM0YI/AAAAAAAABOg/bEEA3DZ7Uac/S220/fb1.png" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://lh4.ggpht.com/-r9SV68Em5Jc/TnopO3YqltI/AAAAAAAABno/Oiiof6sGueA/s72-c/image%25255B2%25255D.png?imgmax=800" height="72" width="72" /><thr:total>6</thr:total><feedburner:origLink>http://www.variablenotfound.com/2012/05/auges-webcast-sobre-signalr-uau.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A0AEQXg6fSp7ImA9WhVVGUo.&quot;"><id>tag:blogger.com,1999:blog-27752126.post-3882771534374934261</id><published>2012-05-14T09:15:00.000+02:00</published><updated>2012-05-14T09:15:00.615+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-05-14T09:15:00.615+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="enlaces" /><title>Enlaces interesantes 82</title><content type="html">&lt;a href="http://lh3.ggpht.com/-QAFlO4T-9Gg/T7Clv0pTabI/AAAAAAAACCc/yZHukT9Im38/s1600-h/image7_thumb_thumb_thumb_thumb_thumb.png"&gt;&lt;img align="right" alt="image7_thumb_thumb_thumb_thumb_thumb[2]" border="0" height="129" src="http://lh3.ggpht.com/-r8hftloxDLI/T7ClxD2evEI/AAAAAAAACCk/VrS_3GREbGA/image7_thumb_thumb_thumb_thumb_thumb%25255B1%25255D.png?imgmax=800" style="background-image: none; border-width: 0px; display: inline; float: right; margin: 0px 0px 10px 10px; padding-left: 0px; padding-right: 0px; padding-top: 0px;" title="image7_thumb_thumb_thumb_thumb_thumb[2]" width="172" /&gt;&lt;/a&gt;Estos son los enlaces publicados en &lt;a href="http://www.facebook.com/variablenotfound"&gt;Variable not found en Facebook&lt;/a&gt; y &lt;a href="http://twitter.com/jmaguilar"&gt;Twitter&lt;/a&gt; del 7 al 13 de mayo de 2012. Espero que os resulten interesantes :-)&lt;br /&gt;
&lt;h4&gt;
.Net&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://sblakemore.com/blog/post/What-JavaScript-taught-me-about-C-–-Understanding-‘Access-to-modified-closure’.aspx"&gt;&lt;strong&gt;What JavaScript taught me about C# – Understanding ‘Access to modified closure’&lt;/strong&gt;&lt;/a&gt;       &lt;br /&gt;
Sean Blakemore &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="http://geeks.ms/blogs/etomas/archive/2012/05/10/cargar-informaci-243-n-de-reflection-sin-cargar-el-assembly.aspx"&gt;Cargar información de reflection sin cargar el assembly&lt;/a&gt;&lt;/strong&gt;       &lt;br /&gt;
Eduard Tomás &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="http://blog.koalite.com/2012/05/hebras-lambdas-y-bugs/"&gt;Hebras, lambdas… y bugs&lt;/a&gt;&lt;/strong&gt;       &lt;br /&gt;
Juan María Hernández &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="http://www.codeproject.com/Articles/380769/Creating-an-FTP-Server-in-Csharp"&gt;Creating an FTP Server in C#&lt;/a&gt;&lt;/strong&gt;       &lt;br /&gt;
Rick Bassham &lt;a name='more'&gt;&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;
Asp.net&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.strathweb.com/2012/05/output-caching-in-asp-net-web-api/" title="Permalink to Output caching in ASP.NET Web API"&gt;&lt;strong&gt;Output caching in ASP.NET Web API&lt;/strong&gt;&lt;/a&gt;       &lt;br /&gt;
Filip W. &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="http://professionalaspnet.com/archive/2012/05/11/How-to-Include-Views-in-ASP.NET-MVC-_2600_-WebMatrix-Razor.aspx"&gt;How to Include Views in ASP.NET MVC &amp;amp; WebMatrix Razor&lt;/a&gt; &lt;/strong&gt;      &lt;br /&gt;
Chris Love &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="http://blogs.msdn.com/b/jmstall/archive/2012/05/11/webapi-parameter-binding-under-the-hood.aspx"&gt;WebAPI Parameter binding under the hood&lt;/a&gt;&lt;/strong&gt;       &lt;br /&gt;
Mike Stall &lt;/li&gt;
&lt;li&gt;&lt;a href="http://tpeczek.blogspot.com.es/2012/05/another-early-look-at-jquery-ui-grid-in.html" title="Another early look at jQuery UI Grid in ASP.NET MVC – Data Types, Dataview, Pager, Sorting and F"&gt;&lt;strong&gt;Another early look at jQuery UI Grid in ASP.NET MVC – Data Types, Dataview, Pager, Sorting and Filtering&lt;/strong&gt;&lt;/a&gt;       &lt;br /&gt;
Tomasz Pęczek &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="http://www.dotnetcurry.com/ShowArticle.aspx?ID=807"&gt;Download Files in ASP.NET MVC 3 using Controller Action&lt;/a&gt;&lt;/strong&gt;       &lt;br /&gt;
Mahesh Sabnis &lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.west-wind.com/weblog/posts/2012/May/08/Passing-multiple-POST-parameters-to-Web-API-Controller-Methods"&gt;&lt;strong&gt;Passing multiple POST parameters to Web API Controller Methods&lt;/strong&gt;&lt;/a&gt;       &lt;br /&gt;
Rick Strahl &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="http://www.knockmeout.net/2012/05/knockout-2-dot-1-is-out.html"&gt;Knockout 2.1 Is Out&lt;/a&gt;&lt;/strong&gt;       &lt;br /&gt;
Ryan Niemeyer &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="http://geeks.ms/blogs/phurtado/archive/2012/05/08/el-scroll-infinito.aspx"&gt;El scroll infinito&lt;/a&gt;&lt;/strong&gt;       &lt;br /&gt;
Pedro Hurtado &lt;/li&gt;
&lt;li&gt;&lt;a href="http://michaelcrump.net/a-xaml-guy-digs-into-asp-net-mvc4-part-2-of"&gt;&lt;strong&gt;A XAML Guy digs into ASP.NET MVC4 (Part 2 of ?)&lt;/strong&gt;&lt;/a&gt;       &lt;br /&gt;
Michael Crump &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="http://blogs.msdn.com/b/kiranchalla/archive/2012/05/06/in-memory-client-amp-host-and-integration-testing-of-your-web-api-service.aspx"&gt;In memory client, host and integration testing of your Web API service&lt;/a&gt;&lt;/strong&gt;       &lt;br /&gt;
Kiran Challa &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="http://blogs.telerik.com/blogs/posts/12-05-08/there-s-a-tool-for-that-13-essential-tools-for-the-ninja-web-developer.aspx"&gt;There’s a Tool for That: 13 Essential Tools for the Ninja Web Developer&lt;/a&gt;&lt;/strong&gt;       &lt;br /&gt;
Joshua Holt &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="http://visualstudiomagazine.com/articles/2012/05/04/implementing-websockets-in-wcf-4_5.aspx"&gt;Implementing WebSockets in WCF 4.5&lt;/a&gt;&lt;/strong&gt;       &lt;br /&gt;
Peter Vogel &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="http://sebys.com.ar/2012/05/05/asp-net-web-api-paso-a-paso/"&gt;ASP.NET Web API paso a paso&lt;/a&gt;&lt;/strong&gt;       &lt;br /&gt;
Sebastián Henzenn &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="http://weblogs.asp.net/jgalloway/archive/2012/05/04/asp-net-mvc-authentication-customizing-authentication-and-authorization-the-right-way.aspx"&gt;ASP.NET MVC Authentication - Customizing Authentication and Authorization The Right Way&lt;/a&gt;&lt;/strong&gt;       &lt;br /&gt;
Jon Galloway &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="http://blogs.msdn.com/b/rjacobs/archive/2012/05/06/extending-asp-net-mvc-account-registration-with-workflow-wf4.aspx"&gt;Extending ASP.NET MVC Account Registration with Workflow (WF4)&lt;/a&gt;&lt;/strong&gt;       &lt;br /&gt;
Ron Jacobs &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="http://weblogs.asp.net/davidfowler/archive/2012/05/04/api-improvements-made-in-signalr-0-5.aspx"&gt;API Improvements made in SignalR 0.5&lt;/a&gt;&lt;/strong&gt;       &lt;br /&gt;
David Fowler&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;
Azure / Cloud&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="http://www.everything-microsoft.com/2012/05/08/microsoft-renames-azure-services/"&gt;Microsoft Renames Azure Services&lt;/a&gt;&lt;/strong&gt;       &lt;br /&gt;
Martin Brinkmann&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;
Conceptos&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://blogs.msdn.com/b/ericlippert/archive/2012/05/07/guid-guide-part-three.aspx"&gt;&lt;strong&gt;GUID guide, part three&lt;/strong&gt;&lt;/a&gt;       &lt;br /&gt;
Eric Lippert &lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;
Data access&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://martinfowler.com/bliki/OrmHate.html"&gt;&lt;strong&gt;OrmHate&lt;/strong&gt;&lt;/a&gt;       &lt;br /&gt;
Martin Fowler &lt;/li&gt;
&lt;li&gt;&lt;a href="http://blogs.msdn.com/b/adonet/archive/2012/05/08/ef5-sample-provider-published.aspx"&gt;&lt;strong&gt;EF5 Sample Provider Published&lt;/strong&gt;&lt;/a&gt;       &lt;br /&gt;
Pawel Kadluczka &lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;
Html/Css/Javascript&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.stubbornella.org/content/2012/05/02/cross-browser-debugging-css/" title="Permanent Link- Cross-Browser Debugging CSS"&gt;&lt;strong&gt;Cross-Browser Debugging CSS&lt;/strong&gt;&lt;/a&gt;       &lt;br /&gt;
Nicole Sullivan &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="http://net.tutsplus.com/tutorials/javascript-ajax/prototypes-in-javascript-what-you-need-to-know/"&gt;Prototypes in JavaScript&lt;/a&gt;&lt;/strong&gt;       &lt;br /&gt;
Leigh Kaszick &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="http://www.nczonline.net/blog/2012/05/08/working-with-files-in-javascript-part-1"&gt;Working with files in JavaScript, Part 1&lt;/a&gt;&lt;/strong&gt;       &lt;br /&gt;
Nicholas C. Zakas &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="http://html5doctor.com/html5-audio-the-state-of-play/"&gt;HTML5 Audio — The State of Play&lt;/a&gt;&lt;/strong&gt;       &lt;br /&gt;
Mark Boas &lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.strathweb.com/2012/05/native-html5-push-notifications-with-asp-net-web-api-and-knockout-js/" title="Permalink to Native HTML5 push notifications with ASP.NET Web API and Knockout.js"&gt;&lt;strong&gt;Native HTML5 push notifications with ASP.NET Web API and Knockout.js&lt;/strong&gt;&lt;/a&gt;       &lt;br /&gt;
Filip W. &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="http://net.tutsplus.com/tutorials/javascript-ajax/14-reason-why-nobody-used-your-jquery-plugin/"&gt;14 Reasons Why Nobody Used Your jQuery Plugin&lt;/a&gt;&lt;/strong&gt;       &lt;br /&gt;
Jonathan Cutrell&lt;/li&gt;
&lt;ul&gt;&lt;/ul&gt;
&lt;/ul&gt;
&lt;h4&gt;
Visual Studio/Complementos/Herramientas&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="http://blogs.jetbrains.com/dotnet/2012/05/dotpeek-10-is-released/"&gt;dotPeek 1.0 is Released&lt;/a&gt;&lt;/strong&gt;       &lt;br /&gt;
Jura Gorohovsky (vía @hhariri) &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="http://www.genbetadev.com/gestores-de-contenido/etiquetando-haciendo-crecer-nuestro-arbol-del-repositorio-de-codigo"&gt;Etiquetando,haciendo crecer nuestro árbol del repositorio de código&lt;/a&gt;&lt;/strong&gt; y &lt;strong&gt;&lt;a href="http://www.genbetadev.com/gestores-de-contenido/branching-haciendo-crecer-nuestro-arbol-del-repositorio-de-codigo"&gt;Branching, haciendo crecer nuestro árbol del repositorio de código&lt;/a&gt;&lt;/strong&gt;       &lt;br /&gt;
Juan Quijano &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="http://blogs.msdn.com/b/visualstudio/archive/2012/05/08/visual-studio-11-user-interface-updates-coming-in-rc.aspx"&gt;Visual Studio 11 User Interface Updates Coming in RC&lt;/a&gt;&lt;/strong&gt;       &lt;br /&gt;
Monty Hammontree&amp;nbsp;&amp;nbsp; &lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;
Otros&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.hanselman.com/blog/TheFloppyDiskMeansSaveAnd14OtherOldPeopleIconsThatDontMakeSenseAnymore.aspx"&gt;&lt;strong&gt;The Floppy Disk means Save, and 14 other old people Icons that don't make sense anymore&lt;/strong&gt;&lt;/a&gt;       &lt;br /&gt;
Scott Hanselman &lt;/li&gt;
&lt;/ul&gt;
Y no olvidéis que podéis seguir esta información en vivo y en directo desde &lt;a href="http://www.facebook.com/variablenotfound"&gt;Variable not found en Facebook&lt;/a&gt;, o a través de &lt;a href="http://twitter.com/jmaguilar"&gt;Twitter&lt;/a&gt;.     &lt;br /&gt;
&lt;br /&gt;
Publicado en &lt;a href="http://www.variablenotfound.com/"&gt;Variable not found&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/27752126-3882771534374934261?l=www.variablenotfound.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/Ls1Q1M7V2BPRKSA5C9lBCxAR57o/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/Ls1Q1M7V2BPRKSA5C9lBCxAR57o/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/Ls1Q1M7V2BPRKSA5C9lBCxAR57o/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/Ls1Q1M7V2BPRKSA5C9lBCxAR57o/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/vnf?a=GC83Y6j9wJg:i3ChVOptABw:ecdYMiMMAMM"&gt;&lt;img src="http://feeds.feedburner.com/~ff/vnf?d=ecdYMiMMAMM" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/vnf?a=GC83Y6j9wJg:i3ChVOptABw:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/vnf?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/vnf?a=GC83Y6j9wJg:i3ChVOptABw:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/vnf?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/vnf?a=GC83Y6j9wJg:i3ChVOptABw:4cEx4HpKnUU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/vnf?i=GC83Y6j9wJg:i3ChVOptABw:4cEx4HpKnUU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/vnf?a=GC83Y6j9wJg:i3ChVOptABw:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/vnf?i=GC83Y6j9wJg:i3ChVOptABw:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/vnf?a=GC83Y6j9wJg:i3ChVOptABw:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/vnf?i=GC83Y6j9wJg:i3ChVOptABw:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/vnf?a=GC83Y6j9wJg:i3ChVOptABw:I9og5sOYxJI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/vnf?d=I9og5sOYxJI" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/vnf/~4/GC83Y6j9wJg" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.variablenotfound.com/feeds/3882771534374934261/comments/default" title="Enviar comentarios" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=27752126&amp;postID=3882771534374934261" title="0 comentarios" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/27752126/posts/default/3882771534374934261?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/27752126/posts/default/3882771534374934261?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/vnf/~3/GC83Y6j9wJg/enlaces-interesantes-82.html" title="Enlaces interesantes 82" /><author><name>José M. Aguilar</name><uri>http://www.blogger.com/profile/11683750380776435448</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://3.bp.blogspot.com/_O9D62hXq-ng/S6Hfc0RM0YI/AAAAAAAABOg/bEEA3DZ7Uac/S220/fb1.png" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://lh3.ggpht.com/-r8hftloxDLI/T7ClxD2evEI/AAAAAAAACCk/VrS_3GREbGA/s72-c/image7_thumb_thumb_thumb_thumb_thumb%25255B1%25255D.png?imgmax=800" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://www.variablenotfound.com/2012/05/enlaces-interesantes-82.html</feedburner:origLink></entry><entry gd:etag="W/&quot;Ak4ESH84fCp7ImA9WhVVFkk.&quot;"><id>tag:blogger.com,1999:blog-27752126.post-4401529557145222034</id><published>2012-05-09T12:33:00.000+02:00</published><updated>2012-05-10T13:21:49.134+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-05-10T13:21:49.134+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="variablenotfound.com" /><category scheme="http://www.blogger.com/atom/ns#" term="blogging" /><category scheme="http://www.blogger.com/atom/ns#" term="autobombo" /><category scheme="http://www.blogger.com/atom/ns#" term="aniversario" /><title>6 años 6. Y de la variable, ni rastro…</title><content type="html">&lt;img align="right" alt="6 años 6" border="0" height="121" src="http://lh4.ggpht.com/-AYITg711sOU/T6pFQ6ueVXI/AAAAAAAACBs/_GlwjkmGixk/image6.png?imgmax=800" style="background-image: none; border-width: 0px; display: inline; float: right; margin: 0px 0px 10px 10px; padding-left: 0px; padding-right: 0px; padding-top: 0px;" title="6 años 6" width="144" /&gt;“De hoy no pasa”. Era 8 de mayo de 2006; aunque no puedo recordarlo, seguro que estuve toda la jornada trabajando con mi flamante Visual Studio 2005 en algún proyecto basado en un primitivo ASP.NET.&lt;br /&gt;
&lt;br /&gt;
Lo que sí sé es que al llegar a casa inicié Windows XP, abrí Internet Explorer 6 y navegué hacia &lt;a href="http://www.blogger.com/"&gt;blogger.com&lt;/a&gt; con la intención de crear un blog. No tenía grandes aspiraciones, pero estaba seguro de que la travesía &lt;a href="http://www.variablenotfound.com/2006/05/paren-el-tren-que-me-subo.html"&gt;iba a ser larga&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;
Desde entonces, a veces con más acierto y otras con menos, he intentado ir dejando plasmado por aquí todo aquello que me ha parecido que podía interesar a alguien, o incluso serme útil en el futuro: novedades, trucos, tecnologías, herramientas, artículos… Y seis años después, tras más de quinientos post, más de mil comentarios, más de medio millón de consultas, no puedo hacer otra cosa que &lt;strong&gt;agradeceros el apoyo&lt;/strong&gt; que siempre habéis dado los protagonistas más importantes en este proyecto: vosotros. &lt;br /&gt;
&lt;br /&gt;
Y ahora, como viene siendo costumbre, vamos a hacer un breve análisis retrospectivo de estos años, en los que hemos pasado por distintas etapas.&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;img align="right" alt="Estadísticas de acceso" border="0" height="79" src="http://lh3.ggpht.com/_O9D62hXq-ng/Sf22tJ65yOI/AAAAAAAABCk/kcnHZYI1yIg/image%5B18%5D.png?imgmax=800" style="display: inline; float: right; margin: 0px 0px 10px 10px;" title="Estadísticas de acceso" width="342" /&gt;Año 1: la travesía del desierto (mayo 2006 - mayo 2007)&lt;/strong&gt;, en el que sólo yo visitaba el blog. Triste pero cierto. Los que habéis empezado una bitácora en solitario reconoceréis este patrón de visitas, donde los picos que superan las cinco páginas vistas al día se deben, con toda seguridad, a pruebas propias.       &lt;br /&gt;      &lt;br /&gt;Dicen que muchos blogs mueren en este primer año de vida precisamente por el escaso retorno que tiene la inversión de tiempo que requiere su puesta en marcha, pero según he comprobado, &lt;strong&gt;sólo es cuestión de paciencia&lt;/strong&gt;: si le pones empeño, entusiasmo y cariño, es posible cambiar las cosas.&lt;br /&gt;&amp;nbsp; &amp;nbsp;     &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Año 2: el despegue (mayo 2007 - mayo 2008)&lt;/strong&gt;, me lo tomé algo más en serio y comencé a difundir los posts por RSS (hasta entonces no lo hacía!), a utilizar el dominio variablenotfound.com, di al sitio un diseño más atractivo y alejado de las plantillas estándar de Blogger, lo incluí en directorios y agregadores, y comencé a hacer crossposting en geeks.ms. Todas estas acciones se tradujeron en un incremento del 2.500% del número de visitas, y acabamos el año con 380 suscriptores al feed. Impresionante.&lt;br /&gt;&amp;nbsp; &amp;nbsp;     &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Año 3: la consolidación (mayo 2008 – mayo 2009)&lt;/strong&gt;, en el que no realicé cambios de calado, pero ya empezó a notarse la antigüedad del blog y su aumento de posición en buscadores. Ese año crecimos en número de visitas un 75% y más del 100% en suscriptores a los feeds.&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Año 4: la variable social (mayo 2009 – mayo 2010)&lt;/strong&gt;, donde comencé a utilizar Facebook y Twitter como canales adicionales de difusión. Mientras, continuaba creciendo el número de amigos del blog, rozando ya los 100.000 usuarios únicos absolutos al año (sumando las visitas de variablenotfound.com y su eco en geeks.ms).&lt;br /&gt;&amp;nbsp;       &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Año 5: la variable física (mayo 2010 – mayo 2011)&lt;/strong&gt;. En este periodo lo más destacable fue, sin duda, el haber “salido de la cueva” y comenzar a participar en eventos de la comunidad como el &lt;a href="http://www.variablenotfound.com/2010/10/de-vuelta-del-ttt2010-enlaces.html"&gt;TTT/Open Day&lt;/a&gt;, en la gira &lt;a href="http://www.variablenotfound.com/2011/04/make-web-not-war-materiales-y-videos.html"&gt;Make Web Not War&lt;/a&gt; de Microsoft, o a relacionarme con grupos locales y, sobre todo, a conocer en persona a gente estupenda a los que seguía desde mucho tiempo atrás. Y ya en el terreno más virtual, más de 10.000 visitas/mes al blog y de mil suscriptores a los RSS seguían haciendo crecer este proyecto.      &lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;


Año 6 (mayo 2011-mayo 2012): Variable premiada&lt;/h3&gt;
&lt;img align="right" alt="Microsoft MVP" border="0" height="121" src="http://lh4.ggpht.com/-7kzKjlg18Ts/T6pFR7qm-LI/AAAAAAAACB0/BYI1z4oKwno/image%25255B2%25255D.png?imgmax=800" style="background-image: none; border: 0px currentColor; display: inline; float: right; margin: 0px 0px 10px 10px; padding-left: 0px; padding-right: 0px; padding-top: 0px;" title="Microsoft MVP" width="77" /&gt;Siempre he pensado que no hay mejor premio que el hecho de poder escribir sobre lo que me gusta, y que estéis siempre ahí… pero eso no quita que puedan alegrarte otro tipo de reconocimientos, y es uno de los principales hitos de este año que ahora cerramos :-)&lt;br /&gt;
&lt;br /&gt;
El nombramiento como &lt;a href="http://www.variablenotfound.com/2011/07/microsoft-mvp-2011.html"&gt;Microsoft MVP&lt;/a&gt; el pasado mes de julio fue un inesperado alegrón de esos que dejan marca, y que sirven como aliciente para seguir trabajando duro. Como diría su majestad, es para mí un orgullo y una satisfacción el poder entrar a formar parte de esta familia, y un privilegio poder compartir buenos ratos con gente a los que considero auténticos números uno en todos los sentidos. Y bueno, por no hablar de la oportunidad de asistir al MVP Summit y conocer la sede de Microsoft, que ha sido la &lt;a href="http://www.variablenotfound.com/2012/03/experiencia-summit.html"&gt;experiencia del año&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
Respecto al blog, &lt;strong&gt;seguimos creciendo de forma considerable&lt;/strong&gt;. Según Google Analytics este año hemos registrado un incremento del 40% respecto al año pasado. En estos momentos, se consultan más de 200.000 páginas al año en variablenotfound.com; si sumamos las consultas a los mismos artículos realizadas desde geeks.ms llegaríamos a los 300.000.&lt;br /&gt;
&lt;br /&gt;
También siguen en ascenso las otras fórmulas para relacionarse con la &lt;em&gt;comunidad de la variable&lt;/em&gt;. El número de amigos que prefieren acceder a los contenidos a través de RSS, han crecido más del 20%, superando ya los 1.350 suscriptores. En &lt;a href="http://twitter.com/jmaguilar"&gt;Twitter&lt;/a&gt; rondamos los 500 followers, lo que supone un incremento mayor del 100%, y la página de Variable not found en Facebook supera los 350 amigos (+80% respecto al año pasado).&lt;br /&gt;
&lt;br /&gt;
En general, Variable not found sigue siendo un blog&lt;em&gt; &lt;/em&gt;humilde y de poca monta en términos generales, pero, teniendo en cuenta su gran verticalidad temática, estas cifras son bastante buenas según entendidos en la materia. Y para un servidor, sencillamente espectaculares: jamás pensé que estas pequeñas aportaciones pudieran llegar a mover alrededor tal cantidad de personas :-)&lt;br /&gt;
&lt;br /&gt;
&lt;img align="right" alt="image" border="0" height="154" src="http://lh5.ggpht.com/-6hYShslrFv4/T6pFT6BDQNI/AAAAAAAACB8/LmQ44UYLrLw/image%25255B6%25255D.png?imgmax=800" style="background-image: none; border: 0px currentColor; display: inline; float: right; margin: 0px 0px 10px 10px; padding-left: 0px; padding-right: 0px; padding-top: 0px;" title="image" width="221" /&gt;Por citar algunas curiosidades, la “marca” de navegador más utilizada, independientemente de sus versiones, para acceder al blog ha sido Chrome, seguida muy de cerca por Firefox, y bastante más rezagado, Interner Explorer. Este trío sigue concentrando el 95% de las visitas. También entran este año en escena otros dispositivos, entre los que destaca de forma especial el iPad de Apple, abarcando&amp;nbsp;el 90% de la navegación móvil.&lt;br /&gt;
&lt;br /&gt;
El 90% de los lectores usan Windows, algo bastante lógico, pero aún el 31% de ellos continúan con la versión XP. Afortunadamente, Windows 7 ya es el más utilizado (¡hasta ahora no era así!), con un 60% del total.&lt;br /&gt;
&lt;br /&gt;
Google sigue siendo la principal fuente de tráfico, aunque este año han aparecido con fuerza &lt;a href="http://meneame.net/"&gt;meneame.net&lt;/a&gt;, &lt;a href="http://www.desarrolloweb.com/"&gt;desarrolloweb.com&lt;/a&gt;, y &lt;a href="http://www.genbetadev.com/"&gt;genbetadev.com&lt;/a&gt;, en gran parte artífices del aumento de visitas registrado, y los lectores proceden principalmente de España, México, Argentina, Colombia y Perú. Tenemos amigos en todo el mundo :-)&lt;br /&gt;
&lt;br /&gt;
“¿Y qué sacas tú de esto?“, me preguntan algunos. Y la respuesta sigue siendo la misma que hace seis años: el aprendizaje continuo, el disfrute de escribir sobre temas que me apasionan, la satisfacción de saber que hay artículos que ayudan a alguien, los comentarios, mails y feedback que recibo y la gente que he podido conocer gracias a ello. Ya, intangible, pero seguro más enriquecedor y valioso que otras cosas palpables a las que a menudo prestamos tanta atención.&lt;br /&gt;
&lt;br /&gt;
Un millón de gracias a todos los que lo hacéis posible, y espero veros por aquí un año más, &lt;em&gt;ayudándome a buscar la variable&lt;/em&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/27752126-4401529557145222034?l=www.variablenotfound.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/ic14X7tYiL0orT6nzfgRGv5vhRw/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/ic14X7tYiL0orT6nzfgRGv5vhRw/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/ic14X7tYiL0orT6nzfgRGv5vhRw/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/ic14X7tYiL0orT6nzfgRGv5vhRw/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/vnf?a=n28XUF5Rb4E:hY6sh90MhT8:ecdYMiMMAMM"&gt;&lt;img src="http://feeds.feedburner.com/~ff/vnf?d=ecdYMiMMAMM" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/vnf?a=n28XUF5Rb4E:hY6sh90MhT8:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/vnf?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/vnf?a=n28XUF5Rb4E:hY6sh90MhT8:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/vnf?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/vnf?a=n28XUF5Rb4E:hY6sh90MhT8:4cEx4HpKnUU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/vnf?i=n28XUF5Rb4E:hY6sh90MhT8:4cEx4HpKnUU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/vnf?a=n28XUF5Rb4E:hY6sh90MhT8:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/vnf?i=n28XUF5Rb4E:hY6sh90MhT8:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/vnf?a=n28XUF5Rb4E:hY6sh90MhT8:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/vnf?i=n28XUF5Rb4E:hY6sh90MhT8:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/vnf?a=n28XUF5Rb4E:hY6sh90MhT8:I9og5sOYxJI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/vnf?d=I9og5sOYxJI" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/vnf/~4/n28XUF5Rb4E" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.variablenotfound.com/feeds/4401529557145222034/comments/default" title="Enviar comentarios" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=27752126&amp;postID=4401529557145222034" title="13 comentarios" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/27752126/posts/default/4401529557145222034?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/27752126/posts/default/4401529557145222034?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/vnf/~3/n28XUF5Rb4E/6-anos-6-y-de-la-variable-ni-rastro.html" title="6 años 6. Y de la variable, ni rastro…" /><author><name>José M. Aguilar</name><uri>http://www.blogger.com/profile/11683750380776435448</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://3.bp.blogspot.com/_O9D62hXq-ng/S6Hfc0RM0YI/AAAAAAAABOg/bEEA3DZ7Uac/S220/fb1.png" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://lh4.ggpht.com/-AYITg711sOU/T6pFQ6ueVXI/AAAAAAAACBs/_GlwjkmGixk/s72-c/image6.png?imgmax=800" height="72" width="72" /><thr:total>13</thr:total><feedburner:origLink>http://www.variablenotfound.com/2012/05/6-anos-6-y-de-la-variable-ni-rastro.html</feedburner:origLink></entry><entry gd:etag="W/&quot;Ak4GQnk5eyp7ImA9WhVVFkk.&quot;"><id>tag:blogger.com,1999:blog-27752126.post-1990654797728227801</id><published>2012-05-08T09:15:00.000+02:00</published><updated>2012-05-10T13:22:03.723+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-05-10T13:22:03.723+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="desarrollo" /><category scheme="http://www.blogger.com/atom/ns#" term="asp.net" /><category scheme="http://www.blogger.com/atom/ns#" term="trucos" /><title>Login único para subdominios en ASP.NET</title><content type="html">&lt;img align="right" alt="ASP.NET" border="0" height="96" src="http://lh5.ggpht.com/-oPpqJbb1nMI/T5KON7KrPpI/AAAAAAAAB_M/Nin1jylHGOU/image%25255B4%25255D.png?imgmax=800" style="background-image: none; border: 0px currentColor; display: inline; float: right; margin: 0px 0px 10px 10px; padding-left: 0px; padding-right: 0px; padding-top: 0px;" title="ASP.NET" width="200" /&gt;Imaginad que tenemos un sistema web de cierto volumen y decidimos estructurarlo en aplicaciones independientes, cada una publicada en un subdominio propio:&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;www.acme.org&lt;/em&gt;, que sería el sitio principal. &lt;/li&gt;
&lt;li&gt;&lt;em&gt;crm.acme.org&lt;/em&gt;, con el sistema CRM de la empresa. &lt;/li&gt;
&lt;li&gt;&lt;em&gt;erp.acme.org&lt;/em&gt;, con un sistema de gestión empresarial. &lt;/li&gt;
&lt;li&gt;&lt;em&gt;administration.acme.org&lt;/em&gt; con las herramientas de administración del sistema. &lt;/li&gt;
&lt;li&gt;etc. &lt;/li&gt;
&lt;/ul&gt;
Desde un punto de vista operativo, es probable que nos interese suministrar un mecanismo de autenticación de usuarios compartido entre todas estas aplicaciones, de forma que el usuario, una vez identificado, pueda pasar de una a otra sin necesidad de introducir de nuevo sus credenciales.&lt;br /&gt;
&lt;br /&gt;
No es una tarea complicada en ASP.NET, aunque hay que hacer algunos ajustillos para que todo funcione correctamente. Veámoslos.&lt;br /&gt;
&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;
&lt;h3&gt;



Primero: ampliar el alcance de la cookie&lt;/h3&gt;
Como sabemos, el procedimiento estándar de autenticación consiste en comprobar que las credenciales suministradas por un usuario son correctas (con &lt;em&gt;membership&lt;/em&gt; o cualquier otro mecanismo), y en caso afirmativo, generar una cookie con información encriptada sobre el mismo. Esta cookie, llamada por defecto “.ASPXAUTH”, viaja en las sucesivas peticiones hacia el servidor, de forma que éste puede comprobar que el usuario ha sido autenticado satisfactoriamente con anterioridad.&lt;br /&gt;
&lt;br /&gt;
El problema es que &lt;strong&gt;por defecto esta cookie es específica para cada host&lt;/strong&gt;, por lo que sólo estará disponible para el dominio desde el que ha sido generada, con todos sus subdirectorios. Así, cuando se supera el procedimiento de autenticación y se crea la cookie (por ejemplo llamando a &lt;code&gt;FormsAuthentication.SetAuthCookie()&lt;/code&gt;), lo que se enviará al servidor en los encabezados de la respuesta es lo siguiente:&lt;br /&gt;
&lt;br /&gt;
&lt;code&gt;Set-Cookie: .ASPXAUTH=F1E37685DF9CBED74094D02958BA239B4AEAA0BDEF2FF379A2E2C5A    &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 4B7F9AC271B7F14BCFFE3E18799434EE8886CF4A0227E6BE92BC91E     &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 34601D0FCC18D3F1786D5060329DB578DF2BB5148F6AB2972D72C3D     &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; B17A437CE977660E552B92A6E5F981F3E6CE6037065244E1F0AB0BD     &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; A570D61DEB02; &lt;span style="background-color: white;"&gt;path=/&lt;/span&gt;; HttpOnly&lt;/code&gt;&lt;br /&gt;
&lt;br /&gt;
Pues bien, para conseguir nuestros objetivos, lo primero que nos interesa es &lt;strong&gt;asegurar que esta cookie estará disponible en los subdominios&lt;/strong&gt; del dominio desde la cual se ha generado. &lt;br /&gt;
&lt;br /&gt;
Afortunadamente podemos configurar bastantes aspectos del sistema de autenticación basado en formularios simplemente tocando un poco el web.config, y en este caso simplemente debemos indicar el dominio (de segundo nivel) para el cual queremos que la cookie sea válida, incluyendo sus subdominios. en el parámetro &lt;code&gt;domain&lt;/code&gt;:&lt;br /&gt;
&lt;pre style="background-color: transparent; overflow: visible; padding: 0px;"&gt;&lt;span style="font-family: Consolas;"&gt;&lt;span style="color: blue;"&gt;&lt;span style="font-size: 10pt;"&gt;&amp;nbsp; &amp;lt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 10pt;"&gt;&lt;span style="color: #a31515;"&gt;authentication&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: red;"&gt;mode&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;"&lt;span style="color: blue;"&gt;Forms&lt;/span&gt;"&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 10pt;"&gt;&lt;span style="font-family: Consolas;"&gt;&lt;span style="color: blue;"&gt;&amp;gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515;"&gt;forms&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: red;"&gt;loginUrl&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;"&lt;span style="color: blue;"&gt;~/Account/LogOn&lt;/span&gt;"&lt;span style="color: blue;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: red;"&gt;timeout&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;"&lt;span style="color: blue;"&gt;2880&lt;/span&gt;"&lt;span style="color: blue;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="background-color: yellow;"&gt;&lt;span style="color: red;"&gt;domain&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;"&lt;span style="color: blue;"&gt;acme.org&lt;/span&gt;"&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size: 10pt;"&gt;&lt;span style="color: blue;"&gt; /&amp;gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&amp;nbsp; &amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515;"&gt;authentication&lt;/span&gt;&lt;/span&gt;&lt;span style="color: blue; font-size: 10pt;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;
El valor de este parámetro será el nombre del dominio raíz del que colgarán todos los subdominios a los que haremos la cookie visible. Una vez introducido este valor en el web.config, la cookie de autorización será la siguiente:&lt;br /&gt;
&lt;br /&gt;
&lt;code&gt;Set-Cookie: .ASPXAUTH=4A67B460978D78217D52248318EB68717E857D7C08012057D0B6731&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 896E0E4EB9023AD2C02024CFB7D190617CCCD97FBA1E6ED484CE3FF&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 3581E7C8BE31FA204508F5ABB0DF994ADD698369132A5AF932AFF40&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; A267422C9ABCA86E620B9041ABB2E97C516880960F3D8193B209616&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 5978108AB500; &lt;span style="background-color: yellow;"&gt;domain=acme.org&lt;/span&gt;; path=/; HttpOnly&lt;/code&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;Este cambio tendremos que hacerlo únicamente en la aplicación que genere la cookie&lt;/strong&gt;, es decir, aquella que incluya la implementación del procedimiento de autenticación del usuario. En nuestro caso, por ejemplo, podría ser la aplicación “raíz”, &lt;em&gt;www.acme.org&lt;/em&gt;.&lt;br /&gt;
&lt;h3&gt;



Segundo: encriptar la cookie usando una clave común&lt;/h3&gt;
Esa secuencia de letras y números que veis en la cookie no es más que el resultado de encriptar la información que necesita ASP.NET para mantener información sobre el usuario autenticado. Esta encriptación se realiza utilizando un algoritmo y unas claves específicas para cada sitio web, que por defecto son generadas de forma automática.&lt;br /&gt;
&lt;br /&gt;
Así, &lt;strong&gt;si queremos que distintos sitios web puedan desencriptar la cookie&lt;/strong&gt; y acceder a su contenido, lo cual es fundamental para mantener el usuario conectado, &lt;strong&gt;debemos hacer que todos ellos compartan el algoritmo y clave de encriptación&lt;/strong&gt;. Esto se hace desde el web.config estableciendo estos aspectos en la entrada &lt;code&gt;&amp;lt;&lt;a href="http://msdn.microsoft.com/es-es/library/w8h3skw9(v=vs.100).aspx"&gt;machineKey&lt;/a&gt;&amp;gt;&lt;/code&gt;:&lt;br /&gt;
&lt;br /&gt;
&lt;code&gt;... &lt;br /&gt;
&amp;lt;system.web&amp;gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;machineKey&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: red;"&gt;&lt;strong&gt;&amp;lt;!-- ¡Ojo no copiar y pegar! --&amp;gt;&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; validationKey="6171035B16CD1EE0E401BA3E7348DE49FA9FB9C043B3CDE3BA4FF&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; EDDC84B167C68B83916FAD8AEE4CFEE001AD5CEA8A4B3E28D51F9&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; D5EA55CD5F276E67B71FC6"&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; decryptionKey="3F12339F897F687F4456FEC2446167C621BDE5F664178CBEF9AF0&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 40DB82EC806"&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; validation="SHA1"&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; decryption="AES"&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; /&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; ... &lt;br /&gt;
&amp;lt;/system.web&amp;gt;&amp;nbsp;&lt;/code&gt;&lt;br /&gt;
&lt;br /&gt;
Puedes &lt;a href="http://aspnetresources.com/tools/machineKey"&gt;generar este elemento usando el generador de MachineKey online&lt;/a&gt;, copiar el código y pegarlo en la sección &lt;code&gt;&amp;lt;system.web&amp;gt;&lt;/code&gt; del web.config de todos los sitios web, raíz y subdominios, de la aplicación.&lt;br /&gt;
&lt;br /&gt;
A partir de este momento &lt;strong&gt;ya podemos probar el sistema completo en funcionamiento&lt;/strong&gt;. Si el mecanismo de autenticación se encuentra en &lt;em&gt;www.acme.org&lt;/em&gt;, la autorización viajará al navegar por todos sus subdominios (&lt;em&gt;crm.acme.org&lt;/em&gt;, &lt;em&gt;erp.acme.org&lt;/em&gt;…), éstos serán capaces de desencriptar las credenciales y, por tanto, el usuario permanecerá logado en el sistema.&lt;br /&gt;
&lt;h3&gt;



Tercero: ajustar Redirecciones&lt;/h3&gt;
Dado que hemos considerado que todas las aplicaciones son privadas, con toda seguridad estarán protegidas contra accesos de usuarios no autenticados.Por ejemplo, en ASP.NET MVC probablemente tengamos todas las acciones protegidas con un filtro &lt;code&gt;[Authorize]&lt;/code&gt;, o en WebForms tendremos secciones &lt;code&gt;&amp;lt;authorization&amp;gt;&lt;/code&gt; en el web.config para denegar el acceso a todas sus funcionalidades.&lt;br /&gt;
&lt;br /&gt;
En cualquier caso, &lt;strong&gt;nos interesa que los usuarios no autenticados sean redirigidos a la aplicación desde la cual pueda autenticarse&lt;/strong&gt;, por lo que podemos debemos indicar la URL de la página de login en el parámetro &lt;code&gt;loginUrl&lt;/code&gt; como sigue:&lt;br /&gt;
&lt;pre style="background-color: transparent; overflow: visible; padding: 0px;"&gt;&lt;span style="font-family: Consolas;"&gt;&lt;span style="color: blue;"&gt;&lt;span style="font-size: 10pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 10pt;"&gt;&lt;span style="color: #a31515;"&gt;authentication&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: red;"&gt;mode&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;"&lt;span style="color: blue;"&gt;Forms&lt;/span&gt;"&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 10pt;"&gt;&lt;span style="font-family: Consolas;"&gt;&lt;span style="color: blue;"&gt;&amp;gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515;"&gt;forms&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="background-color: yellow;"&gt;&lt;span style="color: red;"&gt;loginUrl&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;"&lt;span style="color: blue;"&gt;http://www.acme.org/account/logon&lt;/span&gt;"&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: red;"&gt;timeout&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;"&lt;span style="color: blue;"&gt;2880&lt;/span&gt;"&lt;/span&gt;&lt;span style="font-family: Consolas;"&gt;&lt;span style="color: blue;"&gt;&amp;gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515;"&gt;forms&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size: 10pt;"&gt;&lt;span style="color: blue;"&gt;&amp;gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515;"&gt;authentication&lt;/span&gt;&lt;/span&gt;&lt;span style="color: blue; font-size: 10pt;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;
&lt;strong&gt;Este cambio sería necesario hacerlo en todas las aplicaciones a las que no vamos a permitir el acceso anónimo&lt;/strong&gt; (&lt;em&gt;crm.acme.org&lt;/em&gt;, &lt;em&gt;erp.acme.org&lt;/em&gt;, …), con lo que aseguramos que cualquier intento de entrada de usuarios no autenticados será redirigida al sitio principal, desde el cual podrá identificarse.&lt;br /&gt;
&lt;h3&gt;



Cuarto: retocar la URL de retorno y procesarla tras la autenticación&lt;/h3&gt;
Casi hemos acabado, pero aún hay un detalle cuya solución no es tan inmediata como los puntos anteriores.&lt;br /&gt;
&lt;img align="right" alt="El parámetro ReturnUrl" border="0" height="94" src="http://lh5.ggpht.com/-jkcLKCtwYgQ/T5KOOjUUXgI/AAAAAAAAB_U/UXm4slvvn3k/image5.png?imgmax=800" style="background-image: none; border-width: 0px; display: inline; float: right; margin: 0px 0px 10px 10px; padding-left: 0px; padding-right: 0px; padding-top: 0px;" title="El parámetro ReturnUrl" width="381" /&gt;&lt;br /&gt;
Cuando se produce la redirección hacia la página de login, automáticamente se añade a la petición un parámetro llamado &lt;code&gt;ReturnUrl&lt;/code&gt; donde se almacena la URL a la que estaba intentado acceder el usuario. Esto permite devolverlo a ella una vez se haya autenticado en el sistema. &lt;br /&gt;
&lt;br /&gt;
El problema es que este parámetro no incluye el host, por lo que en una aplicación distribuida en distintos dominios esta información se perderá. Es decir, si un usuario intenta acceder directamente a &lt;em&gt;erp.acme.org/customers/index&lt;/em&gt;, será redirigido a la URL &lt;em&gt;http://www.acme.org/account/logon?ReturnUrl=customers/index&lt;/em&gt;&lt;em&gt;&amp;nbsp;&lt;/em&gt;para ser autenticado, y cuando esto ocurra, el sistema no tiene información suficiente como para devolverlo a la página a la que deseaba ir en un principio (en &lt;em&gt;erp.acme.org&lt;/em&gt;).&lt;br /&gt;
&lt;br /&gt;
Lamentablemente no podemos “influir” en la forma en que ASP.NET genera el contenido para este parámetro al redirigir al usuario, por lo que o bien hacemos nosotros la redirección de forma manual al detectad que el usuario no se ha autenticado, o bien nos introducimos en algún punto avanzado del ciclo de ejecución de la petición para modificar el valor original del parámetro.&lt;br /&gt;
&lt;br /&gt;
Un primer acercamiento de la implementación de esta última opción podría ser la siguiente, implementando el evento &lt;code&gt;Application_EndRequest&lt;/code&gt; (en el global.asax.cs, válido tanto en MVC como en Webforms):&lt;br /&gt;
&lt;pre style="background-color: transparent; overflow: visible; padding: 0px;"&gt;&lt;span style="font-family: Consolas;"&gt;&lt;span style="color: blue;"&gt;&lt;span style="font-size: 10pt;"&gt;protected&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 10pt;"&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;void&lt;/span&gt; Application_EndRequest(&lt;span style="color: blue;"&gt;object&lt;/span&gt; sender, &lt;span style="color: #2b91af;"&gt;EventArgs&lt;/span&gt; e)
{
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;if&lt;/span&gt; (Response.StatusCode == (&lt;span style="color: blue;"&gt;int&lt;/span&gt;)&lt;span style="color: #2b91af;"&gt;HttpStatusCode&lt;/span&gt;.Found &amp;amp;&amp;amp; !Request.IsAuthenticated)
&amp;nbsp;&amp;nbsp;&amp;nbsp; {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;string&lt;/span&gt; redirectUrl = &lt;span style="color: blue;"&gt;this&lt;/span&gt;.Response.RedirectLocation;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;if&lt;/span&gt; (redirectUrl.Contains(&lt;span style="color: #a31515;"&gt;"ReturnUrl="&lt;/span&gt;))
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;var&lt;/span&gt; host = &lt;span style="color: #2b91af;"&gt;HttpUtility&lt;/span&gt;.UrlEncode(
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #a31515;"&gt;"http://"&lt;/span&gt; +
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;this&lt;/span&gt;.Request.Url.Host +
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (Request.Url.IsDefaultPort ? &lt;span style="color: #a31515;"&gt;""&lt;/span&gt; : &lt;span style="color: #a31515;"&gt;":"&lt;/span&gt; + Request.Url.Port));
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Response.RedirectLocation = redirectUrl.Replace(&lt;span style="color: #a31515;"&gt;"ReturnUrl="&lt;/span&gt;, &lt;span style="color: #a31515;"&gt;"ReturnUrl="&lt;/span&gt; + host);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }
&amp;nbsp;&amp;nbsp;&amp;nbsp; }
}&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;
Como podéis observar, simplemente intentamos detectar cuándo la respuesta enviada al cliente es una redirección, y si el usuario no está autenticado y existe un parámetro &lt;code&gt;ReturnUrl&lt;/code&gt;, lo modificamos para que presente también el host (y puerto). De esta forma, ya llegará a la página de login la dirección completa a la que hay que enviar el usuario cuando supere la autenticación.&lt;br /&gt;
&lt;br /&gt;
&lt;img alt="Ya llega la URL completa!" border="0" height="121" src="http://lh4.ggpht.com/-kC_mZOFdZkI/T5KOPzHW_6I/AAAAAAAAB_c/ve6l0BQAEQo/image14.png?imgmax=800" style="background-image: none; border-width: 0px; display: inline; margin: 0px 0px 10px 10px; padding-left: 0px; padding-right: 0px; padding-top: 0px;" title="Ya llega la URL completa!" width="626" /&gt;&lt;br /&gt;
&lt;br /&gt;
Y por último, ya lo único que quedaría sería implementar la redirección a la URL suministrada en el parámetro &lt;code&gt;ReturnUrl&lt;/code&gt; una vez confirmada la identidad del usuario, es decir, tras establecer la cookie. &lt;br /&gt;
&lt;br /&gt;
Eso sí, tened un poco de cuidado antes de redirigir y comprobad que la dirección a la que vais a enviarlo forma parte de vuestro sitio (por ejemplo, comprobando que el host de destino pertenece a &lt;em&gt;acme.org&lt;/em&gt;) para &lt;strong&gt;evitar la vulnerabilidad &lt;/strong&gt;&lt;a href="https://www.owasp.org/index.php/Open_redirect"&gt;&lt;strong&gt;Open Redirect&lt;/strong&gt;&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
Publicado en &lt;a href="http://www.variablenotfound.com/"&gt;Variable not found&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/27752126-1990654797728227801?l=www.variablenotfound.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/9Gv0dkeKHrOZm4g88KFAn5PiNzA/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/9Gv0dkeKHrOZm4g88KFAn5PiNzA/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/9Gv0dkeKHrOZm4g88KFAn5PiNzA/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/9Gv0dkeKHrOZm4g88KFAn5PiNzA/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/vnf?a=C76u8F-ToO0:S3mwQiVm4tU:ecdYMiMMAMM"&gt;&lt;img src="http://feeds.feedburner.com/~ff/vnf?d=ecdYMiMMAMM" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/vnf?a=C76u8F-ToO0:S3mwQiVm4tU:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/vnf?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/vnf?a=C76u8F-ToO0:S3mwQiVm4tU:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/vnf?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/vnf?a=C76u8F-ToO0:S3mwQiVm4tU:4cEx4HpKnUU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/vnf?i=C76u8F-ToO0:S3mwQiVm4tU:4cEx4HpKnUU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/vnf?a=C76u8F-ToO0:S3mwQiVm4tU:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/vnf?i=C76u8F-ToO0:S3mwQiVm4tU:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/vnf?a=C76u8F-ToO0:S3mwQiVm4tU:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/vnf?i=C76u8F-ToO0:S3mwQiVm4tU:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/vnf?a=C76u8F-ToO0:S3mwQiVm4tU:I9og5sOYxJI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/vnf?d=I9og5sOYxJI" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/vnf/~4/C76u8F-ToO0" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.variablenotfound.com/feeds/1990654797728227801/comments/default" title="Enviar comentarios" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=27752126&amp;postID=1990654797728227801" title="0 comentarios" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/27752126/posts/default/1990654797728227801?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/27752126/posts/default/1990654797728227801?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/vnf/~3/C76u8F-ToO0/login-unico-para-subdominios-en-aspnet.html" title="Login único para subdominios en ASP.NET" /><author><name>José M. Aguilar</name><uri>http://www.blogger.com/profile/11683750380776435448</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://3.bp.blogspot.com/_O9D62hXq-ng/S6Hfc0RM0YI/AAAAAAAABOg/bEEA3DZ7Uac/S220/fb1.png" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://lh5.ggpht.com/-oPpqJbb1nMI/T5KON7KrPpI/AAAAAAAAB_M/Nin1jylHGOU/s72-c/image%25255B4%25255D.png?imgmax=800" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://www.variablenotfound.com/2012/05/login-unico-para-subdominios-en-aspnet.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D04GQH4-fyp7ImA9WhVVE0o.&quot;"><id>tag:blogger.com,1999:blog-27752126.post-4769028195108958507</id><published>2012-05-07T09:32:00.000+02:00</published><updated>2012-05-07T09:32:01.057+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-05-07T09:32:01.057+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="enlaces" /><title>Enlaces interesantes 81</title><content type="html">&lt;a href="http://lh3.ggpht.com/-PUgIXLCKpAk/T6UUVcvgHxI/AAAAAAAACBQ/kcxMakCUCEk/s1600-h/image7_thumb_thumb_thumb_thumb_thumb%25255B1%25255D.png"&gt;&lt;img align="right" alt="image7_thumb_thumb_thumb_thumb_thumb" border="0" height="129" src="http://lh6.ggpht.com/-wSgNo0uryZM/T6UUWe0nFBI/AAAAAAAACBY/oYAIhmzgNtk/image7_thumb_thumb_thumb_thumb_thumb%25255B2%25255D.png?imgmax=800" style="background-image: none; border-width: 0px; display: inline; float: right; margin: 0px 0px 10px 10px; padding-left: 0px; padding-right: 0px; padding-top: 0px;" title="image7_thumb_thumb_thumb_thumb_thumb" width="172" /&gt;&lt;/a&gt;Estos son los enlaces publicados en &lt;a href="http://www.facebook.com/variablenotfound"&gt;Variable not found en Facebook&lt;/a&gt; y &lt;a href="http://twitter.com/jmaguilar"&gt;Twitter&lt;/a&gt; del 30 de abril al 6 de mayo de 2012. Espero que os resulten interesantes :-)&lt;br /&gt;
&lt;h4&gt;

.Net&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://blackrabbitcoder.net/archive/2012/05/03/c.net-little-wonders-the-enumerable.repeat-static-method.aspx"&gt;&lt;strong&gt;C#/.NET Little Wonders: The Enumerable.Repeat() Static Method&lt;/strong&gt;&lt;/a&gt;       &lt;br /&gt;James Michael Hare &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="http://msmvps.com/blogs/jon_skeet/archive/2012/05/02/more-fun-with-datetime.aspx"&gt;More fun with DateTime&lt;/a&gt;&lt;/strong&gt;       &lt;br /&gt;Jon Skeet &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="http://blog.pluralsight.com/2012/05/01/idisposable-for-dummies-1-why-what/"&gt;IDisposable for Dummies #1 – Why? What?&lt;/a&gt;&lt;/strong&gt;       &lt;br /&gt;Paul Ballard &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="http://geeks.ms/blogs/etomas/archive/2012/05/02/c-b-225-sico-m-233-todos-con-par-225-metros-variables.aspx"&gt;[C# Básico] Métodos con parámetros variables&lt;/a&gt;&lt;/strong&gt;       &lt;br /&gt;Eduard Tomás &lt;/li&gt;
&lt;li&gt;&lt;a href="http://blackrabbitcoder.net/archive/2012/04/26/c.net-little-wonders-the-enumerable.range-static-method.aspx"&gt;&lt;strong&gt;C#/.NET Little Wonders: The Enumerable.Range() Static Method&lt;/strong&gt;&lt;/a&gt;       &lt;br /&gt;James Michael Hare&lt;a name='more'&gt;&lt;/a&gt; &lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;

Asp.net&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="http://blog.gauffin.org/2012/05/griffin-mvccontrib-the-plugin-system/"&gt;Griffin.MvcContrib – The plugin system&lt;/a&gt;&lt;/strong&gt;       &lt;br /&gt;Jonas Gauffin &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="http://smarrerof.blogspot.com.es/2012/05/aspnet-mvc4-validando-que-un-campo-sea.html"&gt;ASP.NET MVC4 Validando que un campo sea true o checked&lt;/a&gt;&lt;/strong&gt;       &lt;br /&gt;Sergio Marrero &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="http://weblogs.asp.net/davidfowler/archive/2012/05/02/signalr-0-5.aspx"&gt;SignalR 0.5&lt;/a&gt;&lt;/strong&gt;       &lt;br /&gt;David Fowler &lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.geoffhudik.com/tech/2012/4/21/aspnet-mvc-4-nunit-template.html" title="ASP.NET MVC 4 NUnit template"&gt;&lt;strong&gt;ASP.NET MVC 4 NUnit template&lt;/strong&gt;&lt;/a&gt;       &lt;br /&gt;Geoff Hudik &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="http://www.codeproject.com/Articles/207797/Learn-MVC-Model-view-controller-Step-by-Step-in-7"&gt;Learn MVC (Model view controller) Step by Step in 7 days – Day 1&lt;/a&gt;&lt;/strong&gt;       &lt;br /&gt;Shivprasad Koirala &lt;/li&gt;
&lt;li&gt;&lt;a href="http://michaelcrump.net/a-xaml-guy-digs-into-asp-net-mvc4-part-1-of" title="A XAML Guy digs into ASP.NET MVC4 (Part 1 of -)"&gt;&lt;strong&gt;A XAML Guy digs into ASP.NET MVC4 (Part 1 of –)&lt;/strong&gt;&lt;/a&gt;       &lt;br /&gt;Michael Crump &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="http://www.west-wind.com/weblog/posts/2012/Apr/28/GZipDeflate-Compression-in-ASPNET-MVC"&gt;GZip/Deflate compression in ASP.NET MVC&lt;/a&gt;&lt;/strong&gt;       &lt;br /&gt;Rick Strahl &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="http://blogs.msdn.com/b/henrikn/archive/2012/04/27/asp-net-web-api-updates-april-27.aspx"&gt;ASP.NET Web API Updates – April 27&lt;/a&gt;&lt;/strong&gt;       &lt;br /&gt;Henrik F Nielsen &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="http://weblogs.asp.net/imranbaloch/archive/2012/04/28/using-razor-v2-in-asp-net-mvc-3.aspx"&gt;Using Razor V2 in ASP.NET MVC 3&lt;/a&gt;&lt;/strong&gt;       &lt;br /&gt;Imran Baloch &lt;/li&gt;
&lt;li&gt;&lt;a href="http://blogs.msdn.com/b/henrikn/archive/2012/04/29/using-nightly-nuget-packages-with-asp-net-web-stack.aspx"&gt;&lt;strong&gt;Using Nightly ASP.NET Web Stack NuGet Packages&lt;/strong&gt;&lt;/a&gt;       &lt;br /&gt;Henrik F Nielsen &lt;/li&gt;
&lt;li&gt;&lt;a href="http://aspnetwebstack.codeplex.com/discussions/353867"&gt;&lt;strong&gt;Nightly signed NuGet packages are available for ASP.NET MVC, WebAPI y WebPages&lt;/strong&gt;&lt;/a&gt;       &lt;br /&gt;Brad Wilson       &lt;ul&gt;            &lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;

Azure / Cloud&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://www.windowsazure.com/en-us/develop/net/how-to-guides/twilio-voice-and-sms-service/"&gt;How to Use Twilio for Voice and SMS Capabilities from Windows Azure&lt;/a&gt;&lt;/strong&gt;       &lt;br /&gt;Windows Azure &lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;

Conceptos&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="http://blogs.msdn.com/b/ericlippert/archive/2012/04/30/guid-guide-part-two.aspx"&gt;GUID guide, part two&lt;/a&gt;&lt;/strong&gt;       &lt;br /&gt;Eric Lippert &lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;

Data access&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="http://geeks.ms/blogs/phurtado/archive/2012/05/04/con-esto-cerramos-los-proxis-din-225-micos-de-ef.aspx"&gt;Con esto cerramos los proxis dinámicos de EF&lt;/a&gt;&lt;/strong&gt;       &lt;br /&gt;Pedro Hurtado &lt;/li&gt;
&lt;li&gt;&lt;a href="http://codeclimber.net.nz/archive/2012/04/30/Entity-Framework-4-3-1-Migrations-and-non-English-locale.aspx"&gt;&lt;strong&gt;Entity Framework 4.3.1 Migrations and non English locale&lt;/strong&gt;&lt;/a&gt;       &lt;br /&gt;Simone Chiaretta &lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;

Html/Css/Javascript&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://addyosmani.com/blog/javascript-style-guides-and-beautifiers/"&gt;&lt;strong&gt;JavaScript Style Guides And Beautifiers&lt;/strong&gt;&lt;/a&gt;       &lt;br /&gt;Addy Osmani &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="http://www.impressivewebs.com/css-the-good-parts/"&gt;CSS: The Good Parts&lt;/a&gt;&lt;/strong&gt;       &lt;br /&gt;Louis Lazaris &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="http://www.jquery4u.com/articles/jquery-plugin-module-pattern/"&gt;A Basic jQuery Plugin using the Module Pattern&lt;/a&gt;&lt;/strong&gt;       &lt;br /&gt;Sam Deering &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="http://net.tutsplus.com/tutorials/javascript-ajax/closures-front-to-back/"&gt;Closures: Front to Back&lt;/a&gt;&lt;/strong&gt;       &lt;br /&gt;Brian Scaturro &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="http://starter.pixelgraphics.us/"&gt;Starter: jumpstart your jQuery plugins&lt;/a&gt;         &lt;/strong&gt;Doug Neiner &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="http://blogs.technet.com/b/port25/archive/2012/04/26/more-news-from-ms-open-tech-announcing-the-open-source-metro-style-theme-for-jquery-mobile.aspx"&gt;More news from MS Open Tech: announcing the open source Metro style theme for jQuery Mobile&lt;/a&gt;&lt;/strong&gt;       &lt;br /&gt;Abu Obeida       &lt;ul&gt;            &lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;

Visual Studio/Complementos/Herramientas&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://msdn.microsoft.com/en-us/magazine/hh975345.aspx"&gt;&lt;strong&gt;Develop HTML5 Windows Phone Apps with Apache Cordova&lt;/strong&gt;&lt;/a&gt;       &lt;br /&gt;Colin Eberhardt &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="http://geeks.ms/blogs/lruiz/archive/2012/05/03/tip-usar-nuget-sin-tener-que-subir-los-paquetes-a-nuestro-repositorio-de-c-243-digo-fuente.aspx"&gt;[Tip] Usar NuGet sin tener que subir los paquetes a nuestro repositorio de código fuente&lt;/a&gt;&lt;/strong&gt;       &lt;br /&gt;Luis Ruiz Pavón &lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;

Otros&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="http://dotnetslackers.com/articles/mobile/Create-Android-AngryBirds-Game-Using-WiEngine-SDK-Part-1.aspx"&gt;Create Android AngryBirds Game Using WiEngine SDK -Part 1&lt;/a&gt;&lt;/strong&gt;       &lt;br /&gt;Xianzhong Zhu &lt;/li&gt;
&lt;li&gt;&lt;a href="http://jmalarcon.es/post/Comportarse-como-un-grillo.aspx" title="Comportarse como un grillo"&gt;&lt;strong&gt;Comportarse como un grillo&lt;/strong&gt;&lt;/a&gt;       &lt;br /&gt;José Manuel Alarcón&lt;/li&gt;
&lt;/ul&gt;
Y no olvidéis que podéis seguir esta información en vivo y en directo desde &lt;a href="http://www.facebook.com/variablenotfound"&gt;Variable not found en Facebook&lt;/a&gt;, o a través de &lt;a href="http://twitter.com/jmaguilar"&gt;Twitter&lt;/a&gt;.     &lt;br /&gt;
&lt;br /&gt;
Publicado en &lt;a href="http://www.variablenotfound.com/"&gt;Variable not found&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/27752126-4769028195108958507?l=www.variablenotfound.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/Y4aM1FDrbKsAdHL74dZ8CHqsiRE/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/Y4aM1FDrbKsAdHL74dZ8CHqsiRE/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/Y4aM1FDrbKsAdHL74dZ8CHqsiRE/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/Y4aM1FDrbKsAdHL74dZ8CHqsiRE/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/vnf?a=1ejcICTDvZI:9PDQ50Ro_ho:ecdYMiMMAMM"&gt;&lt;img src="http://feeds.feedburner.com/~ff/vnf?d=ecdYMiMMAMM" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/vnf?a=1ejcICTDvZI:9PDQ50Ro_ho:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/vnf?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/vnf?a=1ejcICTDvZI:9PDQ50Ro_ho:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/vnf?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/vnf?a=1ejcICTDvZI:9PDQ50Ro_ho:4cEx4HpKnUU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/vnf?i=1ejcICTDvZI:9PDQ50Ro_ho:4cEx4HpKnUU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/vnf?a=1ejcICTDvZI:9PDQ50Ro_ho:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/vnf?i=1ejcICTDvZI:9PDQ50Ro_ho:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/vnf?a=1ejcICTDvZI:9PDQ50Ro_ho:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/vnf?i=1ejcICTDvZI:9PDQ50Ro_ho:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/vnf?a=1ejcICTDvZI:9PDQ50Ro_ho:I9og5sOYxJI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/vnf?d=I9og5sOYxJI" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/vnf/~4/1ejcICTDvZI" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.variablenotfound.com/feeds/4769028195108958507/comments/default" title="Enviar comentarios" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=27752126&amp;postID=4769028195108958507" title="0 comentarios" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/27752126/posts/default/4769028195108958507?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/27752126/posts/default/4769028195108958507?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/vnf/~3/1ejcICTDvZI/enlaces-interesantes-81.html" title="Enlaces interesantes 81" /><author><name>José M. Aguilar</name><uri>http://www.blogger.com/profile/11683750380776435448</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://3.bp.blogspot.com/_O9D62hXq-ng/S6Hfc0RM0YI/AAAAAAAABOg/bEEA3DZ7Uac/S220/fb1.png" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://lh6.ggpht.com/-wSgNo0uryZM/T6UUWe0nFBI/AAAAAAAACBY/oYAIhmzgNtk/s72-c/image7_thumb_thumb_thumb_thumb_thumb%25255B2%25255D.png?imgmax=800" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://www.variablenotfound.com/2012/05/enlaces-interesantes-81.html</feedburner:origLink></entry><entry gd:etag="W/&quot;Dk8NQnY5fCp7ImA9WhVWGE0.&quot;"><id>tag:blogger.com,1999:blog-27752126.post-1282664877533363727</id><published>2012-04-30T09:32:00.000+02:00</published><updated>2012-04-30T18:54:53.824+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-04-30T18:54:53.824+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="enlaces" /><title>Enlaces interesantes 80</title><content type="html">&lt;a href="http://lh4.ggpht.com/-gzQWKjlKVXw/T5uqj-DlQ2I/AAAAAAAACA4/WwfF-CKz2M0/s1600-h/image7_thumb_thumb_thumb_thumb_thumb%25255B2%25255D.png"&gt;&lt;img align="right" alt="Enlaces interesantes" border="0" height="129" src="http://lh6.ggpht.com/-7Q5ycQ38QDQ/T5uqlG3mwxI/AAAAAAAACBA/O9VasCFoSic/image7_thumb_thumb_thumb_thumb_thumb.png?imgmax=800" style="background-image: none; border-width: 0px; display: inline; float: right; margin: 0px 0px 10px 10px; padding-left: 0px; padding-right: 0px; padding-top: 0px;" title="Enlaces interesantes" width="172" /&gt;&lt;/a&gt;Estos son los enlaces publicados en &lt;a href="http://www.facebook.com/variablenotfound"&gt;Variable not found en Facebook&lt;/a&gt; y &lt;a href="http://twitter.com/jmaguilar"&gt;Twitter&lt;/a&gt; del 23 al 29 de abril de 2012. Espero que os resulten interesantes :-)&lt;br /&gt;
&lt;h4&gt;

.Net&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://coolthingoftheday.blogspot.com.es/2012/04/obsoleted-types-methods-and-migration.html" title="Obsoleted Types, Methods and Migration Guide and more for .Net 4.5 (Beta)"&gt;&lt;strong&gt;Obsoleted Types, Methods and Migration Guide and more for .Net 4.5 (Beta)&lt;/strong&gt;&lt;/a&gt;       &lt;br /&gt;Greg Duncan &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/bb448854.aspx"&gt;Si necesitas crear ficheros Excel en tu aplicación .NET, no necesitas tener Excel instalado usa el Open XML SDK&lt;/a&gt;&lt;/strong&gt;       &lt;br /&gt;Vía @wasat &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="http://eknowledger.wordpress.com/2012/04/26/clr-4-5-multicore-just-in-time-jit/"&gt;CLR 4.5: Multicore Just-in-Time (JIT)&lt;/a&gt;&lt;/strong&gt;       &lt;br /&gt;Ahmed Elmalt &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="http://geeks.ms/blogs/jorge/archive/2012/04/26/validando-sin-parar-uso-de-dataannotations.aspx"&gt;Validando sin parar. Uso de DataAnnotations.&lt;/a&gt;&lt;/strong&gt;       &lt;br /&gt;Jorge Serrano &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="http://geeks.ms/blogs/etomas/archive/2012/04/23/c-b-225-sico-paso-por-referencia.aspx"&gt;[C# Básico] Paso por referencia&lt;/a&gt;&lt;/strong&gt;       &lt;br /&gt;Eduard Tomás &lt;a name='more'&gt;&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;

Asp.net / WCF&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.mikepope.com/blog/AddComment.aspx?blogid=2370"&gt;&lt;strong&gt;Razor tip: Escaping the "@" character&lt;/strong&gt;&lt;/a&gt;       &lt;br /&gt;Mike Pope &lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.west-wind.com/weblog/posts/2012/Apr/25/Internet-Explorer-and-Cookie-Domains" title="Internet Explorer and Cookie Domains"&gt;&lt;strong&gt;Internet Explorer and Cookie Domains&lt;/strong&gt;&lt;/a&gt;       &lt;br /&gt;Rick Strahl &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="http://blogs.infragistics.com/blogs/damyan_petev/archive/2012/04/25/live-data-starring-the-jquery-grid-websockets-and-knockoutjs.aspx"&gt;Live data - starring the jQuery Grid, WebSockets and KnockoutJS&lt;/a&gt;&lt;/strong&gt;       &lt;br /&gt;Damyan Petev &lt;/li&gt;
&lt;li&gt;&lt;a href="http://encosia.com/rest-vs-rpc-in-asp-net-web-api-who-cares-it-does-both/"&gt;&lt;strong&gt;REST vs. RPC in ASP.NET Web API? Who cares; it does both.&lt;/strong&gt;&lt;/a&gt;       &lt;br /&gt;Dave Ward &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="http://geeks.ms/blogs/phurtado/archive/2012/04/25/buscando-al-culpable.aspx"&gt;Buscando al culpable&lt;/a&gt;&lt;/strong&gt;       &lt;br /&gt;Pedro Hurtado &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="http://www.primaryobjects.com/CMS/Article140.aspx"&gt;Moving in and Out of SSL HTTPS in C# MVC ASP .NET&lt;/a&gt;&lt;/strong&gt;       &lt;br /&gt;Kory Becker &lt;/li&gt;
&lt;li&gt;&lt;a href="http://blogs.msdn.com/b/ukadc/archive/2012/04/24/asp-net-mvc-amp-jquery-ui-autocomplete.aspx"&gt;&lt;strong&gt;ASP.NET MVC &amp;amp; jQuery UI autocomplete&lt;/strong&gt;&lt;/a&gt;       &lt;br /&gt;Stuart Leeks &lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.west-wind.com/weblog/posts/2012/Apr/24/Getting-a-base-Domain-from-a-Domain"&gt;&lt;strong&gt;Getting a 'base' Domain from a Domain&lt;/strong&gt;&lt;/a&gt;       &lt;br /&gt;Rick Strahl &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="http://geeks.ms/blogs/lruiz/archive/2012/04/24/asp-net-dale-un-toque-metro-a-tus-aplicaciones-asp-net-con-jquery-ii.aspx"&gt;[ASP.NET] Dale un toque Metro a tus aplicaciones ASP.NET con jQuery (II)&lt;/a&gt;&lt;/strong&gt;       &lt;br /&gt;Luis Ruiz Pavón &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="http://geeks.ms/blogs/jorge/archive/2012/04/24/patr-243-n-interfaz-marcadora-ii.aspx"&gt;Patrón Interfaz Marcadora (II)&lt;/a&gt;&lt;/strong&gt;       &lt;br /&gt;Jorge Serrano &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="http://blogs.microsoft.co.il/blogs/gilf/archive/2012/04/23/generating-asp-net-mvc-view-controls-according-to-xml-configurations.aspx"&gt;Generating ASP.NET MVC View Controls According to Xml Configurations&lt;/a&gt;&lt;/strong&gt;       &lt;br /&gt;Gil Fink &lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.west-wind.com/weblog/posts/2012/Apr/20/ASPNET-MVC-Postbacks-and-HtmlHelper-Controls-ignoring-Model-Changes"&gt;&lt;strong&gt;ASP.NET MVC Postbacks and HtmlHelper Controls ignoring Model Changes&lt;/strong&gt;&lt;/a&gt;       &lt;br /&gt;Rick Strahl &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="http://blogs.msdn.com/b/henrikn/archive/2012/04/22/asp-net-web-api-content-negotiation-and-accept-charset.aspx"&gt;ASP.NET Web API Content Negotiation and Accept-Charset&lt;/a&gt;&lt;/strong&gt;       &lt;br /&gt;Henrik F Nielsen &lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.strathweb.com/2012/04/rss-atom-mediatypeformatter-for-asp-net-webapi/" title="Permalink to RSS &amp;amp; Atom MediaTypeFormatter for ASP.NET WebAPI"&gt;&lt;strong&gt;RSS &amp;amp; Atom MediaTypeFormatter for ASP.NET WebAPI&lt;/strong&gt;&lt;/a&gt;       &lt;br /&gt;Filip W. &lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;

Azure / Cloud&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="http://blogs.msdn.com/b/jimoneil/archive/2012/04/24/fun-with-the-service-bus-part-1.aspx"&gt;Fun with the Service Bus (Part 1)&lt;/a&gt;&lt;/strong&gt;       &lt;br /&gt;Jim O’Neil &lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;

Conceptos&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="http://blogs.msdn.com/b/ericlippert/archive/2012/04/24/guid-guide-part-one.aspx"&gt;GUID Guide, part one&lt;/a&gt;&lt;/strong&gt;       &lt;br /&gt;Eric Lippert &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="http://geeks.ms/blogs/jorge/archive/2012/04/23/patr-243-n-interfaz-marcadora-i.aspx"&gt;Patrón Interfaz Marcadora (I)&lt;/a&gt;&lt;/strong&gt;       &lt;br /&gt;Jorge Serrano &lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;

Data access&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.jasoft.org/Blog/post/SQL-Server-enviar-automaticamente-los-resultados-de-una-consulta-por-email.aspx" title="SQL Server- enviar automáticamente los resultados de una consulta por email"&gt;&lt;strong&gt;SQL Server- enviar automáticamente los resultados de una consulta por email&lt;/strong&gt;&lt;/a&gt;       &lt;br /&gt;José Manuel Alarcón &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="http://geeks.ms/blogs/rafahernandez/archive/2012/04/22/ef-code-first-soportando-enumeraciones-en-nuestras-entidades.aspx"&gt;EF Code first, soportando enumeraciones en nuestras entidades&lt;/a&gt;&lt;/strong&gt;       &lt;br /&gt;Rafa Hernández &lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;

Html/Css/Javascript&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="http://www.kirupa.com/html5/rounding_numbers_in_javascript.htm"&gt;Rounding Numbers in JavaScript&lt;/a&gt;&lt;/strong&gt;       &lt;br /&gt;Kirupa Chinnathambi &lt;/li&gt;
&lt;li&gt;&lt;a href="http://coding.smashingmagazine.com/2012/04/25/pure-css3-cycling-slideshow/" title="A Pure CSS3 Cycling Slideshow"&gt;&lt;strong&gt;A Pure CSS3 Cycling Slideshow&lt;/strong&gt;&lt;/a&gt;       &lt;br /&gt;Alessio Atzeni &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="http://jsil.org/"&gt;JSIL: transform .NET assemblies into javascript&lt;/a&gt;&lt;/strong&gt;       &lt;br /&gt;Vía @migueldeicaza &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="http://blog.koalite.com/2012/04/swiftcore-js-un-contenedor-ioc-para-javascript/"&gt;Swiftcore.js: un contenedor IoC para Javascript&lt;/a&gt;&lt;/strong&gt;       &lt;br /&gt;Juan María Hernández &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="http://www.programania.net/diseno-de-software/entendiendo-los-prototipos-en-javascript/"&gt;Entendiendo los prototipos en JavaScript&lt;/a&gt;&lt;/strong&gt;       &lt;br /&gt;Programania.com &lt;/li&gt;
&lt;li&gt;&lt;a href="http://mir.aculo.us/2012/04/24/5-things-they-told-you-not-to-use-in-javascript/" title="5 things they told you not to use in JavaScript"&gt;&lt;strong&gt;5 things they told you not to use in JavaScript&lt;/strong&gt;&lt;/a&gt;       &lt;br /&gt;Thomas Fuchs &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="http://dublintech.blogspot.co.uk/2012/04/javascript-language-z-cheat-sheet.html"&gt;JavaScript language a- z cheat sheet&lt;/a&gt;&lt;/strong&gt;       &lt;br /&gt;Alex Staveley &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="http://css-tricks.com/fighting-the-space-between-inline-block-elements/"&gt;Fighting the Space Between Inline Block Elements&lt;/a&gt;&lt;/strong&gt;       &lt;br /&gt;Chris Coyier &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="http://www.turnjs.com/"&gt;turn.js: transition similar to real pages in a book or magazine for HTML5&lt;/a&gt;&lt;/strong&gt;       &lt;br /&gt;Vía @genbetadev &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="http://weblogs.asp.net/dwahlin/archive/2012/04/20/jquery-documentation-resources-to-speed-up-your-development.aspx"&gt;jQuery Documentation Resources to Speed Up Your Development&lt;/a&gt;&lt;/strong&gt;       &lt;br /&gt;Dan Wahlin &lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;

Visual Studio/Complementos/Herramientas&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="http://speakingin.net/2012/04/27/codefluent-entities/"&gt;CodeFluent Entities&lt;/a&gt;&lt;/strong&gt;       &lt;br /&gt;Juan Laó &lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.kunal-chowdhury.com/2012/04/why-visualstudio-is-taking-huge-time-to.html"&gt;&lt;strong&gt;Why VisualStudio is taking a huge time to Load Components while debugging?&lt;/strong&gt;&lt;/a&gt;       &lt;br /&gt;Kunal Chowdhury &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="http://blogs.jetbrains.com/dotnet/2012/04/replacing-tags-and-custom-code-analysis-in-html/"&gt;Replacing Tags and Custom Code Analysis in HTML&lt;/a&gt;&lt;/strong&gt;       &lt;br /&gt;Hadi Hariri &lt;/li&gt;
&lt;li&gt;&lt;a href="http://loadstorm.com/"&gt;&lt;strong&gt;LoadStorm: Cloud Load Testing Tool&lt;/strong&gt;&lt;/a&gt;       &lt;br /&gt;Vía @luisruizpavon &lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;

Otros&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="http://blogs.msdn.com/b/dross/archive/2012/04/26/hyperlink-spoofing-and-the-modern-web.aspx"&gt;Hyperlink Spoofing and the Modern Web&lt;/a&gt;&lt;/strong&gt;       &lt;br /&gt;David Ross &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="http://www.xataka.com/historias-de-la-tecnologia/load-feliz-cumpleanos-spectrum"&gt;Load "Feliz Cumpleaños Spectrum"&lt;/a&gt;&lt;/strong&gt;       &lt;br /&gt;Carlos Zahumenszky &lt;/li&gt;
&lt;li&gt;&lt;a href="http://jmalarcon.es/post/Las-cinco-mentes-del-futuro.aspx" title="Las cinco mentes del futuro"&gt;&lt;strong&gt;Las cinco mentes del futuro&lt;/strong&gt;&lt;/a&gt;       &lt;br /&gt;José Manuel Alarcón &lt;/li&gt;
&lt;/ul&gt;
Y no olvidéis que podéis seguir esta información en vivo y en directo desde &lt;a href="http://www.facebook.com/variablenotfound"&gt;Variable not found en Facebook&lt;/a&gt;, o a través de &lt;a href="http://twitter.com/jmaguilar"&gt;Twitter&lt;/a&gt;.     &lt;br /&gt;
&lt;br /&gt;
Publicado en &lt;a href="http://www.variablenotfound.com/"&gt;Variable not found&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/27752126-1282664877533363727?l=www.variablenotfound.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/Xd4ZUJ9hjMTDqof30ypE43oQwhE/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/Xd4ZUJ9hjMTDqof30ypE43oQwhE/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/Xd4ZUJ9hjMTDqof30ypE43oQwhE/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/Xd4ZUJ9hjMTDqof30ypE43oQwhE/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/vnf?a=TmRBEpDyd2A:f3SNqpAs-pg:ecdYMiMMAMM"&gt;&lt;img src="http://feeds.feedburner.com/~ff/vnf?d=ecdYMiMMAMM" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/vnf?a=TmRBEpDyd2A:f3SNqpAs-pg:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/vnf?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/vnf?a=TmRBEpDyd2A:f3SNqpAs-pg:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/vnf?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/vnf?a=TmRBEpDyd2A:f3SNqpAs-pg:4cEx4HpKnUU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/vnf?i=TmRBEpDyd2A:f3SNqpAs-pg:4cEx4HpKnUU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/vnf?a=TmRBEpDyd2A:f3SNqpAs-pg:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/vnf?i=TmRBEpDyd2A:f3SNqpAs-pg:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/vnf?a=TmRBEpDyd2A:f3SNqpAs-pg:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/vnf?i=TmRBEpDyd2A:f3SNqpAs-pg:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/vnf?a=TmRBEpDyd2A:f3SNqpAs-pg:I9og5sOYxJI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/vnf?d=I9og5sOYxJI" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/vnf/~4/TmRBEpDyd2A" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.variablenotfound.com/feeds/1282664877533363727/comments/default" title="Enviar comentarios" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=27752126&amp;postID=1282664877533363727" title="0 comentarios" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/27752126/posts/default/1282664877533363727?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/27752126/posts/default/1282664877533363727?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/vnf/~3/TmRBEpDyd2A/enlaces-interesantes-80.html" title="Enlaces interesantes 80" /><author><name>José M. Aguilar</name><uri>http://www.blogger.com/profile/11683750380776435448</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://3.bp.blogspot.com/_O9D62hXq-ng/S6Hfc0RM0YI/AAAAAAAABOg/bEEA3DZ7Uac/S220/fb1.png" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://lh6.ggpht.com/-7Q5ycQ38QDQ/T5uqlG3mwxI/AAAAAAAACBA/O9VasCFoSic/s72-c/image7_thumb_thumb_thumb_thumb_thumb.png?imgmax=800" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://www.variablenotfound.com/2012/04/enlaces-interesantes-80.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CEQEQXw_fCp7ImA9WhVWEkg.&quot;"><id>tag:blogger.com,1999:blog-27752126.post-5272369631682097340</id><published>2012-04-24T09:25:00.000+02:00</published><updated>2012-04-24T09:25:00.244+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-04-24T09:25:00.244+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="novedades" /><category scheme="http://www.blogger.com/atom/ns#" term="asp.net" /><category scheme="http://www.blogger.com/atom/ns#" term="aspnetmvc" /><category scheme="http://www.blogger.com/atom/ns#" term="razor" /><title>Más características de Razor con MVC 4 y Web Pages 2</title><content type="html">&lt;img align="right" alt="ASP.NET MVC" border="0" height="77" src="http://lh6.ggpht.com/-ph3_h_ypTXA/T4cAyTiZACI/AAAAAAAAB5Y/_qf0GSEgJWc/ASPNETMVC%25255B2%25255D.png?imgmax=800" style="background-image: none; border-width: 0px; display: inline; float: right; margin: 0px 0px 10px 10px; padding-left: 0px; padding-right: 0px; padding-top: 0px;" title="ASP.NET MVC" width="142" /&gt;Hace poco comentamos &lt;a href="http://www.variablenotfound.com/2012/02/algunas-novedades-de-razor-para-mvc-4-y.html"&gt;algunos detalles sobre las novedades que incluirá Razor 2&lt;/a&gt;, la versión que será incluida en ASP.NET MVC 4, y siguen apareciendo más novedades destinadas a mejorar la calidad del código y nuestra productividad al crear las vistas MVC o Web Pages.&lt;br /&gt;
&lt;br /&gt;
En este post vamos a ver otros comportamientos de Razor en distintos escenarios.&lt;br /&gt;
&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;
&lt;h3&gt;



Cerrado implícito de etiquetas&lt;/h3&gt;
La versión anterior de Razor daba problemas con un código como el siguiente:&lt;br /&gt;
&lt;pre style="background-color: transparent; overflow: visible; padding: 0px;"&gt;&lt;span style="font-family: Consolas;"&gt;&lt;span style="background-attachment: scroll; background-image: none; background-repeat: repeat;"&gt;&lt;span style="background-color: yellow;"&gt;&lt;span style="font-size: 10pt;"&gt;@&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 10pt;"&gt;&lt;span style="color: blue;"&gt;if&lt;/span&gt;(passwordNeeded) 
{
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;input&lt;/span&gt;&amp;nbsp;&lt;span style="color: red;"&gt;type&lt;/span&gt;&lt;span style="color: blue;"&gt;="password"&lt;/span&gt;&amp;nbsp;&lt;span style="color: red;"&gt;name&lt;/span&gt;&lt;span style="color: blue;"&gt;="password"&amp;gt;&lt;/span&gt;
}&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;
La página no compila y genera una excepción en tiempo de ejecución debido a que la etiqueta &lt;code&gt;&amp;lt;input&amp;gt;&lt;/code&gt; no se ha cerrado explícitamente usando la sintaxis de autocierre &lt;code&gt;&amp;lt;input … /&amp;gt;&lt;/code&gt; o bien mediante el cierre de toda la vida &lt;code&gt;&amp;lt;/input&amp;gt;&lt;/code&gt;.&lt;br /&gt;
&lt;br /&gt;
En Razor 2 se ha creado un parser mucho más complejo, en el que, entre otras cosas, se tienen en cuenta los llamados &lt;em&gt;&lt;a href="http://dev.w3.org/html5/markup/syntax.html#void-element"&gt;void elements&lt;/a&gt;&lt;/em&gt; por la W3C, que son aquellas etiquetas que en ningún caso pueden tener contenido: &lt;code&gt;area&lt;/code&gt;, &lt;code&gt;base&lt;/code&gt;, &lt;code&gt;br&lt;/code&gt;, &lt;code&gt;col&lt;/code&gt;, &lt;code&gt;command&lt;/code&gt;, &lt;code&gt;embed&lt;/code&gt;, &lt;code&gt;hr&lt;/code&gt;, &lt;code&gt;img&lt;/code&gt;, &lt;code&gt;input&lt;/code&gt;, &lt;code&gt;keygen&lt;/code&gt;, &lt;code&gt;link&lt;/code&gt;, &lt;code&gt;meta&lt;/code&gt;, &lt;code&gt;param&lt;/code&gt;, &lt;code&gt;source&lt;/code&gt;, &lt;code&gt;track&lt;/code&gt; y &lt;code&gt;wbr&lt;/code&gt;.&lt;br /&gt;
&lt;br /&gt;
Cuando Razor se encuentra con alguna de estos elementos, si la etiqueta inmediatamente posterior no es la que lo cierra, asumirá que éste está cerrado de forma automática, por lo que el código mostrado anteriormente será válido.&lt;br /&gt;
&lt;h3&gt;



Rutas con partes variables&lt;/h3&gt;
&lt;a href="http://www.variablenotfound.com/2012/02/algunas-novedades-de-razor-para-mvc-4-y.html"&gt;Ya vimos&lt;/a&gt; que el nuevo Razor será capaz de interpretar el gusanillo (~) directamente, de forma que ya no será necesario utilizar esos verbosos &lt;code&gt;@Url.Content()&lt;/code&gt; a la hora de referenciar recursos como scripts, imágenes u hojas de estilo:&lt;br /&gt;
&lt;pre style="background-color: transparent; overflow: visible; padding: 0px;"&gt;&lt;span style="font-family: Consolas;"&gt;&lt;span style="color: blue;"&gt;&lt;span style="font-size: 10pt;"&gt;&amp;lt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 10pt;"&gt;&lt;span style="color: maroon;"&gt;script&lt;/span&gt;&amp;nbsp;&lt;span style="color: red;"&gt;type&lt;/span&gt;&lt;span style="color: blue;"&gt;="text/javascript"&lt;/span&gt;&amp;nbsp;&lt;span style="color: red;"&gt;src&lt;/span&gt;&lt;span style="color: blue;"&gt;="&lt;span style="background-color: yellow;"&gt;~/Scripts/jquery-1.7.1.js&lt;/span&gt;"&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon;"&gt;script&lt;/span&gt;&lt;/span&gt;&lt;span style="color: blue; font-size: 10pt;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;
Pues bien, el caso es que las rutas especificadas de esta forma no tienen por qué ser una cadena constante, sino que pueden incluir variables, como en el siguiente ejemplo:&lt;br /&gt;
&lt;pre style="background-color: transparent; overflow: visible; padding: 0px;"&gt;&lt;span style="font-family: Consolas;"&gt;&lt;span style="background-attachment: scroll; background-image: none; background-repeat: repeat;"&gt;&lt;span style="background-color: yellow;"&gt;&lt;span style="font-size: 10pt;"&gt;@{&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 10pt;"&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;var&lt;/span&gt; scriptsFolder = &lt;span style="color: #a31515;"&gt;"scripts"&lt;/span&gt;;
&lt;span style="background-attachment: scroll; background-image: none; background-repeat: repeat;"&gt;&lt;span style="background-color: yellow;"&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;script&lt;/span&gt;&amp;nbsp;&lt;span style="color: red;"&gt;type&lt;/span&gt;&lt;span style="color: blue;"&gt;="text/javascript"&lt;/span&gt;&amp;nbsp;&lt;span style="color: red;"&gt;src&lt;/span&gt;&lt;span style="color: blue;"&gt;="~/&lt;/span&gt;&lt;span style="background-attachment: scroll; background-image: none; background-repeat: repeat;"&gt;&lt;span style="background-color: yellow;"&gt;@&lt;/span&gt;&lt;/span&gt;&lt;span style="color: blue;"&gt;scriptsFolder/jquery-1.7.1.js"&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon;"&gt;script&lt;/span&gt;&lt;/span&gt;&lt;span style="color: blue; font-size: 10pt;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;
Lo que hace Razor en este caso es interpretar y obtener la dirección teniendo en cuenta desde el gusanillo hasta la primera barra, insertar el contenido de la variable, y seguirlo del resto de la cadena constante. El equivalente con la versión anterior (MVC3) de Razor sería algo así:&lt;br /&gt;
&lt;pre style="background-color: transparent; overflow: visible; padding: 0px;"&gt;&lt;span style="font-family: Consolas;"&gt;&lt;span style="color: blue;"&gt;&lt;span style="font-size: 10pt;"&gt;&amp;lt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 10pt;"&gt;&lt;span style="color: maroon;"&gt;script&lt;/span&gt;&amp;nbsp;&lt;span style="color: red;"&gt;type&lt;/span&gt;&lt;span style="color: blue;"&gt;="text/javascript"&lt;/span&gt;&amp;nbsp;&lt;span style="color: red;"&gt;src&lt;/span&gt;&lt;span style="color: blue;"&gt;="&lt;/span&gt;&lt;span style="background-attachment: scroll; background-image: none; background-repeat: repeat;"&gt;&lt;span style="background-color: yellow;"&gt;@&lt;/span&gt;&lt;/span&gt;&lt;span style="color: blue;"&gt;Url.Content(&lt;/span&gt;&lt;span style="color: #a31515;"&gt;"~/"&lt;/span&gt;&lt;span style="color: blue;"&gt;)&lt;/span&gt;&lt;span style="background-attachment: scroll; background-image: none; background-repeat: repeat;"&gt;&lt;span style="background-color: yellow;"&gt;@&lt;/span&gt;&lt;/span&gt;&lt;span style="color: blue;"&gt;scriptsFolder/jquery-1.7.1.js"&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon;"&gt;script&lt;/span&gt;&lt;/span&gt;&lt;span style="color: blue; font-size: 10pt;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;
&lt;h3&gt;



Atributos condicionales con varios valores&lt;/h3&gt;
También vimos en el post anterior que cuando Razor 2 tenía que generar el contenido de un atributo cuyo valor era null, no generaba ni si quiera el nombre del atributo, lo que al final se traducía en un código más sencillo y compacto:&lt;br /&gt;
&lt;pre style="background-color: transparent; overflow: visible; padding: 0px;"&gt;&lt;span style="font-family: Consolas;"&gt;&lt;span style="background-attachment: scroll; background-image: none; background-repeat: repeat;"&gt;&lt;span style="background-color: yellow;"&gt;&lt;span style="font-size: 10pt;"&gt;@{&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 10pt;"&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;string&lt;/span&gt; nullValue = &lt;span style="color: blue;"&gt;null&lt;/span&gt;;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;string&lt;/span&gt; stringValue = &lt;span style="color: #a31515;"&gt;"hello"&lt;/span&gt;;
&lt;span style="background-attachment: scroll; background-image: none; background-repeat: repeat;"&gt;&lt;span style="background-color: yellow;"&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;span&lt;/span&gt;&amp;nbsp;&lt;span style="color: red;"&gt;class&lt;/span&gt;&lt;span style="color: blue;"&gt;="&lt;/span&gt;&lt;span style="background-attachment: scroll; background-image: none; background-repeat: repeat;"&gt;&lt;span style="background-color: yellow;"&gt;@&lt;/span&gt;&lt;/span&gt;&lt;span style="color: blue;"&gt;nullValue"&lt;/span&gt;&amp;nbsp;&lt;span style="color: red;"&gt;id&lt;/span&gt;&lt;span style="color: blue;"&gt;="&lt;/span&gt;&lt;span style="background-attachment: scroll; background-image: none; background-repeat: repeat;"&gt;&lt;span style="background-color: yellow;"&gt;@&lt;/span&gt;&lt;/span&gt;&lt;span style="color: blue;"&gt;stringValue"&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon;"&gt;span&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;
 
&lt;strong&gt;GENERA:&lt;/strong&gt;
&lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;span&lt;/span&gt;&amp;nbsp;&lt;span style="color: red;"&gt;id&lt;/span&gt;&lt;span style="color: blue;"&gt;="hello"&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon;"&gt;span&lt;/span&gt;&lt;/span&gt;&lt;span style="color: blue; font-size: 10pt;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;
Pues bien, este comportamiento funciona incluso cuando en el atributo aparecen valores procedentes de más de una expresión. Aquellas cuyos valores sean nulos no serán generadas (ni siquiera el espacio en blanco que la separa de las demás), y si todas ellas son nulas el atributo no será generado:&lt;br /&gt;
&lt;pre style="background-color: transparent; overflow: visible; padding: 0px;"&gt;&lt;span style="font-family: Consolas;"&gt;&lt;span style="background-attachment: scroll; background-image: none; background-repeat: repeat;"&gt;&lt;span style="background-color: yellow;"&gt;&lt;span style="font-size: 10pt;"&gt;@{&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 10pt;"&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;string&lt;/span&gt; nullValue = &lt;span style="color: blue;"&gt;null&lt;/span&gt;;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;string&lt;/span&gt; stringValue = &lt;span style="color: #a31515;"&gt;"hello"&lt;/span&gt;;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;string&lt;/span&gt; otherNull = &lt;span style="color: blue;"&gt;null&lt;/span&gt;;
&lt;span style="background-attachment: scroll; background-image: none; background-repeat: repeat;"&gt;&lt;span style="background-color: yellow;"&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;span&lt;/span&gt;&amp;nbsp;&lt;span style="color: red;"&gt;class&lt;/span&gt;&lt;span style="color: blue;"&gt;="&lt;/span&gt;&lt;span style="background-attachment: scroll; background-image: none; background-repeat: repeat;"&gt;&lt;span style="background-color: yellow;"&gt;@&lt;/span&gt;&lt;/span&gt;&lt;span style="color: blue;"&gt;nullValue&amp;nbsp;&lt;/span&gt;&lt;span style="background-attachment: scroll; background-image: none; background-repeat: repeat;"&gt;&lt;span style="background-color: yellow;"&gt;@&lt;/span&gt;&lt;/span&gt;&lt;span style="color: blue;"&gt;stringValue&amp;nbsp;&lt;/span&gt;&lt;span style="background-attachment: scroll; background-image: none; background-repeat: repeat;"&gt;&lt;span style="background-color: yellow;"&gt;@&lt;/span&gt;&lt;/span&gt;&lt;span style="color: blue;"&gt;otherNull"&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon;"&gt;span&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 10pt;"&gt;&lt;span style="font-family: Consolas;"&gt;&lt;span style="color: blue;"&gt;&amp;gt;
&amp;lt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;span&lt;/span&gt;&amp;nbsp;&lt;span style="color: red;"&gt;class&lt;/span&gt;&lt;span style="color: blue;"&gt;="&lt;/span&gt;&lt;span style="background-attachment: scroll; background-image: none; background-repeat: repeat;"&gt;&lt;span style="background-color: yellow;"&gt;@&lt;/span&gt;&lt;/span&gt;&lt;span style="color: blue;"&gt;nullValue&amp;nbsp;&lt;/span&gt;&lt;span style="background-attachment: scroll; background-image: none; background-repeat: repeat;"&gt;&lt;span style="background-color: yellow;"&gt;@&lt;/span&gt;&lt;/span&gt;&lt;span style="color: blue;"&gt;otherNull"&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon;"&gt;span&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;
 
&lt;strong&gt;GENERA:&lt;/strong&gt;
&lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;span&lt;/span&gt;&amp;nbsp;&lt;span style="color: red;"&gt;class&lt;/span&gt;&lt;span style="color: blue;"&gt;="hello"&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon;"&gt;span&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size: 10pt;"&gt;&lt;span style="color: blue;"&gt;&amp;gt;
&amp;lt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;span&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon;"&gt;span&lt;/span&gt;&lt;/span&gt;&lt;span style="color: blue; font-size: 10pt;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;
&lt;h3&gt;



Tratamiento de atributos booleanos&lt;/h3&gt;
Otro detalle muy interesante lo tenemos al escribir valores para atributos booleanos, como &lt;code&gt;disabled&lt;/code&gt;, &lt;code&gt;checked&lt;/code&gt; o similares. Lo habitual en la versión 1 de Razor para generar apropiadamente estos atributos era hacer algo así:&lt;br /&gt;
&lt;pre style="background-color: transparent; overflow: visible; padding: 0px;"&gt;&lt;span style="font-family: Consolas;"&gt;&lt;span style="background-attachment: scroll; background-image: none; background-repeat: repeat;"&gt;&lt;span style="background-color: yellow;"&gt;&lt;span style="font-size: 10pt;"&gt;@{&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 10pt;"&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;string&lt;/span&gt; disabled = &lt;span style="color: #a31515;"&gt;""&lt;/span&gt;;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;if&lt;/span&gt;(condition)
&amp;nbsp;&amp;nbsp;&amp;nbsp; {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; disabled = &lt;span style="color: #a31515;"&gt;"disabled='disabled'"&lt;/span&gt;;
&amp;nbsp;&amp;nbsp;&amp;nbsp; }
&lt;span style="background-attachment: scroll; background-image: none; background-repeat: repeat;"&gt;&lt;span style="background-color: yellow;"&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;button&lt;/span&gt;&amp;nbsp;&lt;span style="background-attachment: scroll; background-image: none; background-repeat: repeat;"&gt;&lt;span style="background-color: yellow;"&gt;@&lt;/span&gt;&lt;/span&gt;Html.Raw(disabled)&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;Click!&lt;span style="color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon;"&gt;button&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;

&lt;strong&gt;GENERA (dependiendo del valor de condition):&lt;/strong&gt;
&lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;button&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;Click!&lt;span style="color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon;"&gt;button&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;button&lt;/span&gt;&amp;nbsp;&lt;span style="color: red;"&gt;disabled&lt;/span&gt;&lt;span style="color: blue;"&gt;="disabled"&amp;gt;&lt;/span&gt;Click!&lt;span style="color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon;"&gt;button&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;
La nueva versión de Razor permite ser mucho más directo y explícito en estos casos. Introducimos directamente el booleano como valor del atributo; si es &lt;code&gt;true&lt;/code&gt;, el valor del atributo será su mismo nombre, mientras que si es &lt;code&gt;false&lt;/code&gt; el atributo no será renderizado:&lt;br /&gt;
&lt;pre style="background-color: transparent; overflow: visible; padding: 0px;"&gt;&lt;span style="font-family: Consolas;"&gt;&lt;span style="color: blue;"&gt;&lt;span style="font-size: 10pt;"&gt;&amp;lt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 10pt;"&gt;&lt;span style="color: maroon;"&gt;button&lt;/span&gt;&amp;nbsp;&lt;span style="color: red;"&gt;disabled&lt;/span&gt;&lt;span style="color: blue;"&gt;="&lt;/span&gt;&lt;span style="background-attachment: scroll; background-image: none; background-repeat: repeat;"&gt;&lt;span style="background-color: yellow;"&gt;@&lt;/span&gt;&lt;/span&gt;&lt;span style="color: blue;"&gt;condition"&amp;gt;&lt;/span&gt;Click!&lt;span style="color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon;"&gt;button&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;

&lt;strong&gt;GENERA (dependiendo del valor de condition):&lt;/strong&gt;
&lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;button&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;Click!&lt;span style="color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon;"&gt;button&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;button&lt;/span&gt;&amp;nbsp;&lt;span style="color: red;"&gt;disabled&lt;/span&gt;&lt;span style="color: blue;"&gt;="disabled"&amp;gt;&lt;/span&gt;Click!&lt;span style="color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon;"&gt;button&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;
Y eso es todo de momento. Seguiremos atentos a las novedades e iremos contándolas por aquí, como de costumbre :-)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Publicado en &lt;a href="http://www.variablenotfound.com/"&gt;Variable not found&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/27752126-5272369631682097340?l=www.variablenotfound.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/oMUcnI-ysVtcHcSN7xepgnpHazc/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/oMUcnI-ysVtcHcSN7xepgnpHazc/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/oMUcnI-ysVtcHcSN7xepgnpHazc/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/oMUcnI-ysVtcHcSN7xepgnpHazc/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/vnf?a=BkEWU5fCV6E:cvIQXs8OGg8:ecdYMiMMAMM"&gt;&lt;img src="http://feeds.feedburner.com/~ff/vnf?d=ecdYMiMMAMM" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/vnf?a=BkEWU5fCV6E:cvIQXs8OGg8:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/vnf?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/vnf?a=BkEWU5fCV6E:cvIQXs8OGg8:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/vnf?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/vnf?a=BkEWU5fCV6E:cvIQXs8OGg8:4cEx4HpKnUU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/vnf?i=BkEWU5fCV6E:cvIQXs8OGg8:4cEx4HpKnUU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/vnf?a=BkEWU5fCV6E:cvIQXs8OGg8:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/vnf?i=BkEWU5fCV6E:cvIQXs8OGg8:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/vnf?a=BkEWU5fCV6E:cvIQXs8OGg8:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/vnf?i=BkEWU5fCV6E:cvIQXs8OGg8:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/vnf?a=BkEWU5fCV6E:cvIQXs8OGg8:I9og5sOYxJI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/vnf?d=I9og5sOYxJI" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/vnf/~4/BkEWU5fCV6E" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.variablenotfound.com/feeds/5272369631682097340/comments/default" title="Enviar comentarios" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=27752126&amp;postID=5272369631682097340" title="0 comentarios" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/27752126/posts/default/5272369631682097340?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/27752126/posts/default/5272369631682097340?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/vnf/~3/BkEWU5fCV6E/mas-caracteristicas-de-razor-con-mvc-4.html" title="Más características de Razor con MVC 4 y Web Pages 2" /><author><name>José M. Aguilar</name><uri>http://www.blogger.com/profile/11683750380776435448</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://3.bp.blogspot.com/_O9D62hXq-ng/S6Hfc0RM0YI/AAAAAAAABOg/bEEA3DZ7Uac/S220/fb1.png" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://lh6.ggpht.com/-ph3_h_ypTXA/T4cAyTiZACI/AAAAAAAAB5Y/_qf0GSEgJWc/s72-c/ASPNETMVC%25255B2%25255D.png?imgmax=800" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://www.variablenotfound.com/2012/04/mas-caracteristicas-de-razor-con-mvc-4.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D04FSXw6fCp7ImA9WhVWEUs.&quot;"><id>tag:blogger.com,1999:blog-27752126.post-5551532239194300997</id><published>2012-04-23T09:25:00.001+02:00</published><updated>2012-04-23T09:25:18.214+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-04-23T09:25:18.214+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="enlaces" /><title>Enlaces interesantes 79</title><content type="html">&lt;a href="http://lh5.ggpht.com/-D1a32AwRXHY/T5PwEvULbII/AAAAAAAAB_s/jPGiHiCoeok/s1600-h/image7_thumb_thumb_thumb_thumb_thumb.png"&gt;&lt;img align="right" alt="Enlaces interesantes" border="0" height="129" src="http://lh6.ggpht.com/-bTKnfmnBbaM/T5PwHAuq80I/AAAAAAAAB_0/i6Rqx7yy-KU/image7_thumb_thumb_thumb_thumb_thumb%25255B2%25255D.png?imgmax=800" style="background-image: none; border-width: 0px; display: inline; float: right; margin: 0px 0px 10px 10px; padding-left: 0px; padding-right: 0px; padding-top: 0px;" title="Enlaces interesantes" width="172" /&gt;&lt;/a&gt;Estos son los enlaces publicados en &lt;a href="http://www.facebook.com/variablenotfound"&gt;Variable not found en Facebook&lt;/a&gt; y &lt;a href="http://twitter.com/jmaguilar"&gt;Twitter&lt;/a&gt; del 16 al 22 de abril de 2012. Espero que os resulten interesantes :-)&lt;br /&gt;
&lt;h4&gt;
.Net&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="http://www.codeproject.com/Tips/368719/DirectoryInfo-GetFiles-returns-too-many-files"&gt;DirectoryInfo.GetFiles returns too many files&lt;/a&gt;&lt;/strong&gt;       &lt;br /&gt;
Paw Jershauge &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="http://www.codeproject.com/Tips/368891/Who-knows-Enumerable-Range"&gt;Who knows Enumerable.Range(...)?&lt;/a&gt;&lt;/strong&gt;       &lt;br /&gt;
Andreas Gieriet &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="http://bradwilson.typepad.com/blog/2012/04/tpl-and-servers-pt1.html"&gt;Serie: Task Parallel Library and Servers&lt;/a&gt;&lt;/strong&gt;       &lt;br /&gt;
Brad Wilson &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="http://www.blackwasp.co.uk/ReflectInheritedMembers.aspx"&gt;Reflecting Inherited Member Information&lt;/a&gt;&lt;/strong&gt;       &lt;br /&gt;
Richard Carr &lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.jphellemons.nl/post/Extract-jpg-or-png-images-from-a-PDF.aspx"&gt;&lt;strong&gt;Extract jpg or png images from a PDF&lt;/strong&gt;&lt;/a&gt;       &lt;br /&gt;
Jean-Pierre Hellemons &lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.aboutmycode.com/net-framework/building-expression-evaluator-with-expression-trees-in-csharp-table-of-contents/"&gt;&lt;strong&gt;Building Expression Evaluator with Expression Trees in C#&lt;/strong&gt;&lt;/a&gt;       &lt;br /&gt;
Giorgi Dalakishvili &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="http://geeks.ms/blogs/aperez/archive/2012/04/15/c-parallel-for.aspx"&gt;[C#] Parallel.For&lt;/a&gt;&lt;/strong&gt;       &lt;br /&gt;
Andrés Pérez &lt;a name='more'&gt;&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;
Asp.net / WCF&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="http://weblogs.asp.net/gunnarpeipman/archive/2012/04/20/asp-net-web-api-extending-content-negotiation-with-new-formats.aspx"&gt;ASP.NET Web API: Extending content negotiation with new formats&lt;/a&gt;&lt;/strong&gt;       &lt;br /&gt;
Gunnar Peipman &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="http://weblogs.asp.net/gunnarpeipman/archive/2012/04/19/asp-net-web-api-how-content-negotiation-works.aspx"&gt;ASP.NET Web API: How content negotiation works?&lt;/a&gt;&lt;/strong&gt;       &lt;br /&gt;
Gunnar Peipman &lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.sebnilsson.com/blog/2012/4/18/making-mvc-3-razor-intellisense-work-after-installing-mvc-4.html"&gt;&lt;strong&gt;Making MVC 3 Razor IntelliSense work after installing MVC 4 Beta&lt;/strong&gt;&lt;/a&gt;       &lt;br /&gt;
Sebastian Nilsson &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="http://www.programandonet.com/site/gestion-de-excepciones-con-wcf-rest"&gt;Gestión de excepciones con WCF – REST&lt;/a&gt;&lt;/strong&gt;       &lt;br /&gt;
Luis Ruíz Pavón &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="http://www.youtube.com/watch?v=9oSh2IZ88mU"&gt;Vídeo: Infraestructura (ASP.NET MVC)&lt;/a&gt;&lt;/strong&gt;       &lt;br /&gt;
Lucas Ontivero &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="http://blogs.msdn.com/b/jmstall/archive/2012/04/16/how-webapi-does-parameter-binding.aspx"&gt;How WebAPI does Parameter Binding&lt;/a&gt;&lt;/strong&gt;       &lt;br /&gt;
Mike Stall &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="http://geeks.ms/blogs/etomas/archive/2012/04/16/webforms-forzar-postbacks.aspx"&gt;Webforms: Forzar postbacks&lt;/a&gt;&lt;/strong&gt;       &lt;br /&gt;
Eduard Tomás &lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.paulstovell.com/clean-aspnet-mvc-controllers" title="Cleaning up ASP.NET MVC Controllers"&gt;&lt;strong&gt;Cleaning up ASP.NET MVC Controllers&lt;/strong&gt;&lt;/a&gt;       &lt;br /&gt;
Paul Stovell &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="http://geeks.ms/blogs/etomas/archive/2012/04/14/cat-225-logo-en-asp-net-mvc3-sin-usar-bbdd.aspx"&gt;Catálogo en ASP.NET MVC3 sin usar BBDD&lt;/a&gt;&lt;/strong&gt;       &lt;br /&gt;
Eduard Tomás&amp;nbsp;&amp;nbsp; &lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;
Azure / Cloud&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="http://weblogs.asp.net/scottgu/archive/2012/04/16/announcing-windows-azure-media-services.aspx"&gt;Announcing Windows Azure Media Services&lt;/a&gt;&lt;/strong&gt;       &lt;br /&gt;
Scott Guthrie &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="http://www.estoyenlanube.com/hadoop-en-windows-azure-v/"&gt;Hadoop en Windows Azure (V)&lt;/a&gt;&lt;/strong&gt;       &lt;br /&gt;
Ibón Landa &lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;
Conceptos&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="http://www.youtube.com/watch?feature=player_detailpage&amp;amp;v=GWilgJsGYsQ"&gt;Vídeo: Un caso contra Null Object Pattern&lt;/a&gt;&lt;/strong&gt;       &lt;br /&gt;
Lucas Ontivero &lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;
Data access&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="http://opendbiff.codeplex.com/"&gt;Open DBDiff: open source database schema comparison tool for SQL Server 2005/2008&lt;/a&gt;&lt;/strong&gt;       &lt;br /&gt;
Esteban Grinberg &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="http://www.codeproject.com/Articles/368164/EF-Data-Annotations-and-Code-Fluent"&gt;EF Data Annotations and Code Fluent&lt;/a&gt;&lt;/strong&gt;       &lt;br /&gt;
Nadege Deroussen &lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;
Html/Css/Javascript&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://css-tricks.com/triangle-with-shadow/"&gt;&lt;strong&gt;Triangle With Shadow&lt;/strong&gt;&lt;/a&gt;       &lt;br /&gt;
Chris Coyier &lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.codecapers.com/post/jQuery-CSS3-Media-Queries-Dynamic-UX.aspx" title="jQuery + CSS3 Media Queries = Dynamic UX"&gt;&lt;strong&gt;jQuery + CSS3 Media Queries = Dynamic UX&lt;/strong&gt;&lt;/a&gt;       &lt;br /&gt;
Michael Ceranski &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="http://weblogs.asp.net/dwahlin/archive/2012/04/19/consolidating-jquery-ajax-calls.aspx"&gt;jQuery Tip #7 - Consolidating jQuery Ajax Calls&lt;/a&gt;&lt;/strong&gt;       &lt;br /&gt;
Dan Wahlin &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="http://css-tricks.com/saving-the-day-with-scoped-css/"&gt;Saving the Day with Scoped CSS&lt;/a&gt;&lt;/strong&gt;       &lt;br /&gt;
Arley McBlain &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="http://blog.koalite.com/2012/04/inyeccion-de-dependencias-en-javascript-y-otros-lenguajes-dinamicos/"&gt;Inyección de dependencias en Javascript (y otros lenguajes dinámicos)&lt;/a&gt;&lt;/strong&gt;       &lt;br /&gt;
Juan María Hernández &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="http://kazimanzurrashid.com/posts/html5-offline-cache-integration-with-asp-dot-net-mvc-bundle"&gt;Html5 Offline Cache Integration with ASP.NET MVC Bundle&lt;/a&gt;&lt;/strong&gt;       &lt;br /&gt;
Kazi Manzur Rashid &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="http://yepnopejs.com/"&gt;Yepnope.js, a conditional loader for your polyfills&lt;/a&gt;         &lt;br /&gt;
&lt;/strong&gt;Alex Sexton / Ralph Holzmann &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="http://www.topdesignmag.com/all-the-cheat-sheets-that-a-web-developer-needs/"&gt;All The Cheat Sheets That A Web Developer Needs&lt;/a&gt;&lt;/strong&gt;       &lt;br /&gt;
Bogdan &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="http://www.desarrolloweb.com/de_interes/hammer-js-anade-soporte-gestos-tactiles-web-6828.html"&gt;Hammer.js añade soporte de gestos táctiles a tu web&lt;/a&gt;&lt;/strong&gt;       &lt;br /&gt;
desarrolloweb.com &lt;/li&gt;
&lt;li&gt;&lt;a href="http://geeks.ms/blogs/gperez/archive/2012/04/18/tips-como-cambiar-el-237-cono-del-cursor-en-una-p-225-gina-web.aspx"&gt;&lt;strong&gt;[Tips] Como cambiar el ícono del cursor en una página web&lt;/strong&gt;&lt;/a&gt;       &lt;br /&gt;
Gonzalo Pérez &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="http://baconforme.com/"&gt;jQuery plugin: wrap text around a bezier curve or a line&lt;/a&gt;&lt;/strong&gt;       &lt;br /&gt;
David Hudson &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="http://javascriptplayground.com/blog/2012/04/jquery-1-7-event-binding-on-and-off"&gt;jQuery 1.7 Event Binding: .on() &amp;amp; .off()&lt;/a&gt;&lt;/strong&gt;       &lt;br /&gt;
Jack Franklin &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="http://www.jquery4u.com/plugins/10-cool-premium-jquery-countdown-scripts/"&gt;10 Cool Premium jQuery Countdown Scripts&lt;/a&gt;&lt;/strong&gt;       &lt;br /&gt;
jQuery4u &lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.hanselman.com/blog/VisualStudio11ExpressForWebForFrontEndDevelopmentJavaScriptHTML5CSS3.aspx"&gt;&lt;strong&gt;Visual Studio 11 Express for Web for Front End Development - JavaScript/HTML5/CSS3&lt;/strong&gt;&lt;/a&gt;       &lt;br /&gt;
Scott Hanselman &lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;
Visual Studio/Complementos/Herramientas&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="http://blogs.jetbrains.com/dotnet/2012/04/dotpeek-10-beta-available/"&gt;dotPeek 1.0 Beta Available&lt;/a&gt;&lt;/strong&gt;       &lt;br /&gt;
JetBrains, vía @hhariri &lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.troyhunt.com/2012/04/10-illustrated-examples-of-visual.html"&gt;&lt;strong&gt;10 illustrated examples of Visual Studio 11&lt;/strong&gt;&lt;/a&gt;       &lt;br /&gt;
Troy Hunt &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="http://www.peterprovost.org//blog/2012/04/15/visual-studio-11-fakes-part-1"&gt;Visual Studio 11 Fakes Part 1 – Stubs&lt;/a&gt;&lt;/strong&gt;       &lt;br /&gt;
&lt;small&gt;Peter Provost&lt;/small&gt; &lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;
Otros&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="http://www.mcdonaldland.info/files/designpatterns/designpatternscard.pdf"&gt;PDF: Referencia rápida a patrones de diseño&lt;/a&gt;&lt;/strong&gt;       &lt;br /&gt;
Vía @kunfu_code &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="http://weblogs.asp.net/bsimser/archive/2012/04/13/farseer-tutorial-for-the-absolute-beginners.aspx"&gt;Farseer tutorial for the absolute beginners&lt;/a&gt;&lt;/strong&gt;       &lt;br /&gt;
Bil Simser &lt;/li&gt;
&lt;li&gt;&lt;a href="http://haacked.com/archive/2012/04/15/The-Real-Pain-Of-Software-Development-2.aspx.aspx"&gt;&lt;strong&gt;The Real Pain of Software Development [part 2]&lt;/strong&gt;&lt;/a&gt;       &lt;br /&gt;
Phil Haack &lt;/li&gt;
&lt;li&gt;&amp;nbsp; &lt;/li&gt;
&lt;/ul&gt;
Y no olvidéis que podéis seguir esta información en vivo y en directo desde &lt;a href="http://www.facebook.com/variablenotfound"&gt;Variable not found en Facebook&lt;/a&gt;, o a través de &lt;a href="http://twitter.com/jmaguilar"&gt;Twitter&lt;/a&gt;.     &lt;br /&gt;
&lt;br /&gt;
Publicado en &lt;a href="http://www.variablenotfound.com/"&gt;Variable not found&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/27752126-5551532239194300997?l=www.variablenotfound.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/4qrJppuUef-yZG_IA29giw_QDps/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/4qrJppuUef-yZG_IA29giw_QDps/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/4qrJppuUef-yZG_IA29giw_QDps/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/4qrJppuUef-yZG_IA29giw_QDps/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/vnf?a=Sipsc8GU4hA:tqFuJR8G6BI:ecdYMiMMAMM"&gt;&lt;img src="http://feeds.feedburner.com/~ff/vnf?d=ecdYMiMMAMM" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/vnf?a=Sipsc8GU4hA:tqFuJR8G6BI:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/vnf?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/vnf?a=Sipsc8GU4hA:tqFuJR8G6BI:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/vnf?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/vnf?a=Sipsc8GU4hA:tqFuJR8G6BI:4cEx4HpKnUU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/vnf?i=Sipsc8GU4hA:tqFuJR8G6BI:4cEx4HpKnUU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/vnf?a=Sipsc8GU4hA:tqFuJR8G6BI:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/vnf?i=Sipsc8GU4hA:tqFuJR8G6BI:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/vnf?a=Sipsc8GU4hA:tqFuJR8G6BI:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/vnf?i=Sipsc8GU4hA:tqFuJR8G6BI:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/vnf?a=Sipsc8GU4hA:tqFuJR8G6BI:I9og5sOYxJI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/vnf?d=I9og5sOYxJI" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/vnf/~4/Sipsc8GU4hA" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.variablenotfound.com/feeds/5551532239194300997/comments/default" title="Enviar comentarios" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=27752126&amp;postID=5551532239194300997" title="2 comentarios" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/27752126/posts/default/5551532239194300997?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/27752126/posts/default/5551532239194300997?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/vnf/~3/Sipsc8GU4hA/enlaces-interesantes-79.html" title="Enlaces interesantes 79" /><author><name>José M. Aguilar</name><uri>http://www.blogger.com/profile/11683750380776435448</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://3.bp.blogspot.com/_O9D62hXq-ng/S6Hfc0RM0YI/AAAAAAAABOg/bEEA3DZ7Uac/S220/fb1.png" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://lh6.ggpht.com/-bTKnfmnBbaM/T5PwHAuq80I/AAAAAAAAB_0/i6Rqx7yy-KU/s72-c/image7_thumb_thumb_thumb_thumb_thumb%25255B2%25255D.png?imgmax=800" height="72" width="72" /><thr:total>2</thr:total><feedburner:origLink>http://www.variablenotfound.com/2012/04/enlaces-interesantes-79.html</feedburner:origLink></entry><entry gd:etag="W/&quot;C0cAQH47eCp7ImA9WhVXF04.&quot;"><id>tag:blogger.com,1999:blog-27752126.post-6751815939774029137</id><published>2012-04-18T08:31:00.000+02:00</published><updated>2012-04-18T08:37:21.000+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-04-18T08:37:21.000+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="desarrollo" /><category scheme="http://www.blogger.com/atom/ns#" term="humor" /><category scheme="http://www.blogger.com/atom/ns#" term="frikadas" /><title>Las 20 mejores tiras cómicas sobre desarrollo de software</title><content type="html">&lt;a href="http://www.mightywombat.com/" title="Imagen por GJCoulkins"&gt;&lt;img align="right" alt="" border="0" height="125" src="http://lh3.ggpht.com/-aGt2HnUX_5w/T4gNw5iM4uI/AAAAAAAAB8I/G42R03ScG0I/image%25255B45%25255D.png?imgmax=800" style="background-image: none; display: inline; float: right; margin: 0px 0px 10px 10px; padding-left: 0px; padding-right: 0px; padding-top: 0px;" title="" width="115" /&gt;&lt;/a&gt;De vez en cuando surgen en &lt;a href="http://stackoverflow.com/"&gt;Stackoverflow&lt;/a&gt; geniales hilos &lt;a href="http://stackoverflow.com/questions/84556/whats-your-favorite-programmer-cartoon"&gt;como este&lt;/a&gt;, que te alegran el día en que los descubres. En este caso miles de usuarios proponían, votaban y debatían sobre cuál es la viñeta o tira cómica favorita de los programadores y otros especímenes de nuestra fauna digital.&amp;nbsp;&amp;nbsp; &lt;br /&gt;
&lt;br /&gt;
Y las veinte más votadas, auténticas joyas algunas de ellas, fueron las siguientes...  &lt;br /&gt;
&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;
&lt;h3&gt;


20. Programadores de verdad&lt;/h3&gt;
&lt;img alt="" border="0" height="343" src="http://lh5.ggpht.com/-OGPeltdy1So/T4gNycfrLFI/AAAAAAAAB8Q/p_kE_Kg1X3M/image%25255B32%25255D.png?imgmax=800" style="background-image: none; display: inline; margin: 0px 0px 10px 10px; padding-left: 0px; padding-right: 0px; padding-top: 0px;" title="" width="626" /&gt;  &lt;br /&gt;
&lt;div style="text-align: left;"&gt;
Original: &lt;a href="http://xkcd.com/378/" title="http://xkcd.com/378/"&gt;http://xkcd.com/378/&lt;/a&gt;  &lt;/div&gt;
&lt;h3&gt;


19. La aleatoriedad es así&lt;/h3&gt;
&lt;img alt="" border="0" height="185" src="http://lh3.ggpht.com/-c0VQv71o0tM/T4gNz2kbliI/AAAAAAAAB8Y/NiqiIpz2Ves/image%25255B29%25255D.png?imgmax=800" style="background-image: none; display: inline; margin: 0px 0px 10px 10px; padding-left: 0px; padding-right: 0px; padding-top: 0px;" title="" width="626" /&gt;  &lt;br /&gt;
&lt;div style="text-align: left;"&gt;
Original: &lt;a href="http://dilbert.com/strips/comic/2001-10-25/" title="http://dilbert.com/strips/comic/2001-10-25/"&gt;http://dilbert.com/strips/comic/2001-10-25/&lt;/a&gt;  &lt;/div&gt;
&lt;h3&gt;


18. Vistamos la mona de seda&lt;/h3&gt;
&lt;img alt="" border="0" height="260" src="http://lh5.ggpht.com/-IyMYGqMTe30/T4gN1GPY2BI/AAAAAAAAB8g/ggF2VrfPL3E/image%25255B26%25255D.png?imgmax=800" style="background-image: none; display: inline; margin: 0px 0px 10px 10px; padding-left: 0px; padding-right: 0px; padding-top: 0px;" title="" width="347" /&gt;  &lt;br /&gt;
&lt;div style="text-align: left;"&gt;
Original: desconocido  &lt;/div&gt;
&lt;h3&gt;


17. Metodologías ágiles&lt;/h3&gt;
&lt;img alt="" border="0" height="195" src="http://lh5.ggpht.com/-3woJQCEe2AE/T4gN2mOa7wI/AAAAAAAAB8o/s1Q5JOdw8E4/image%25255B21%25255D.png?imgmax=800" style="background-image: none; display: inline; margin: 0px 0px 10px 10px; padding-left: 0px; padding-right: 0px; padding-top: 0px;" title="" width="626" /&gt;  &lt;br /&gt;
Original: &lt;a href="http://dilbert.com/strips/comic/2007-11-26/" title="http://dilbert.com/strips/comic/2007-11-26/"&gt;http://dilbert.com/strips/comic/2007-11-26/&lt;/a&gt;  &lt;br /&gt;
&lt;h3&gt;


16. El token escurridizo&lt;/h3&gt;
&lt;img alt="" border="0" height="193" src="http://lh3.ggpht.com/-SmPyxlmZ7g4/T4gN4PoyTII/AAAAAAAAB8w/7ryTIaoADIQ/image%25255B18%25255D.png?imgmax=800" style="background-image: none; display: inline; margin: 0px 0px 10px 10px; padding-left: 0px; padding-right: 0px; padding-top: 0px;" title="" width="626" /&gt;  &lt;br /&gt;
Original: &lt;a href="http://dilbert.com/strips/comic/1996-05-02/" title="http://dilbert.com/strips/comic/1996-05-02/"&gt;http://dilbert.com/strips/comic/1996-05-02/&lt;/a&gt;  &lt;br /&gt;
&lt;h3&gt;


15. Días productivos&lt;/h3&gt;
&lt;img alt="" border="0" height="306" src="http://lh3.ggpht.com/--uBjUIeYqds/T4gN5eJarcI/AAAAAAAAB84/HpREdRDBb1U/image%25255B15%25255D.png?imgmax=800" style="background-image: none; display: inline; margin: 0px 0px 10px 10px; padding-left: 0px; padding-right: 0px; padding-top: 0px;" title="" width="410" /&gt;  &lt;br /&gt;
Original: &lt;a href="http://www.i-marco.nl/weblog/images/breakdown.png" title="http://www.i-marco.nl/weblog/images/breakdown.png"&gt;http://www.i-marco.nl/weblog/images/breakdown.png&lt;/a&gt;  &lt;br /&gt;
&lt;h3&gt;


14. Nuevos superhéroes&lt;/h3&gt;
&lt;img alt="" border="0" height="513" src="http://lh6.ggpht.com/-1j2OAc_S3w4/T4gN62BeInI/AAAAAAAAB88/BKwlwoPbmiQ/image%25255B11%25255D.png?imgmax=800" style="background-image: none; display: inline; margin: 0px 0px 10px 10px; padding-left: 0px; padding-right: 0px; padding-top: 0px;" title="" width="508" /&gt;  &lt;br /&gt;
Original: &lt;a href="http://xkcd.com/208/" title="http://xkcd.com/208/"&gt;http://xkcd.com/208/&lt;/a&gt;  &lt;br /&gt;
&lt;h3&gt;


13. Lo primero es lo primero&lt;/h3&gt;
&lt;img alt="" border="0" height="330" src="http://lh6.ggpht.com/-fkYv7aBKUxs/T4gN717ebyI/AAAAAAAAB9E/0vTicPg89kk/image%25255B6%25255D.png?imgmax=800" style="background-image: none; display: inline; margin: 0px 0px 10px 10px; padding-left: 0px; padding-right: 0px; padding-top: 0px;" title="" width="300" /&gt;  &lt;br /&gt;
Original: &lt;a href="http://xkcd.com/386/" title="http://xkcd.com/386/"&gt;http://xkcd.com/386/&lt;/a&gt;  &lt;br /&gt;
&lt;h3&gt;


12. Software personalizado&lt;/h3&gt;
&lt;img alt="" border="0" height="195" src="http://lh3.ggpht.com/-dwx1n5gg6Mo/T4gN9gPs8hI/AAAAAAAAB9Q/hE8JrC-xA8Q/image%25255B3%25255D.png?imgmax=800" style="background-image: none; display: inline; margin: 0px 0px 10px 10px; padding-left: 0px; padding-right: 0px; padding-top: 0px;" title="" width="626" /&gt;  &lt;br /&gt;
Original: &lt;a href="http://dilbert.com/strips/comic/2007-02-02/" title="http://dilbert.com/strips/comic/2007-02-02/"&gt;http://dilbert.com/strips/comic/2007-02-02/&lt;/a&gt;  &lt;br /&gt;
&lt;h3&gt;


11. Cuidado con las malas prácticas&lt;/h3&gt;
&lt;img alt="" border="0" height="170" src="http://lh3.ggpht.com/-sH3aFNFPB3Q/T4gN-yx_KoI/AAAAAAAAB9Y/ElMtq9axD3E/image40.png?imgmax=800" style="background-image: none; border-width: 0px; display: inline; margin: 0px 0px 10px 10px; padding-left: 0px; padding-right: 0px; padding-top: 0px;" title="" width="626" /&gt;  &lt;br /&gt;
Original: &lt;a href="http://xkcd.com/292/" title="http://xkcd.com/292/"&gt;http://xkcd.com/292/&lt;/a&gt;  &lt;br /&gt;
&lt;h3&gt;


10. Ballmer peak&lt;/h3&gt;
&lt;img alt="" border="0" height="431" src="http://lh6.ggpht.com/-v3HBcBqHi4g/T4gOACf1MzI/AAAAAAAAB9g/WZbxHOh_L_M/image34%25255B1%25255D.png?imgmax=800" style="background-image: none; display: inline; margin: 0px 0px 10px 10px; padding-left: 0px; padding-right: 0px; padding-top: 0px;" title="" width="475" /&gt;  &lt;br /&gt;
Original: &lt;a href="http://xkcd.com/323/" title="http://xkcd.com/323/"&gt;http://xkcd.com/323/&lt;/a&gt;  &lt;br /&gt;
&lt;h3&gt;


9. Déjame, estoy compilando&lt;/h3&gt;
&lt;img alt="" border="0" height="291" src="http://lh3.ggpht.com/-TpDdX4dN-i4/T4gOBgA9N3I/AAAAAAAAB9o/Ylnfy1kFnNA/image32.png?imgmax=800" style="background-image: none; border-width: 0px; display: inline; margin: 0px 0px 10px 10px; padding-left: 0px; padding-right: 0px; padding-top: 0px;" title="" width="334" /&gt;  &lt;br /&gt;
Original: &lt;a href="http://xkcd.com/303/"&gt;http://xkcd.com/303/&lt;/a&gt;  &lt;br /&gt;
&lt;h3&gt;


8. Gerentes con criterio&lt;/h3&gt;
&lt;img alt="" border="0" height="190" src="http://lh5.ggpht.com/-GqVOnYOEPYQ/T4gODXxrRpI/AAAAAAAAB9w/fY6TOeWIf5M/image28.png?imgmax=800" style="background-image: none; border-width: 0px; display: inline; margin: 0px 0px 10px 10px; padding-left: 0px; padding-right: 0px; padding-top: 0px;" title="" width="626" /&gt;  &lt;br /&gt;
Original: &lt;a href="http://dilbert.com/strips/comic/1995-11-17/" title="http://dilbert.com/strips/comic/1995-11-17/"&gt;http://dilbert.com/strips/comic/1995-11-17/&lt;/a&gt;  &lt;br /&gt;
&lt;h3&gt;


7. Ingeniería de requisitos&lt;/h3&gt;
&lt;h3&gt;


&lt;img alt="" border="0" height="281" src="http://lh3.ggpht.com/-OPPrzI5q0eY/T4gOFtG5JRI/AAAAAAAAB94/1VFpm5Rig0c/image25.png?imgmax=800" style="background-image: none; border-width: 0px; display: inline; margin: 0px 0px 10px 10px; padding-left: 0px; padding-right: 0px; padding-top: 0px;" title="" width="626" /&gt;&lt;/h3&gt;
Original: &lt;a href="http://dilbert.com/strips/comic/2006-01-29/" title="http://dilbert.com/strips/comic/2006-01-29/"&gt;http://dilbert.com/strips/comic/2006-01-29/&lt;/a&gt;  &lt;br /&gt;
&lt;h3&gt;


6. Constantes aleatorias&lt;/h3&gt;
&lt;img alt="" border="0" height="144" src="http://lh6.ggpht.com/-rUb0mqCBv4g/T4gOGeGAyyI/AAAAAAAAB-A/bWJDh_0Tges/image22.png?imgmax=800" style="background-image: none; border-width: 0px; display: inline; margin: 0px 0px 10px 10px; padding-left: 0px; padding-right: 0px; padding-top: 0px;" title="" width="400" /&gt;  &lt;br /&gt;
Original: &lt;a href="http://xkcd.com/221/"&gt;http://xkcd.com/221/&lt;/a&gt;  &lt;br /&gt;
&lt;h3&gt;


5. Métricas avanzadas&lt;/h3&gt;
&lt;img alt="" border="0" height="405" src="http://lh3.ggpht.com/-NreoETwAcrs/T4gOIBaKI_I/AAAAAAAAB-I/YMVL5dxOUOk/image33.png?imgmax=800" style="background-image: none; border-width: 0px; display: inline; margin: 0px 0px 10px 10px; padding-left: 0px; padding-right: 0px; padding-top: 0px;" title="" width="430" /&gt;  &lt;br /&gt;
Original: &lt;a href="http://www.osnews.com/story/19266/WTFs_m" title="http://www.osnews.com/story/19266/WTFs_m"&gt;http://www.osnews.com/story/19266/WTFs_m&lt;/a&gt;  &lt;br /&gt;
&lt;h3&gt;


4. Simplifiquemos&lt;/h3&gt;
&lt;img alt="" border="0" height="484" src="http://lh3.ggpht.com/-1wXCM_syNvw/T4gOJOk2LJI/AAAAAAAAB-Q/qxl0oWcQ8O4/image16.png?imgmax=800" style="background-image: none; border-width: 0px; display: inline; margin: 0px 0px 10px 10px; padding-left: 0px; padding-right: 0px; padding-top: 0px;" title="" width="250" /&gt;  &lt;br /&gt;
Original: &lt;a href="http://stuffthathappens.com/blog/2008/03/05/simplicity/"&gt;http://stuffthathappens.com/blog/2008/03/05/simplicity/&lt;/a&gt;  &lt;br /&gt;
&lt;h3&gt;


3. Vale, si te pones así…&lt;/h3&gt;
&lt;img alt="" border="0" height="299" src="http://lh5.ggpht.com/-Yij40OEZ8sw/T4gOKOEMMZI/AAAAAAAAB-Y/qGbgejd0HpY/image11.png?imgmax=800" style="background-image: none; border-width: 0px; display: inline; margin: 0px 0px 10px 10px; padding-left: 0px; padding-right: 0px; padding-top: 0px;" title="" width="360" /&gt;  &lt;br /&gt;
Original: &lt;a href="http://xkcd.com/149/"&gt;http://xkcd.com/149/&lt;/a&gt;  &lt;br /&gt;
&lt;h3&gt;


2. Bueno, más o menos es lo mismo, ¿no?&lt;/h3&gt;
&lt;img alt="" border="0" height="381" src="http://lh5.ggpht.com/-YdKCMnAT-iM/T4gOMRF7qjI/AAAAAAAAB-g/usyWFVazqwI/image8.png?imgmax=800" style="background-image: none; border-width: 0px; display: inline; margin: 0px 0px 10px 10px; padding-left: 0px; padding-right: 0px; padding-top: 0px;" title="" width="626" /&gt;  &lt;br /&gt;
Original: &lt;a href="http://www.projectcartoon.com/"&gt;projectcartoon.com&lt;/a&gt;  &lt;br /&gt;
&lt;h3&gt;


1. Padres con conciencia social&lt;/h3&gt;
&lt;img alt="" border="0" height="193" src="http://lh5.ggpht.com/-cOStLLJIdh8/T4gONaOnCjI/AAAAAAAAB-o/aK_KLf2EApQ/image2.png?imgmax=800" style="background-image: none; border-width: 0px; display: inline; margin: 0px 0px 10px 10px; padding-left: 0px; padding-right: 0px; padding-top: 0px;" title="" width="626" /&gt;  &lt;br /&gt;
Original: &lt;a href="http://xkcd.com/327/"&gt;http://xkcd.com/327/&lt;/a&gt;  &lt;br /&gt;
&lt;br /&gt;
¡Y esto es todo! Si queréis ver bastantes más, &lt;a href="http://stackoverflow.com/questions/84556/whats-your-favorite-programmer-cartoon"&gt;en el hilo de stackoverflow&lt;/a&gt; podéis seguir deleitándoos con más genialidades de este tipo.  &lt;br /&gt;
&lt;br /&gt;
Publicado en &lt;a href="http://www.variablenotfound.com/"&gt;Variable not found&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/27752126-6751815939774029137?l=www.variablenotfound.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/i9SsceykUxnMWUjvTKuEecUUbJs/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/i9SsceykUxnMWUjvTKuEecUUbJs/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/i9SsceykUxnMWUjvTKuEecUUbJs/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/i9SsceykUxnMWUjvTKuEecUUbJs/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/vnf?a=CXF-ClHMka8:TjYKmrTe-4I:ecdYMiMMAMM"&gt;&lt;img src="http://feeds.feedburner.com/~ff/vnf?d=ecdYMiMMAMM" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/vnf?a=CXF-ClHMka8:TjYKmrTe-4I:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/vnf?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/vnf?a=CXF-ClHMka8:TjYKmrTe-4I:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/vnf?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/vnf?a=CXF-ClHMka8:TjYKmrTe-4I:4cEx4HpKnUU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/vnf?i=CXF-ClHMka8:TjYKmrTe-4I:4cEx4HpKnUU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/vnf?a=CXF-ClHMka8:TjYKmrTe-4I:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/vnf?i=CXF-ClHMka8:TjYKmrTe-4I:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/vnf?a=CXF-ClHMka8:TjYKmrTe-4I:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/vnf?i=CXF-ClHMka8:TjYKmrTe-4I:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/vnf?a=CXF-ClHMka8:TjYKmrTe-4I:I9og5sOYxJI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/vnf?d=I9og5sOYxJI" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/vnf/~4/CXF-ClHMka8" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.variablenotfound.com/feeds/6751815939774029137/comments/default" title="Enviar comentarios" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=27752126&amp;postID=6751815939774029137" title="2 comentarios" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/27752126/posts/default/6751815939774029137?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/27752126/posts/default/6751815939774029137?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/vnf/~3/CXF-ClHMka8/las-20-mejores-tiras-comicas-sobre.html" title="Las 20 mejores tiras cómicas sobre desarrollo de software" /><author><name>José M. Aguilar</name><uri>http://www.blogger.com/profile/11683750380776435448</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://3.bp.blogspot.com/_O9D62hXq-ng/S6Hfc0RM0YI/AAAAAAAABOg/bEEA3DZ7Uac/S220/fb1.png" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://lh3.ggpht.com/-aGt2HnUX_5w/T4gNw5iM4uI/AAAAAAAAB8I/G42R03ScG0I/s72-c/image%25255B45%25255D.png?imgmax=800" height="72" width="72" /><thr:total>2</thr:total><feedburner:origLink>http://www.variablenotfound.com/2012/04/las-20-mejores-tiras-comicas-sobre.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CU8HRX8_fyp7ImA9WhVXFkg.&quot;"><id>tag:blogger.com,1999:blog-27752126.post-3546853234736415092</id><published>2012-04-17T09:45:00.000+02:00</published><updated>2012-04-17T11:10:34.147+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-04-17T11:10:34.147+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="javascript" /><category scheme="http://www.blogger.com/atom/ns#" term="desarrollo" /><category scheme="http://www.blogger.com/atom/ns#" term="patrones" /><category scheme="http://www.blogger.com/atom/ns#" term="knockout" /><title>Knockout (I): pongamos orden en el lado cliente</title><content type="html">La programación web tradicional, basada en el modelo de petición-respuesta de página completa, no requería demasiado código en cliente más allá que el necesario para realizar validaciones y lógica de presentación simple: ¿para qué complicarnos en cliente si podíamos hacerlo todo en servidor?&lt;br /&gt;
&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
De hecho, durante la era Webforms, la célebre pareja formada por &lt;em&gt;viewstate&lt;/em&gt; y &lt;em&gt;postback&lt;/em&gt; llevaban a servidor prácticamente la totalidad de la lógica de presentación mediante el artificio de la programación por eventos, y el&amp;nbsp; código cliente necesario para que todo funcionara era generado de forma automática por ASP.NET en su mayor parte.&lt;br /&gt;
&lt;img align="right" alt="Modelo monolítico tradicional" border="0" height="41" src="http://lh3.ggpht.com/-NR9B2XMg0Gc/T4bF4cGzU9I/AAAAAAAAB3g/jntahxxocGg/image13.png?imgmax=800" style="background-image: none; border-width: 0px; display: inline; float: right; margin: 0px 0px 10px 10px; padding-left: 0px; padding-right: 0px; padding-top: 0px;" title="Modelo monolítico tradicional" width="115" /&gt;&lt;br /&gt;
Esta lógica de presentación podía estar (y de hecho muchas veces estaba) mezclada con tareas de control e incluso con lógica de negocio, y los desarrolladores empezamos a hacernos conscientes de los monstruos que estábamos creando. Esta preocupación provocó la aparición de soluciones que pretendían estructurar los sistemas de forma razonable, separando las responsabilidades y, en definitiva, poniendo un poco de orden en ese caos.&lt;br /&gt;
&lt;br /&gt;
&lt;img align="right" alt="Arquitectura MVC" border="0" height="151" src="http://lh4.ggpht.com/-9zodCIvIIZA/T4bF5exsakI/AAAAAAAAB3k/XzMDUYT_GIM/image14.png?imgmax=800" style="background-image: none; border-width: 0px; display: inline; float: right; margin: 0px 0px 10px 10px; padding-left: 0px; padding-right: 0px; padding-top: 0px;" title="Arquitectura MVC" width="116" /&gt;Implementaciones del patrón &lt;a href="http://en.wikipedia.org/wiki/Model%E2%80%93view%E2%80%93presenter"&gt;MVP&lt;/a&gt;, &lt;a href="http://en.wikipedia.org/wiki/Model_View_ViewModel"&gt;MVVM&lt;/a&gt;, o incluso el &lt;a href="http://www.asp.net/mvc"&gt;framework ASP.NET MVC&lt;/a&gt; son ejemplos del resultado de esta inquietud. Aunque con matices, todos estos enfoques permiten separar la lógica de negocio, control y presentación en “capas” relativamente independientes.&lt;br /&gt;
&lt;br /&gt;
Sin embargo, &lt;strong&gt;la programación web está cambiando&lt;/strong&gt;, o mejor dicho, lo ha hecho ya ;-). El pesado&amp;nbsp; modelo tradicional petición-respuesta de página completa está siendo relegado en favor de interfaces más ágiles y dinámicos que se basan en el &lt;strong&gt;aprovechamiento de la capacidad del cliente para realizar una gran cantidad de tareas&lt;/strong&gt; a través del uso intensivo de scripting y Ajax.&lt;br /&gt;
&lt;br /&gt;
&lt;img align="right" alt="Arquitectura MVC con MVVM en cliente" border="0" height="187" src="http://lh4.ggpht.com/-fV9e-aBEuYQ/T4bF6E_FJ8I/AAAAAAAAB3s/mTQJYzNBpA4/image18.png?imgmax=800" style="background-image: none; border-width: 0px; display: inline; float: right; margin: 0px 0px 10px 10px; padding-left: 0px; padding-right: 0px; padding-top: 0px;" title="Arquitectura MVC con MVVM en cliente" width="229" /&gt;¿Y a dónde nos lleva este cambio de paradigma? Pues, entre otras cosas, a que &lt;strong&gt;el volumen de código script en nuestras páginas ha crecido de forma desmesurada&lt;/strong&gt; y, debido a ello, se incremente exponencialmente la &lt;strong&gt;complejidad en el lado cliente&lt;/strong&gt;.&lt;br /&gt;
&lt;br /&gt;
Pero como ocurrió en el lado servidor, enseguida &lt;strong&gt;han comenzado a aparecer soluciones que nos ayudan a estructurar el código cliente&lt;/strong&gt; usando patrones ya usados en &lt;em&gt;el otro lado&lt;/em&gt;, como MVVM, MVP, o MVC.&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;En esta serie de posts estudiaremos el uso de Knockout&lt;/strong&gt;.js, una biblioteca javascript que facilita la creación de interfaces ricas y dinámicas basándose en el patrón MVVM.&lt;br /&gt;
&lt;h3&gt;


 ¿El patrón MVVM?&lt;/h3&gt;
&lt;a href="http://en.wikipedia.org/wiki/Model_View_ViewModel"&gt;MVVM&lt;/a&gt;, Model-View-ViewModel, es un patrón de diseño de la capa presentación &lt;a href="http://blogs.msdn.com/b/johngossman/archive/2005/10/08/478683.aspx"&gt;definido en 2005 por John Gossman&lt;/a&gt;, de Microsoft, adaptando el &lt;a href="http://martinfowler.com/eaaDev/PresentationModel.html"&gt;Presentation Model&lt;/a&gt; de Fowler a las particularidades de las tecnologías en las que estaba trabajando (WPF).&lt;br /&gt;
&lt;br /&gt;
De forma muy similar a &lt;a href="http://es.wikipedia.org/wiki/Modelo_Vista_Controlador"&gt;MVC&lt;/a&gt;, esta arquitectura divide los componentes en tres grupos.&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;El Modelo&lt;/strong&gt; básicamente contiene datos de forma totalmente independiente de cómo vayan a ser presentados en el UI, y casi siempre sin comportamiento. Por ejemplo, podrían ser clases o entidades planas del dominio de la aplicación.&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;La Vista&lt;/strong&gt; contiene los elementos del interfaz necesarios para comunicarse con el usuario, como etiquetas, cuadros de texto, botones, desplegables, etc. Por ir centrándonos en el contexto que nos interesa, la vista es puro lenguaje de marcado (HTML, XAML…), y no contiene lógica de ningún tipo. Tanto los datos que necesita para componer la UI como el comportamiento de los elementos en pantalla los toma del View-Model usando mecanismos como el &lt;em&gt;binding&lt;/em&gt; (después entraremos en esto). &lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;El Modelo-Vista&lt;/strong&gt;, o View-Model, es una abstracción sobre la Vista que contiene tanto los datos como el comportamiento de ésta, pero sin conocer los detalles sobre cómo está implementada. En cierto sentido podríamos considerar que es similar a un controlador en MVC. Es el encargado de transformar y formatear la información del Modelo para que pueda ser representada en la vista y, de la misma forma, se encarga de recibir y gestionar las acciones del usuario y actualizar el Modelo cuando es necesario. &lt;br /&gt;
&lt;br /&gt;
Para los desarrolladores ASP.NET MVC, el concepto podría asimilarse con una clase ViewModel, a la que además se han incorporado métodos para gestionar los eventos desencadenados por el usuario durante la interacción con la aplicación.&lt;br /&gt;
&lt;br /&gt;
Pero sin duda, &lt;strong&gt;una de las piezas clave en este patrón es el &lt;em&gt;binding&lt;/em&gt;&lt;/strong&gt;, o enlace, tanto de datos como de acciones entre las capas View y View-Model.&lt;br /&gt;
&lt;br /&gt;
En la práctica, este mecanismo permite indicar sobre la Vista, de forma declarativa, &lt;strong&gt;qué propiedades del Modelo-Vista se corresponden con cada uno de los componentes del interfaz de usuario&lt;/strong&gt;, estableciendo un vínculo uni o bidireccional sobre ambos.&lt;br /&gt;
&lt;br /&gt;
Por ejemplo, podríamos tener un cuadro de texto en la Vista vinculado a una propiedad llamada “Nombre” en el View-Model, de forma que cuando el valor de la propiedad cambiara automáticamente se reflejaría en el valor del cuadro de texto, y cuando el usuario modificara el cuadro de texto el valor de la propiedad también sería actualizado de forma automática. Con esto conseguimos mantener Vista y View-Model perfectamente sincronizados sin ningún tipo de esfuerzo por parte del desarrollador.&lt;br /&gt;
&lt;br /&gt;
Y al igual que es posible enlazar elementos del interfaz con propiedades del View-Model, también &lt;strong&gt;podemos enlazar de forma declarativa acciones o eventos del usuario a comandos&lt;/strong&gt;, o métodos definidos sobre el mismo View-Model. Por tanto, y valga como ejemplo, el tratamiento del clic sobre un botón lo implementaríamos en un método del Modelo-Vista, mientras que en la Vista lo único que haríamos es &lt;em&gt;bindear &lt;/em&gt;(enlazar) el evento click del botón a dicho método.&lt;br /&gt;
&lt;h3&gt;


 ¿Qué es Knockout?&lt;/h3&gt;
&lt;img align="right" alt="Knockout.js" border="0" height="76" src="http://lh6.ggpht.com/-lVSGCdrxXcg/T4bF7ODrL9I/AAAAAAAAB30/d5CB-zZnI8I/image%25255B5%25255D.png?imgmax=800" style="background-image: none; border-width: 0px; display: inline; float: right; margin: 0px 0px 10px 10px; padding-left: 0px; padding-right: 0px; padding-top: 0px;" title="Knockout.js" width="258" /&gt;&lt;a href="http://knockoutjs.com/"&gt;Knockout.js&lt;/a&gt; es una biblioteca de scripts desarrollada por &lt;a href="http://blog.stevensanderson.com/"&gt;Steve Sanderson&lt;/a&gt; que implementa el patrón MVVM con el objetivo de facilitarnos la creación de interfaces de usuario de edición y visualización de datos, usando una estructura simple, limpia y mantenible en nuestro código.&lt;br /&gt;
&lt;br /&gt;
Es bastante compacta (~40Kb sin comprimir), no depende de ninguna otra biblioteca para funcionar y funciona con todos los navegadores razonablemente actualizados. Es open source, se distribuye bajo &lt;a href="http://www.opensource.org/licenses/mit-license.php"&gt;licencia MIT&lt;/a&gt; y está muy bien documentada en &lt;a href="http://knockoutjs.com/"&gt;su sitio web&lt;/a&gt; (incluyendo unos tutoriales interactivos bastante buenos).&lt;br /&gt;
&lt;br /&gt;
Sus características principales, que conforman las ventajas que nos aporta a los desarrolladores, son:&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;Sistema de &lt;strong&gt;bindings declarativos&lt;/strong&gt;, expresados sobre los propios tags HTML usando atributos data-bind, que permiten crear un vínculo uni o bidireccional entre elementos del interfaz de usuario y propiedades o acciones del View-Model, que se actualizarán de forma automática ante cambios. &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Seguimiento de dependencias&lt;/strong&gt;, capaz de detectar los cambios realizados tanto en la Vista como en el Modelo-Vista y propagarlos hacia todos los objetos o elementos dependientes. &lt;/li&gt;
&lt;li&gt;Por supuesto, &lt;strong&gt;el interfaz de usuario se actualiza automáticamente&lt;/strong&gt; para reflejar los cambios en el View-Model. &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Incluye un sistema de plantillas&lt;/strong&gt; que facilita la creación porciones de vistas reutilizables. &lt;/li&gt;
&lt;/ul&gt;
Y por si lo que trae de serie Knockout se nos queda corto, podemos extenderlo muy fácilmente.&lt;br /&gt;
&lt;h3&gt;


 ¿En qué tipo de proyectos puedo utilizarlo?&lt;/h3&gt;
&lt;strong&gt;En todos&lt;/strong&gt;: PHP, Python, Perl, JSP, Ruby, ASP.NET MVC, Webforms, ASP clásico, HTML y en los que se os puedan ocurrir. &lt;br /&gt;
&lt;br /&gt;
Realmente se trata de una biblioteca pura de scripts que &lt;strong&gt;funciona en cliente sin dependencias hacia ninguna tecnología concreta en el lado servidor&lt;/strong&gt;.&lt;br /&gt;
&lt;h3&gt;


 ¡Un poco de código, por favor!&lt;/h3&gt;
&lt;img align="right" alt="Pantalla" border="0" height="90" src="http://lh6.ggpht.com/-XTXriy-jJtQ/T4bF8TVeRkI/AAAAAAAAB38/7HbSEysES-Q/image%25255B15%25255D.png?imgmax=800" style="background-image: none; border-width: 0px; display: inline; float: right; margin: 0px 0px 10px 10px; padding-left: 0px; padding-right: 0px; padding-top: 0px;" title="Pantalla" width="271" /&gt;Veamos un ejemplo rápido que demuestre una pequeña parte de la potencia de Knockout. Nuestro objetivo es implementar una funcionalidad sencilla como la siguiente:&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;presentaremos un simple cuadro de texto en el que el usuario podrá introducir su nombre, junto con un botón. &lt;/li&gt;
&lt;li&gt;bajo ellos, un texto en el que se podrá ver el nombre del usuario y el número de veces que ha sido pulsado el botón; las porciones “dinámicas” de este texto (nombre y número de clics) se actualizarán desde script conforme el usuario actúe sobre el interfaz. Es decir, si el usuario modifica el nombre o pulsa el botón, se actualizará el mensaje para representar el nuevo estado.&lt;/li&gt;
&lt;li&gt;además, para complicar un poco más el escenario, como máximo se podrá hacer clic cinco veces sobre el botón. Al llegar a ese punto, el botón deberá deshabilitarse. &lt;/li&gt;
&lt;/ul&gt;
Pero veamos primero una posible implementación utilizando métodos “tradicionales”, puro scripting con un poco de&amp;nbsp; jQuery para simplificar:&lt;br /&gt;
&lt;style type="text/css"&gt;
.tbcode td { border: 1px dotted #c0c0c0 }
&lt;/style&gt;  &lt;br /&gt;
&lt;table border="0" cellpadding="2" cellspacing="0" class="tbcode" style="width: 671px;"&gt;&lt;tbody&gt;
&lt;tr style="background-color: #fafafa; color: black; font-weight: bold;"&gt;       &lt;td valign="top" width="250"&gt;HTML&lt;/td&gt;        &lt;td valign="top" width="419"&gt;SCRIPT&lt;/td&gt;     &lt;/tr&gt;
&lt;tr&gt;       &lt;td valign="top" width="250"&gt;&lt;pre style="background-color: transparent; border: 0px currentColor; overflow: visible; padding: 0px;"&gt;&lt;span style="font-family: Consolas;"&gt;&lt;span style="color: blue;"&gt;&lt;span style="font-size: 10pt;"&gt;&amp;lt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 10pt;"&gt;&lt;span style="color: maroon;"&gt;div&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;
&amp;nbsp; &lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;input&lt;/span&gt;&amp;nbsp;&lt;span style="color: red;"&gt;type&lt;/span&gt;&lt;span style="color: blue;"&gt;="text"&lt;/span&gt;&amp;nbsp;&lt;span style="color: red;"&gt;id&lt;/span&gt;&lt;span style="color: blue;"&gt;="name"&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;/&amp;gt;&lt;/span&gt;
&amp;nbsp; &lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;button&lt;/span&gt;&amp;nbsp;&lt;span style="color: red;"&gt;id&lt;/span&gt;&lt;span style="color: blue;"&gt;="button"&amp;gt;&lt;/span&gt;Click me!&lt;span style="color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon;"&gt;button&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;
&amp;nbsp; &lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;p&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;span&lt;/span&gt;&amp;nbsp;&lt;span style="color: red;"&gt;id&lt;/span&gt;&lt;span style="color: blue;"&gt;="nameLabel"&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon;"&gt;span&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;, 
&amp;nbsp;&amp;nbsp;&amp;nbsp; you've clicked 
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;span&lt;/span&gt;&amp;nbsp;&lt;span style="color: red;"&gt;id&lt;/span&gt;&lt;span style="color: blue;"&gt;="clicksLabel"&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon;"&gt;span&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp; times
&amp;nbsp; &lt;span style="color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon;"&gt;p&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size: 10pt;"&gt;&lt;span style="color: blue;"&gt;&amp;gt;
&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon;"&gt;div&lt;/span&gt;&lt;/span&gt;&lt;span style="color: blue; font-size: 10pt;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;
&lt;/td&gt; &lt;td valign="top" width="419"&gt;&lt;pre style="background-color: transparent; border: 0px currentColor; overflow: visible; padding: 0px;"&gt;&lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size: 10pt;"&gt;$(&lt;span style="color: blue;"&gt;function&lt;/span&gt; () {
&amp;nbsp; &lt;span style="color: blue;"&gt;var&lt;/span&gt; numClicks = 0;
&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&amp;nbsp; $(&lt;span style="color: maroon;"&gt;"#name"&lt;/span&gt;).val(&lt;span style="color: maroon;"&gt;"John"&lt;/span&gt;);
&amp;nbsp; $(&lt;span style="color: maroon;"&gt;"#clicksLabel"&lt;/span&gt;).text(numClicks);
&amp;nbsp; $(&lt;span style="color: maroon;"&gt;"#nameLabel"&lt;/span&gt;).text($(&lt;span style="color: maroon;"&gt;"#name"&lt;/span&gt;).val());
&amp;nbsp; 
&amp;nbsp; $(&lt;span style="color: maroon;"&gt;"#name"&lt;/span&gt;)
&amp;nbsp;&amp;nbsp;&amp;nbsp; .change(&lt;span style="color: blue;"&gt;function&lt;/span&gt; () {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $(&lt;span style="color: maroon;"&gt;"#nameLabel"&lt;/span&gt;).text($(&lt;span style="color: maroon;"&gt;"#name"&lt;/span&gt;).val());
&amp;nbsp;&amp;nbsp;&amp;nbsp; });
&amp;nbsp; 
&amp;nbsp; $(&lt;span style="color: maroon;"&gt;"#button"&lt;/span&gt;).click(&lt;span style="color: blue;"&gt;function&lt;/span&gt; () {
&amp;nbsp;&amp;nbsp;&amp;nbsp; numClicks++;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;if&lt;/span&gt; (numClicks &amp;gt;= 5) {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $(&lt;span style="color: maroon;"&gt;"#button"&lt;/span&gt;).attr(&lt;span style="color: maroon;"&gt;"disabled"&lt;/span&gt;, &lt;span style="color: blue;"&gt;true&lt;/span&gt;);
&amp;nbsp;&amp;nbsp;&amp;nbsp; }
&amp;nbsp;&amp;nbsp;&amp;nbsp; $(&lt;span style="color: maroon;"&gt;"#clicksLabel"&lt;/span&gt;).text(numClicks);
&amp;nbsp; });
});&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;
&lt;/td&gt; &lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;br /&gt;
Observad en el código anterior que, aunque logramos una separación razonable entre la visualización (HTML) y la lógica de presentación (script), el código script es bastante farragoso y presenta una fuerte dependencia hacia la forma en que está implementada la vista. Estamos mezclando inicialización de valores, el registro de manejadores de eventos, lógica, accesos al DOM, mapeo entre valores y controles… demasiadas responsabilidades para un único punto.&lt;br /&gt;
&lt;br /&gt;
Pero lo peor de todo es que esta forma de implementarlo no deja claro qué datos maneja la página, ni qué comportamiento se espera de ella, pues ambos aspectos están dispersos a lo largo del script. Esta forma de desarrollar, cuando nos encontremos ante un escenario más complejo, nos llevaría irremediablemente al caos que comentaba al principio.&lt;br /&gt;
&lt;br /&gt;
¿Y cómo implementaríamos estas mismas funcionalidades con Knockout.js? Veamos primero el script que podríamos emplear, que conformaría la capa View-Model:&lt;br /&gt;
&lt;pre style="background-color: transparent; overflow: visible; padding: 0px;"&gt;&lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size: 10pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;var&lt;/span&gt; viewModel = {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; numClicks: ko.observable(0),
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; name: ko.observable(&lt;span style="color: maroon;"&gt;"Peter"&lt;/span&gt;),
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; canClick: &lt;span style="color: blue;"&gt;function&lt;/span&gt; () {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;return&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;this&lt;/span&gt;.numClicks() &amp;lt; 5;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; },
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; addClick: &lt;span style="color: blue;"&gt;function&lt;/span&gt; () {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;if&lt;/span&gt; (&lt;span style="color: blue;"&gt;this&lt;/span&gt;.canClick()) {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;var&lt;/span&gt; clicks = &lt;span style="color: blue;"&gt;this&lt;/span&gt;.numClicks();
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;this&lt;/span&gt;.numClicks(clicks + 1);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }
&amp;nbsp;&amp;nbsp;&amp;nbsp; };
&amp;nbsp;&amp;nbsp;&amp;nbsp; ko.applyBindings(viewModel);&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;
&lt;br /&gt;
Bastante más simple y ordenado, ¿verdad? En el código podemos ver claramente los datos que necesita la vista para funcionar (&lt;code&gt;numClicks&lt;/code&gt; y &lt;code&gt;name&lt;/code&gt;), y el comportamiento esperado en ella (los métodos &lt;code&gt;canClick()&lt;/code&gt; y &lt;code&gt;addClick()&lt;/code&gt;); ojo, y no existe ninguna referencia hacia la implementación de la vista ni accesos al DOM. &lt;br /&gt;
&lt;br /&gt;
Pasemos ahora a los detalles. &lt;br /&gt;
&lt;br /&gt;
&lt;div style="background-color: #fef5ae; border: 1px solid rgb(202, 202, 202); float: right; height: 72px; margin: 10px 0px 10px 10px; padding: 8px 4px 8px 8px; width: 233px;"&gt;
&lt;code&gt;ko&lt;/code&gt; es el objeto básico de Knockout; o en otras palabras, &lt;strong&gt;ko es a Knockout lo que $ a jQuery&lt;/strong&gt;. &lt;/div&gt;
Las propiedades nombre (&lt;code&gt;name&lt;/code&gt;) y número de clicks (&lt;code&gt;numClicks&lt;/code&gt;) las estamos inicializando a sus valores por defecto, “Peter” y “0” respectivamente. Sin embargo, como podéis observar, usamos para ello el método &lt;code&gt;ko.Observable()&lt;/code&gt;. Esto quiere decir básicamente que estas propiedades serán “vigiladas”, de forma que cuando cambie su valor Knockout deberá analizar qué elementos dependen de ellas y actualizarlos en consecuencia (volveremos a esto cuando veamos el código de la Vista).&lt;br /&gt;
&lt;br /&gt;
También podemos ver que sobre el propio View-Model se define el método &lt;code&gt;canClick()&lt;/code&gt;, que determina si debemos permitir al usuario hacer más clicks sobre el botón, y &lt;code&gt;addClick()&lt;/code&gt;, que será la lógica a ejecutar cuando el usuario lo pulse: simplemente incrementamos el número de clicks, aunque dado que es un objeto “observable” tenemos que hacerlo usándolo como una función tanto a la hora de consultar su valor como de asignárselo.&lt;br /&gt;
&lt;br /&gt;
Por último, la llamada a &lt;code&gt;ko.applyBindings()&lt;/code&gt; lo que hace es poner en marcha Knockout con el objeto View-Model que hemos definido.&lt;br /&gt;
&lt;br /&gt;
Lo interesante de este código es que, aparte de dejar bastante claro qué esperamos de la página, no hay referencia alguna desde el script hacia los elementos de la vista, ni accesos al DOM, simplemente se mantiene actualizado el View-Model. Knockout se encargará de actualizar el UI conforme a los cambios realizados gracias al binding y a los “observables” que hemos comentado anteriormente.&lt;br /&gt;
&lt;br /&gt;
La implementación de la Vista, puro marcado HTML, podría ser&amp;nbsp;la siguiente:&lt;br /&gt;
&lt;pre style="background-color: transparent; overflow: visible; padding: 0px;"&gt;&lt;span style="font-family: Consolas;"&gt;&lt;span style="color: blue;"&gt;&lt;span style="font-size: 10pt;"&gt;&amp;lt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 10pt;"&gt;&lt;span style="color: maroon;"&gt;div&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;input  &lt;/span&gt;&lt;span style="color: red;"&gt;data-bind&lt;/span&gt;&lt;span style="color: blue;"&gt;="value: name" &lt;span style="color: red;"&gt;type&lt;/span&gt;&lt;span style="color: blue;"&gt;="text"&lt;/span&gt; &lt;/span&gt;&lt;span style="color: blue;"&gt;/&amp;gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;button&lt;/span&gt;&amp;nbsp;&lt;span style="color: red;"&gt;data-bind&lt;/span&gt;&lt;span style="color: blue;"&gt;="click: addClick, enable: canClick()"&lt;/span&gt; &lt;span style="color: red;"&gt;type&lt;/span&gt;&lt;span style="color: blue;"&gt;="button"&amp;gt;&lt;/span&gt;Click me!&lt;span style="color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon;"&gt;button&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;p&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;span&lt;/span&gt;&amp;nbsp;&lt;span style="color: red;"&gt;data-bind&lt;/span&gt;&lt;span style="color: blue;"&gt;="text: name"&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon;"&gt;span&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;, you've clicked 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;span&lt;/span&gt;&amp;nbsp;&lt;span style="color: red;"&gt;data-bind&lt;/span&gt;&lt;span style="color: blue;"&gt;="text: numClicks"&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon;"&gt;span&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt; times
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon;"&gt;p&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size: 10pt;"&gt;&lt;span style="color: blue;"&gt;&amp;gt;
&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon;"&gt;div&lt;/span&gt;&lt;/span&gt;&lt;span style="color: blue; font-size: 10pt;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;
&lt;br /&gt;
&lt;strong&gt;El atributo &lt;code&gt;data-bind&lt;/code&gt; es el utilizado por Knockout para definir los enlaces&lt;/strong&gt;, o bindings, desde los elementos del interfaz hacia las propiedades o métodos del View-Model.&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;en el primer caso, el cuadro de edición, estamos enlazando su valor al de la propiedad &lt;code&gt;name&lt;/code&gt; del View-Model. Cuando cambie ésta, el cuadro de texto de texto cambiará y viceversa: &lt;strong&gt;Vista y View-Model estarán siempre sincronizados de forma automática&lt;/strong&gt;. &lt;/li&gt;
&lt;li&gt;en el segundo caso, el botón, enlazamos el evento &lt;code&gt;click&lt;/code&gt; del ratón con el método &lt;code&gt;addClick&lt;/code&gt; del View-Model, y su atributo &lt;code&gt;enable&lt;/code&gt; con &lt;code&gt;canClick()&lt;/code&gt; para deshabilitar el botón cuando hayamos llegado al máximo de veces permitidas. &lt;/li&gt;
&lt;li&gt;el tercer y cuatro enlace se realiza entre los &lt;code&gt;&amp;lt;span&amp;gt;&lt;/code&gt; y las propiedades del View-Model que queremos mostrar. De nuevo la magia de los “observables” hará que cuando éstas cambien el texto interior de estas etiquetas cambien de forma automática para mostrar su valor. &lt;/li&gt;
&lt;/ul&gt;
Fijaos que &lt;strong&gt;en la vista no hay lógica, sólo enlaces hacia datos y comportamiento definido en el View-Model&lt;/strong&gt;.&lt;br /&gt;
&lt;br /&gt;
Bueno, y con esto creo que podemos dejarlo por hoy :-)&amp;nbsp;Obviamente, Knockout es mucho más que esto, y así lo iremos viendo en futuros posts, en los que iremos desmenuzando poco a poco este interesante framework y viendo cómo podemos utilizarlo para mejorar el código de nuestra capa de presentación.&lt;br /&gt;
&lt;br /&gt;
Ah, &lt;a href="https://skydrive.live.com/redir.aspx?cid=c3a43a99b617d787&amp;amp;resid=C3A43A99B617D787!389&amp;amp;parid=C3A43A99B617D787!388"&gt;he colgado en Skydrive el ejemplo&lt;/a&gt; desarrollado en este post. Es un zip de 15kb, con un único archivo .html y otro .js (knockout) con el que podéis jugar para entender mejor su funcionamiento.&lt;br /&gt;
&lt;br /&gt;
Publicado en &lt;a href="http://www.variablenotfound.com/"&gt;Variable not found&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/27752126-3546853234736415092?l=www.variablenotfound.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/wSrQqnT8Dfrmz9Gay5cNX4dQokc/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/wSrQqnT8Dfrmz9Gay5cNX4dQokc/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/wSrQqnT8Dfrmz9Gay5cNX4dQokc/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/wSrQqnT8Dfrmz9Gay5cNX4dQokc/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/vnf?a=tP65ZQQwz6k:SXtECXLMy5U:ecdYMiMMAMM"&gt;&lt;img src="http://feeds.feedburner.com/~ff/vnf?d=ecdYMiMMAMM" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/vnf?a=tP65ZQQwz6k:SXtECXLMy5U:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/vnf?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/vnf?a=tP65ZQQwz6k:SXtECXLMy5U:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/vnf?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/vnf?a=tP65ZQQwz6k:SXtECXLMy5U:4cEx4HpKnUU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/vnf?i=tP65ZQQwz6k:SXtECXLMy5U:4cEx4HpKnUU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/vnf?a=tP65ZQQwz6k:SXtECXLMy5U:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/vnf?i=tP65ZQQwz6k:SXtECXLMy5U:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/vnf?a=tP65ZQQwz6k:SXtECXLMy5U:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/vnf?i=tP65ZQQwz6k:SXtECXLMy5U:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/vnf?a=tP65ZQQwz6k:SXtECXLMy5U:I9og5sOYxJI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/vnf?d=I9og5sOYxJI" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/vnf/~4/tP65ZQQwz6k" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.variablenotfound.com/feeds/3546853234736415092/comments/default" title="Enviar comentarios" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=27752126&amp;postID=3546853234736415092" title="7 comentarios" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/27752126/posts/default/3546853234736415092?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/27752126/posts/default/3546853234736415092?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/vnf/~3/tP65ZQQwz6k/knockout-i-pongamos-orden-en-el-lado.html" title="Knockout (I): pongamos orden en el lado cliente" /><author><name>José M. Aguilar</name><uri>http://www.blogger.com/profile/11683750380776435448</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://3.bp.blogspot.com/_O9D62hXq-ng/S6Hfc0RM0YI/AAAAAAAABOg/bEEA3DZ7Uac/S220/fb1.png" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://lh3.ggpht.com/-NR9B2XMg0Gc/T4bF4cGzU9I/AAAAAAAAB3g/jntahxxocGg/s72-c/image13.png?imgmax=800" height="72" width="72" /><thr:total>7</thr:total><feedburner:origLink>http://www.variablenotfound.com/2012/04/knockout-i-pongamos-orden-en-el-lado.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CU8EQ3cyfSp7ImA9WhVXFkg.&quot;"><id>tag:blogger.com,1999:blog-27752126.post-8906829173345394190</id><published>2012-04-16T09:10:00.000+02:00</published><updated>2012-04-17T11:10:02.995+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-04-17T11:10:02.995+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="enlaces" /><title>Enlaces interesantes 78</title><content type="html">&lt;a href="http://lh4.ggpht.com/-EjfuxQJqQGA/T4lU6Z1NFOI/AAAAAAAAB-0/xWXmrsIv97k/s1600-h/image7_thumb_thumb_thumb_thumb_thumb%25255B1%25255D.png"&gt;&lt;img align="right" alt="Enlaces interesantes" border="0" height="129" src="http://lh3.ggpht.com/-oSgeFVPPyVs/T4lU77QKfII/AAAAAAAAB-8/zp5JiUonAcI/image7_thumb_thumb_thumb_thumb_thumb%25255B2%25255D.png?imgmax=800" style="background-image: none; border-width: 0px; display: inline; float: right; margin: 0px 0px 10px 10px; padding-left: 0px; padding-right: 0px; padding-top: 0px;" title="Enlaces interesantes" width="172" /&gt;&lt;/a&gt;Estos son los enlaces publicados en &lt;a href="http://www.facebook.com/variablenotfound"&gt;Variable not found en Facebook&lt;/a&gt; y &lt;a href="http://twitter.com/jmaguilar"&gt;Twitter&lt;/a&gt; del 9 al 15 de abril de 2012. Espero que os resulten interesantes :-)&lt;br /&gt;
&lt;h4&gt;

 .Net&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="http://weblogs.asp.net/jalpeshpvadgama/archive/2012/04/13/multicast-delegates-in-c.aspx"&gt;Multicast delegates in c#&lt;/a&gt;&lt;/strong&gt;       &lt;br /&gt;
Jalpesh P. Vadgama &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="http://www.programandonet.com/site/gestion-de-excepciones-con-wcf"&gt;Gestión de excepciones con WCF&lt;/a&gt;&lt;/strong&gt;       &lt;br /&gt;
Fernando Escolar &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="http://geeks.ms/blogs/cpsaez/archive/2012/04/11/leer-un-qr-desde-windows-con-la-webcam.aspx"&gt;Leer un QR desde Windows con la webcam&lt;/a&gt;&lt;/strong&gt;       &lt;br /&gt;
Carlos Pérez &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="http://blogs.msdn.com/b/davidrickard/archive/2012/04/07/system-datetime-good-practices-and-common-pitfalls.aspx"&gt;System.DateTime: Good practices and common pitfall&lt;/a&gt;&lt;/strong&gt;s       &lt;br /&gt;
David Rickard &lt;/li&gt;
&lt;li&gt;&lt;a href="http://geekswithblogs.net/hmloo/archive/2012/04/08/how-to-remove-the-last-character-from-stringbuilder.aspx"&gt;&lt;strong&gt;How to remove the last character from Stringbuilder&lt;/strong&gt;&lt;/a&gt;       &lt;br /&gt;
Hmloo &lt;a name='more'&gt;&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;

 Asp.net&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="http://blog.davidebbo.com/2012/04/t4mvc-has-its-own-home-with-some-git.html"&gt;T4MVC has its own home, with some git love&lt;/a&gt;&lt;/strong&gt;       &lt;br /&gt;
David Ebbo &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="http://blogs.msdn.com/b/henrikn/archive/2012/04/10/using-forks-with-asp-net-web-stack-source-on-codeplex.aspx"&gt;Contributing to ASP.NET Web Stack Source on CodePlex&lt;/a&gt;&lt;/strong&gt;       &lt;br /&gt;
Henrik F. Nielsen &lt;/li&gt;
&lt;li&gt;&lt;a href="http://vibrantcode.com/blog/2012/4/10/whats-new-in-razor-v2.html" title="What’s new in Razor v2"&gt;&lt;strong&gt;What’s new in Razor v2&lt;/strong&gt;&lt;/a&gt;       &lt;br /&gt;
Andrew Nurse &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="http://ardalis.com/beyond-role-based-authorization-in-aspnet-mvc"&gt;Beyond Role Based Authorization in ASPNET MVC&lt;/a&gt;&lt;/strong&gt;       &lt;br /&gt;
Steve Smith &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="http://visualstudiomagazine.com/articles/2012/04/09/adding-client-side-validation-in-asp.net-mvc-3.aspx"&gt;Adding Client-Side Validation in ASP.NET MVC 3&lt;/a&gt;&lt;/strong&gt;       &lt;br /&gt;
Peter Vogel &lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.strathweb.com/2012/04/your-own-sports-news-site-with-espn-api-and-knockout-js/" title="Permalink to Your own sports news site with ESPN API and Knockout.js"&gt;&lt;strong&gt;Your own sports news site with ESPN API and Knockout.js&lt;/strong&gt;&lt;/a&gt;       &lt;br /&gt;
Filip W. &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="http://geeks.ms/blogs/jtorrecilla/archive/2012/04/10/mvc-trabajando-con-campos-con-etiquetas-html.aspx"&gt;MVC: Trabajando con campos con etiquetas HTML&lt;/a&gt;&lt;/strong&gt;       &lt;br /&gt;
Javier Torrecilla &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="http://www.codeproject.com/Articles/25050/Embedded-NET-HTTP-Server"&gt;Embedded .NET HTTP Server&lt;/a&gt;&lt;/strong&gt;       &lt;br /&gt;
Bob Janova &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="http://dotnet.dzone.com/articles/why-im-not-using-bundling-mvc4"&gt;Why I'm Not Using Bundling In MVC4.. Yet&lt;/a&gt;&lt;/strong&gt;       &lt;br /&gt;
Alexander Beletsky &lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;

 Azure / Cloud&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="http://www.estoyenlanube.com/hadoop-en-windows-azure-iii/"&gt;Hadoop en Windows Azure (III)&lt;/a&gt;&lt;/strong&gt;       &lt;br /&gt;
Ibon Landa &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="http://www.estoyenlanube.com/big-data-hadoop-y-windows-azure-i/"&gt;Big Data, Hadoop y Windows Azure (I)&lt;/a&gt;&lt;/strong&gt;       &lt;br /&gt;
Ibon Landa &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="http://acloudyplace.com/2012/04/using-the-windows-azure-content-delivery-network/"&gt;Using the Windows Azure Content Delivery Network&lt;/a&gt;&lt;/strong&gt;       &lt;br /&gt;
Maarten Balliauw &lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;

 Conceptos&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="http://ardalis.com/new-is-glue"&gt;New is Glue&lt;/a&gt;&lt;/strong&gt;       &lt;br /&gt;
Steve Smith &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="http://hadihariri.com/2012/04/09/dealing-wht-the-too-many-dependencies-problem/"&gt;Dealing with the “Too many dependencies” problem&lt;/a&gt;&lt;/strong&gt;       &lt;br /&gt;
Hadi Hariri &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="http://blogs.telerik.com/blogs/posts/12-04-04/from-legacy-to-dependency-injection.aspx"&gt;From Legacy to Dependency Injection&lt;/a&gt;&lt;/strong&gt;       &lt;br /&gt;
Telerik code team &lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;

 Data access&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="http://elegantcode.com/2012/04/12/entity-framework-migrations-tips/"&gt;Tips for Entity Framework Migrations&lt;/a&gt;&lt;/strong&gt;       &lt;br /&gt;
Jarod Ferguson &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="http://blogs.msdn.com/b/writingdata_services/archive/2012/04/09/my-favorite-things-in-odata-v3-and-wcf-data-services-5-0.aspx"&gt;My Favorite Things in OData v3 and WCF Data Services 5.0&lt;/a&gt;&lt;/strong&gt;       &lt;br /&gt;
Glenn Gailey &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="http://blogs.msdn.com/b/astoriateam/archive/2012/04/09/wcf-data-services-5-0-rtm-release.aspx"&gt;WCF Data Services 5.0 RTM Release&lt;/a&gt;&lt;/strong&gt;       &lt;br /&gt;
Turker Keskinpala &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="http://blogs.msdn.com/b/adonet/archive/2012/04/09/ef-power-tools-beta-2-available.aspx"&gt;EF Power Tools Beta 2 Available&lt;/a&gt;&lt;/strong&gt;       &lt;br /&gt;
Brice Lambson &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="http://msdn.microsoft.com/en-us/data/hh949853"&gt;Performance Considerations for Entity Framework 5&lt;/a&gt;&lt;/strong&gt;       &lt;br /&gt;
David Obando, Eric Dettinger and others &lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.west-wind.com/weblog/posts/2012/Apr/05/Physical-Directories-vs-MVC-View-Paths"&gt;&lt;strong&gt;Physical Directories vs. MVC View Paths&lt;/strong&gt;&lt;/a&gt;       &lt;br /&gt;
Rick Strahl &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="http://thedatafarm.com/blog/data-access/ef5-where-are-my-dataannotations/"&gt;EF5: Where are my DataAnnotations?&lt;/a&gt;&lt;/strong&gt;       &lt;br /&gt;
Julie Lerman &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="http://geeks.ms/blogs/unai/archive/2012/04/06/cuidado-con-ef-4-3-x-si-bienes-desde-4-2-o-anteriores.aspx"&gt;Cuidado con EF 4.3.X si vienes desde 4.2 o anteriores…&lt;/a&gt;&lt;/strong&gt;       &lt;br /&gt;
Unai Zorrilla &lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;

 Html/Css/Javascript&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="http://net.tutsplus.com/tutorials/html-css-techniques/toying-with-the-html5-filesystem-api/"&gt;Toying With the HTML5 File System API&lt;/a&gt;&lt;/strong&gt;       &lt;br /&gt;
Ivaylo Gerchev &lt;/li&gt;
&lt;li&gt;&lt;a href="http://rbarraza.com/html5-canvas-pageflip/"&gt;&lt;strong&gt;The Secret to the Page Flip in HTML5/Canvas for Windows8 and iOS&lt;/strong&gt; &lt;/a&gt;      &lt;br /&gt;
Rick Barraza &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="http://blogs.msdn.com/b/visualstudio/archive/2012/04/10/javascript-debugging-enhancements.aspx"&gt;JavaScript Debugging Enhancements&lt;/a&gt;&lt;/strong&gt;       &lt;br /&gt;
Dmitri Leonov &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="http://wufoo.com/html5/"&gt;The Current State of HTML5 Forms&lt;/a&gt;&lt;/strong&gt;       &lt;br /&gt;
Wufoo &lt;/li&gt;
&lt;li&gt;&lt;a href="http://addyosmani.com/blog/understanding-mvvm-a-guide-for-javascript-developers/"&gt;&lt;strong&gt;Understanding MVVM – A Guide For JavaScript Developers&lt;/strong&gt;&lt;/a&gt;       &lt;br /&gt;
Addy Osmani &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="http://www.codeproject.com/Articles/346904/Common-Pitfalls-of-jQuery"&gt;Common Pitfalls of jQuery&lt;/a&gt;&lt;/strong&gt;       &lt;br /&gt;
Peter Olson &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="http://css.dzone.com/articles/writing-your-own-javascript-0"&gt;Writing Your Own JavaScript Library – Enums&lt;/a&gt;&lt;/strong&gt;       &lt;br /&gt;
Gil Fink &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="http://css-tricks.com/on-target/"&gt;On :target&lt;/a&gt;&lt;/strong&gt;       &lt;br /&gt;
Chris Coyier &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="http://css-tricks.com/on-responsive-images/"&gt;On Responsive Images&lt;/a&gt;&lt;/strong&gt;       &lt;br /&gt;
Chris Coyier &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="http://www.knockmeout.net/2012/04/knockoutjs-performance-gotcha.html"&gt;Knockout.js Performance Gotcha #2–manipulating observableArrays&lt;/a&gt;&lt;/strong&gt;       &lt;br /&gt;
Ryan Niemeyer &lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;

 Visual Studio/Complementos&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="http://docs.nuget.org/docs/release-notes/nuget-1.7"&gt;NuGet 1.7 Release notes&lt;/a&gt;&lt;/strong&gt;       &lt;br /&gt;
NuGet Team &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="http://blogs.telerik.com/blogs/posts/12-04-04/become-a-visual-studio-11-master-detective-a-look-into-the-page-inspector.aspx"&gt;Become a Visual Studio 11 Master Detective – A Look into the Page Inspector&lt;/a&gt;&lt;/strong&gt;       &lt;br /&gt;
ASP.NET AJAX Team &lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;

 Otros&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="http://techcrunch.com/2012/04/11/move-over-1024x768-the-most-popular-screen-resolution-on-the-web-is-now-1366x768/"&gt;The Most Popular Screen Resolution On The Web Is Now 1366×768&lt;/a&gt;&lt;/strong&gt;       &lt;br /&gt;
Frederic Lardinois &lt;/li&gt;
&lt;li&gt;&lt;a href="http://auges.org/post/2012/04/12/Evento-Como-construir-tu-entorno-de-integracion-desde-cero.aspx" title="[Evento] Cómo construir tu entorno de integración continua desde cero"&gt;&lt;strong&gt;[Evento presencial] Cómo construir tu entorno de integración continua desde cero&lt;/strong&gt;&lt;/a&gt;       &lt;br /&gt;
Auges &lt;/li&gt;
&lt;li&gt;&lt;a href="http://semver.org/" title="http://semver.org/"&gt;&lt;strong&gt;Semantic versioning&lt;/strong&gt;&lt;/a&gt;       &lt;br /&gt;
Tom Preston-Werner &lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.jasoft.org/Blog/post/TRUCO-Como-compartir-cualquier-carpeta-o-archivo-en-DropBox.aspx"&gt;&lt;strong&gt;TRUCO: Como compartir cualquier carpeta o archivo con cualquiera en DropBox &lt;/strong&gt;&lt;/a&gt;      &lt;br /&gt;
José Manuel Alarcón &lt;/li&gt;
&lt;/ul&gt;
Y no olvidéis que podéis seguir esta información en vivo y en directo desde &lt;a href="http://www.facebook.com/variablenotfound"&gt;Variable not found en Facebook&lt;/a&gt;, o a través de &lt;a href="http://twitter.com/jmaguilar"&gt;Twitter&lt;/a&gt;.     &lt;br /&gt;
&lt;br /&gt;
Publicado en &lt;a href="http://www.variablenotfound.com/"&gt;Variable not found&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/27752126-8906829173345394190?l=www.variablenotfound.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/ViN6XkjBjP14ueV1wrBdvNip82s/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/ViN6XkjBjP14ueV1wrBdvNip82s/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/ViN6XkjBjP14ueV1wrBdvNip82s/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/ViN6XkjBjP14ueV1wrBdvNip82s/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/vnf?a=iIWUD6N4BYs:6SPUHmOOSS4:ecdYMiMMAMM"&gt;&lt;img src="http://feeds.feedburner.com/~ff/vnf?d=ecdYMiMMAMM" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/vnf?a=iIWUD6N4BYs:6SPUHmOOSS4:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/vnf?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/vnf?a=iIWUD6N4BYs:6SPUHmOOSS4:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/vnf?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/vnf?a=iIWUD6N4BYs:6SPUHmOOSS4:4cEx4HpKnUU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/vnf?i=iIWUD6N4BYs:6SPUHmOOSS4:4cEx4HpKnUU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/vnf?a=iIWUD6N4BYs:6SPUHmOOSS4:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/vnf?i=iIWUD6N4BYs:6SPUHmOOSS4:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/vnf?a=iIWUD6N4BYs:6SPUHmOOSS4:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/vnf?i=iIWUD6N4BYs:6SPUHmOOSS4:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/vnf?a=iIWUD6N4BYs:6SPUHmOOSS4:I9og5sOYxJI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/vnf?d=I9og5sOYxJI" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/vnf/~4/iIWUD6N4BYs" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.variablenotfound.com/feeds/8906829173345394190/comments/default" title="Enviar comentarios" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=27752126&amp;postID=8906829173345394190" title="0 comentarios" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/27752126/posts/default/8906829173345394190?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/27752126/posts/default/8906829173345394190?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/vnf/~3/iIWUD6N4BYs/enlaces-interesantes-78.html" title="Enlaces interesantes 78" /><author><name>José M. Aguilar</name><uri>http://www.blogger.com/profile/11683750380776435448</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://3.bp.blogspot.com/_O9D62hXq-ng/S6Hfc0RM0YI/AAAAAAAABOg/bEEA3DZ7Uac/S220/fb1.png" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://lh3.ggpht.com/-oSgeFVPPyVs/T4lU77QKfII/AAAAAAAAB-8/zp5JiUonAcI/s72-c/image7_thumb_thumb_thumb_thumb_thumb%25255B2%25255D.png?imgmax=800" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://www.variablenotfound.com/2012/04/enlaces-interesantes-78.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CU8DSHg6fCp7ImA9WhVXFkg.&quot;"><id>tag:blogger.com,1999:blog-27752126.post-2683287879982856868</id><published>2012-04-11T08:57:00.000+02:00</published><updated>2012-04-17T11:11:19.614+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-04-17T11:11:19.614+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="novedades" /><category scheme="http://www.blogger.com/atom/ns#" term="asp.net" /><category scheme="http://www.blogger.com/atom/ns#" term="aspnetmvc" /><title>Caching de bundles en MVC 4 (o MVC 3, o Webforms…)</title><content type="html">Hace unos meses &lt;a href="http://www.variablenotfound.com/2011/10/compactacion-y-minimizacion-de.html"&gt;ya estuvimos comentando&lt;/a&gt; el interesante paquete &lt;code&gt;System.Web.Optimizations&lt;/code&gt; que se distribuía con la developer preview de MVC 4, aunque también decíamos que este paquete era igualmente descargable a través de Nuget, y esto hacía posible su uso con MVC 3 o incluso con WebForms. &lt;br /&gt;
&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
Como vimos en su momento, su uso era bastante sencillo. En resumidas cuentas, si no queríamos complicarnos demasiado la vida, era suficiente con introducir el siguiente código en la inicialización de la página (en el &lt;code&gt;Application_Start&lt;/code&gt; del Global.asax):&lt;br /&gt;
&lt;pre style="background-color: transparent; overflow: visible; padding: 0px;"&gt;&lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size: 10pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #2b91af;"&gt;BundleTable&lt;/span&gt;.Bundles.RegisterTemplateBundles();&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;
(Bueno, en la preview el método a llamar era &lt;code&gt;EnableDefaultBundles()&lt;/code&gt;, pero el resultado era el mismo)&lt;br /&gt;
&lt;br /&gt;
Simplemente con ello, ya podíamos acceder a dos recursos que eran generados automáticamente por el sistema:&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;/scripts/js&lt;/strong&gt;, que contiene un único archivo .js con todos los scripts existentes en la carpeta /scripts del proyecto, convenientemente minimizados. &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;/content/css&lt;/strong&gt;, donde encontramos en un único archivo todos los .css presentes en /content, también minimizados para aligerar su descarga. &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;/content/themes/base/css&lt;/strong&gt;, nuevo en la última versión del componente, que incluye los estilos relativos al tema básico de jQuery UI, utilizado en la plantilla del proyectos de MVC 4. &lt;/li&gt;
&lt;/ul&gt;
Además de las ventajas que ofrece en tiempo de ejecución, este mecanismo es muy cómodo a la hora de mantener los scripts actualizados con Nuget. Es decir, dado que descargamos todos los scripts en una única llamada y bajo una única denominación, &lt;strong&gt;ya no será necesario andar actualizando las referencias a las bibliotecas&lt;/strong&gt; en el _Layout.cshtml, algo que resulta molestillo en estos momentos cada vez que actualizamos.&lt;br /&gt;
&lt;br /&gt;
Con la beta de MVC 4 recientemente liberada, &lt;strong&gt;este componente ha incluido también un interesante sistema de cacheo&lt;/strong&gt; que hace aún más eficiente y automático su uso. Si observamos el layout de la plantilla de proyectos ASP.NET&amp;nbsp; MVC 4 veremos que incluye las siguientes líneas:&lt;br /&gt;
&lt;pre style="background-color: transparent; overflow: visible; padding: 0px;"&gt;&lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size: 10pt;"&gt;&lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;link&lt;/span&gt;&amp;nbsp;&lt;span style="color: red;"&gt;href&lt;/span&gt;&lt;span style="color: blue;"&gt;="&lt;/span&gt;&lt;span style="background-attachment: scroll; background-image: none; background-repeat: repeat;"&gt;&lt;span style="background-color: yellow;"&gt;@&lt;/span&gt;&lt;/span&gt;&lt;span style="color: blue;"&gt;System.Web.Optimization.BundleTable.Bundles.ResolveBundleUrl(&lt;/span&gt;&lt;span style="color: #a31515;"&gt;"~/Content/css"&lt;/span&gt;&lt;span style="color: blue;"&gt;)"&lt;/span&gt;&amp;nbsp;
      &lt;span style="color: red;"&gt;rel&lt;/span&gt;&lt;span style="color: blue;"&gt;="stylesheet"&lt;/span&gt;&amp;nbsp;&lt;span style="color: red;"&gt;type&lt;/span&gt;&lt;span style="color: blue;"&gt;="text/css"&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;/&amp;gt;&lt;/span&gt;
&lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;link&lt;/span&gt;&amp;nbsp;&lt;span style="color: red;"&gt;href&lt;/span&gt;&lt;span style="color: blue;"&gt;="&lt;/span&gt;&lt;span style="background-attachment: scroll; background-image: none; background-repeat: repeat;"&gt;&lt;span style="background-color: yellow;"&gt;@&lt;/span&gt;&lt;/span&gt;&lt;span style="color: blue;"&gt;System.Web.Optimization.BundleTable.Bundles.ResolveBundleUrl(&lt;/span&gt;&lt;span style="color: #a31515;"&gt;"~/Content/themes/base/css"&lt;/span&gt;&lt;span style="color: blue;"&gt;)"&lt;/span&gt;&amp;nbsp;
      &lt;span style="color: red;"&gt;rel&lt;/span&gt;&lt;span style="color: blue;"&gt;="stylesheet"&lt;/span&gt;&amp;nbsp;&lt;span style="color: red;"&gt;type&lt;/span&gt;&lt;span style="color: blue;"&gt;="text/css"&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;/&amp;gt;&lt;/span&gt;
&lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;script&lt;/span&gt;&amp;nbsp;&lt;span style="color: red;"&gt;src&lt;/span&gt;&lt;span style="color: blue;"&gt;="&lt;/span&gt;&lt;span style="background-attachment: scroll; background-image: none; background-repeat: repeat;"&gt;&lt;span style="background-color: yellow;"&gt;@&lt;/span&gt;&lt;/span&gt;&lt;span style="color: blue;"&gt;System.Web.Optimization.BundleTable.Bundles.ResolveBundleUrl(&lt;/span&gt;&lt;span style="color: #a31515;"&gt;"~/Scripts/js"&lt;/span&gt;&lt;span style="color: blue;"&gt;)"&amp;gt;
&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon;"&gt;script&lt;/span&gt;&lt;/span&gt;&lt;span style="color: blue; font-size: 10pt;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;
Observad que las referencias a los distintos recursos se generan a través del método &lt;code&gt;ResolveBundleUrl()&lt;/code&gt;. Pues bien, el código generado por las líneas anteriores es, más o menos así de sorprendente:&lt;br /&gt;
&lt;br /&gt;
&lt;pre style="background-color: transparent; overflow: visible; padding: 0px;"&gt;&lt;span style="font-family: Consolas;"&gt;&lt;span style="color: blue;"&gt;&lt;span style="font-size: 10pt;"&gt;&amp;lt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 10pt;"&gt;&lt;span style="color: maroon;"&gt;link&lt;/span&gt;&amp;nbsp;&lt;span style="color: red;"&gt;href&lt;/span&gt;&lt;span style="color: blue;"&gt;="/Content/css?v=oI5uNwN5NWmYrn8EXEybCIbINNBbTM_DnIdXDUL5RwE1"&lt;/span&gt;&amp;nbsp;
      &lt;span style="color: red;"&gt;rel&lt;/span&gt;&lt;span style="color: blue;"&gt;="stylesheet"&lt;/span&gt;&amp;nbsp;&lt;span style="color: red;"&gt;type&lt;/span&gt;&lt;span style="color: blue;"&gt;="text/css"&lt;/span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 10pt;"&gt;&lt;span style="font-family: Consolas;"&gt;&lt;span style="color: blue;"&gt;/&amp;gt;
&amp;lt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;link&lt;/span&gt;&amp;nbsp;&lt;span style="color: red;"&gt;href&lt;/span&gt;&lt;span style="color: blue;"&gt;="/Content/themes/base/css?v=UM624qf1uFt8dYtiIV9PCmYhsyeewBIwY4Ob0i8OdW81"&lt;/span&gt;&amp;nbsp;
      &lt;span style="color: red;"&gt;rel&lt;/span&gt;&lt;span style="color: blue;"&gt;="stylesheet"&lt;/span&gt;&amp;nbsp;&lt;span style="color: red;"&gt;type&lt;/span&gt;&lt;span style="color: blue;"&gt;="text/css"&lt;/span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size: 10pt;"&gt;&lt;span style="color: blue;"&gt;/&amp;gt;
&amp;lt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;script&lt;/span&gt;&amp;nbsp;&lt;span style="color: red;"&gt;src&lt;/span&gt;&lt;span style="color: blue;"&gt;="/Scripts/js?v=GP89PKpk2iEmdQxZTRyBnKWSLjO7XdNG4QC1rv6LPxw1"&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon;"&gt;script&lt;/span&gt;&lt;/span&gt;&lt;span style="color: blue; font-size: 10pt;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;
En las referencias se está &lt;strong&gt;añadiendo un parámetro que contiene un valor hash correspondiente al contenido de la carpeta empaquetada&lt;/strong&gt; en el momento de generación de la vista. La primera petición que se realice enviará de vuelta los recursos empaquetados y minimizados con una validez a nivel de caché de un año; las siguientes peticiones, por tanto, se resolverán muy rápidamente mediante un HTTP 304 (No modificado):&lt;br /&gt;
&lt;br /&gt;
&lt;img alt="Respuestas HTTP 304 en peticiones" border="0" height="159" src="http://lh5.ggpht.com/-IQe101lGpVY/T2eaFCChU_I/AAAAAAAAB0w/V1eBjrivmuw/image%25255B5%25255D.png?imgmax=800" style="background-image: none; border: 0px currentColor; display: inline; margin: 0px 0px 10px 10px; padding-left: 0px; padding-right: 0px; padding-top: 0px;" title="Respuestas HTTP 304 en peticiones" width="626" /&gt;&lt;br /&gt;
&lt;br /&gt;
A partir de ahí, &lt;strong&gt;cualquier cambio que se realice en alguno de los archivos o directorios incluidos en los bundles provocará un cambio de hash&lt;/strong&gt;, por lo que la petición será diferente y, por tanto, el resultado no se tomará desde la caché.&lt;br /&gt;
&lt;br /&gt;
Publicado en: &lt;a href="http://www.variablenotfound.com/"&gt;Variable not found&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/27752126-2683287879982856868?l=www.variablenotfound.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/Pe-OSbd5INFJaOd5-Fh2GsjxGbY/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/Pe-OSbd5INFJaOd5-Fh2GsjxGbY/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/Pe-OSbd5INFJaOd5-Fh2GsjxGbY/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/Pe-OSbd5INFJaOd5-Fh2GsjxGbY/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/vnf?a=1OUY94iOH-Y:k6s6S79Nxdk:ecdYMiMMAMM"&gt;&lt;img src="http://feeds.feedburner.com/~ff/vnf?d=ecdYMiMMAMM" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/vnf?a=1OUY94iOH-Y:k6s6S79Nxdk:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/vnf?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/vnf?a=1OUY94iOH-Y:k6s6S79Nxdk:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/vnf?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/vnf?a=1OUY94iOH-Y:k6s6S79Nxdk:4cEx4HpKnUU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/vnf?i=1OUY94iOH-Y:k6s6S79Nxdk:4cEx4HpKnUU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/vnf?a=1OUY94iOH-Y:k6s6S79Nxdk:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/vnf?i=1OUY94iOH-Y:k6s6S79Nxdk:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/vnf?a=1OUY94iOH-Y:k6s6S79Nxdk:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/vnf?i=1OUY94iOH-Y:k6s6S79Nxdk:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/vnf?a=1OUY94iOH-Y:k6s6S79Nxdk:I9og5sOYxJI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/vnf?d=I9og5sOYxJI" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/vnf/~4/1OUY94iOH-Y" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.variablenotfound.com/feeds/2683287879982856868/comments/default" title="Enviar comentarios" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=27752126&amp;postID=2683287879982856868" title="0 comentarios" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/27752126/posts/default/2683287879982856868?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/27752126/posts/default/2683287879982856868?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/vnf/~3/1OUY94iOH-Y/caching-de-bundles-en-mvc-4-o-mvc-3-o.html" title="Caching de bundles en MVC 4 (o MVC 3, o Webforms…)" /><author><name>José M. Aguilar</name><uri>http://www.blogger.com/profile/11683750380776435448</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://3.bp.blogspot.com/_O9D62hXq-ng/S6Hfc0RM0YI/AAAAAAAABOg/bEEA3DZ7Uac/S220/fb1.png" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://lh5.ggpht.com/-IQe101lGpVY/T2eaFCChU_I/AAAAAAAAB0w/V1eBjrivmuw/s72-c/image%25255B5%25255D.png?imgmax=800" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://www.variablenotfound.com/2012/04/caching-de-bundles-en-mvc-4-o-mvc-3-o.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DUUCQX87eip7ImA9WhVXEUg.&quot;"><id>tag:blogger.com,1999:blog-27752126.post-874210712117944755</id><published>2012-04-09T09:15:00.000+02:00</published><updated>2012-04-11T17:14:20.102+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-04-11T17:14:20.102+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="enlaces" /><title>Enlaces interesantes 77</title><content type="html">&lt;a href="http://lh4.ggpht.com/-LT0KCFHK_vI/T4F-hDdi6GI/AAAAAAAAB28/Sx1pPTm9dZc/s1600-h/image7_thumb_thumb_thumb_thumb_thumb%25255B1%25255D.png"&gt;&lt;img align="right" alt="Enlaces interesantes" border="0" height="129" src="http://lh3.ggpht.com/-rWWuXCAhlho/T4F-iSyc69I/AAAAAAAAB3E/xgg2wTDxbWg/image7_thumb_thumb_thumb_thumb_thumb.png?imgmax=800" style="background-image: none; border-width: 0px; display: inline; float: right; margin: 0px 0px 10px 10px; padding-left: 0px; padding-right: 0px; padding-top: 0px;" title="Enlaces interesantes" width="172" /&gt;&lt;/a&gt;Estos son los enlaces publicados en &lt;a href="http://www.facebook.com/variablenotfound"&gt;Variable not found en Facebook&lt;/a&gt; y &lt;a href="http://twitter.com/jmaguilar"&gt;Twitter&lt;/a&gt; del 2 al 9 de abril de 2012. Espero que os resulten interesantes :-)&lt;br /&gt;
&lt;h4&gt;


.Net&amp;nbsp;&amp;nbsp; &lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="http://weblogs.asp.net/jalpeshpvadgama/archive/2012/04/04/how-to-pad-number-with-leading-zero-with-c.aspx"&gt;How to pad number with leading zero with C#&lt;/a&gt; &lt;/strong&gt;      &lt;br /&gt;Jalpesh P. Vadgama &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="http://geeks.ms/blogs/etomas/archive/2012/04/03/191-qu-233-hay-de-malo-en-este-c-243-digo-c.aspx"&gt;¿Qué hay de malo en este código? (C#)&lt;/a&gt;&lt;/strong&gt;       &lt;br /&gt;Eduard Tomás &lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.hanselman.com/blog/NETVersioningAndMultiTargetingNET45IsAnInplaceUpgradeToNET40.aspx"&gt;&lt;strong&gt;.NET Versioning and Multi-Targeting - .NET 4.5 is an in-place upgrade to .NET 4.0&lt;/strong&gt;&lt;/a&gt;       &lt;br /&gt;Scott Hanselman &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="http://www.blackwasp.co.uk/RangeGenerator.aspx"&gt;A LINQ Style Range Generator&lt;/a&gt;&lt;/strong&gt;       &lt;br /&gt;BlackWasp &lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;
&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;
&lt;h4&gt;


Asp.net&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="http://hadihariri.com/2012/04/06/with-http-your-application-is-your-api/"&gt;With HTTP, your application is your API&lt;/a&gt;&lt;/strong&gt;       &lt;br /&gt;Hadi Hariri &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="http://msdn.microsoft.com/es-es/magazine/hh852586.aspx"&gt;Creación de una barra de progreso con SignalR&lt;/a&gt;&lt;/strong&gt;       &lt;br /&gt;Dino Esposito &lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.troyhunt.com/2012/04/67-of-aspnet-websites-have-serious.html" title="67% of ASP.NET websites have serious configuration related security vulnerabilities"&gt;&lt;strong&gt;67% of ASP.NET websites have serious configuration related security vulnerabilities&lt;/strong&gt;&lt;/a&gt;       &lt;br /&gt;Troy Hunt &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="http://www.codeproject.com/Articles/358360/NET-4-0-ASP-NET-MVC-3-plug-in-architecture-with-e"&gt;.NET 4.0 ASP.NET MVC 3 plug-in architecture with embedded views&lt;/a&gt;&lt;/strong&gt;       &lt;br /&gt;Liviu Ignat &lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.west-wind.com/weblog/posts/2012/Apr/02/Creating-a-JSONP-Formatter-for-ASPNET-Web-API"&gt;&lt;strong&gt;Creating a JSONP Formatter for ASP.NET Web API&lt;/strong&gt;&lt;/a&gt;       &lt;br /&gt;Rick Strahl &lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.troyhunt.com/2012/02/shhh-dont-let-your-response-headers.html"&gt;&lt;strong&gt;Shhh… don’t let your response headers talk too loudly&lt;/strong&gt;&lt;/a&gt;       &lt;br /&gt;Troy Hunt &lt;/li&gt;
&lt;li&gt;&lt;a href="http://trycatchfail.com/blog/post/Using-SpecsForMvc-Introduction.aspx"&gt;&lt;strong&gt;Using SpecsFor.Mvc – Introduction&lt;/strong&gt;&lt;/a&gt;       &lt;br /&gt;Matt Honeycutt &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="http://www.tomdupont.net/2012/03/configuring-bundles-in-mvc-4.html"&gt;Configuring Bundles in MVC 4&lt;/a&gt;&lt;/strong&gt;       &lt;br /&gt;Tom Dupont &lt;/li&gt;
&lt;li&gt;&lt;a href="http://jsaction.codeplex.com/"&gt;&lt;strong&gt;JsAction: call MVC Action Methods from javascript&lt;/strong&gt;&lt;/a&gt;       &lt;br /&gt;XVincentX &lt;/li&gt;
&lt;li&gt;&lt;a href="http://tpeczek.blogspot.com.es/2012/04/infinite-scroll-in-aspnet-mvc.html" title="Infinite Scroll in ASP.NET MVC"&gt;&lt;strong&gt;Infinite Scroll in ASP.NET MVC&lt;/strong&gt;&lt;/a&gt;       &lt;br /&gt;Tomasz Pęczek &lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.dotnetstep.in/asp-net-mvc-generic-client-and-server-side-validation"&gt;&lt;strong&gt;ASP.net MVC generic client and server side validation&lt;/strong&gt;&lt;/a&gt;       &lt;br /&gt;DotNetStep &lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;


Data access&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="http://blogs.msdn.com/b/diego/archive/2012/04/01/tips-to-avoid-deadlocks-in-entity-framework-applications.aspx"&gt;Tips to avoid deadlocks in Entity Framework applications&lt;/a&gt;&lt;/strong&gt;       &lt;br /&gt;Diego B Vega &lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;


Html/Css/Javascript&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="http://html5doctor.com/drag-and-drop-to-server/"&gt;Drag and Drop and Automatically Send to the Server&lt;/a&gt;&lt;/strong&gt;       &lt;br /&gt;Remy Sharp &lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.moretechtips.net/2012/04/18-most-popular-jquery-plugins-of-march.html" title="18 Most Popular jQuery Plugins of March 2012"&gt;&lt;strong&gt;18 Most Popular jQuery Plugins of March 2012&lt;/strong&gt;&lt;/a&gt;       &lt;br /&gt;More Tech Tips &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="http://net.tutsplus.com/tutorials/javascript-ajax/getting-cozy-with-underscore-js/"&gt;Getting Cozy With Underscore.js&lt;/a&gt;&lt;/strong&gt;       &lt;br /&gt;Nettuts &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="http://www.knockmeout.net/2012/03/knockoutjs-performance-gotcha-1ifwith.html"&gt;Knockout.js Performance Gotcha #1–if/with bindings are not always cheap&lt;/a&gt;&lt;/strong&gt;       &lt;br /&gt;Ryan Niemeyer&amp;nbsp;&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;


Otros&amp;nbsp;&amp;nbsp; &lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="http://xribas.typepad.com/xavier_ribas/2012/04/nuevas-obligaciones-en-relaci%C3%B3n-a-las-cookies.html"&gt;Nuevas obligaciones en relación a las cookies&lt;/a&gt;&lt;/strong&gt;       &lt;br /&gt;Xavier Ribas (vía @jm_alarcon)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/li&gt;
&lt;li&gt;&lt;a href="http://jmalarcon.es/post/La-fiebre-del-oro-o-como-hacerte-rico-vendiendo-picos-y-palas.aspx"&gt;&lt;strong&gt;La fiebre del oro o cómo hacerte rico vendiendo picos y palas&lt;/strong&gt;&lt;/a&gt;       &lt;br /&gt;José Manuel Alarcón &lt;/li&gt;
&lt;/ul&gt;
Y no olvidéis que podéis seguir esta información en vivo y en directo desde &lt;a href="http://www.facebook.com/variablenotfound"&gt;Variable not found en Facebook&lt;/a&gt;, o a través de &lt;a href="http://twitter.com/jmaguilar"&gt;Twitter&lt;/a&gt;.     &lt;br /&gt;
&lt;br /&gt;
Publicado en &lt;a href="http://www.variablenotfound.com/"&gt;Variable not found&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/27752126-874210712117944755?l=www.variablenotfound.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/EDN11MTeSn8xGaHQYrNn_PHhoyI/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/EDN11MTeSn8xGaHQYrNn_PHhoyI/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/EDN11MTeSn8xGaHQYrNn_PHhoyI/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/EDN11MTeSn8xGaHQYrNn_PHhoyI/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/vnf?a=WOTkZ2DJR38:CuBWgVjk2k0:ecdYMiMMAMM"&gt;&lt;img src="http://feeds.feedburner.com/~ff/vnf?d=ecdYMiMMAMM" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/vnf?a=WOTkZ2DJR38:CuBWgVjk2k0:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/vnf?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/vnf?a=WOTkZ2DJR38:CuBWgVjk2k0:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/vnf?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/vnf?a=WOTkZ2DJR38:CuBWgVjk2k0:4cEx4HpKnUU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/vnf?i=WOTkZ2DJR38:CuBWgVjk2k0:4cEx4HpKnUU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/vnf?a=WOTkZ2DJR38:CuBWgVjk2k0:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/vnf?i=WOTkZ2DJR38:CuBWgVjk2k0:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/vnf?a=WOTkZ2DJR38:CuBWgVjk2k0:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/vnf?i=WOTkZ2DJR38:CuBWgVjk2k0:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/vnf?a=WOTkZ2DJR38:CuBWgVjk2k0:I9og5sOYxJI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/vnf?d=I9og5sOYxJI" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/vnf/~4/WOTkZ2DJR38" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.variablenotfound.com/feeds/874210712117944755/comments/default" title="Enviar comentarios" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=27752126&amp;postID=874210712117944755" title="0 comentarios" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/27752126/posts/default/874210712117944755?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/27752126/posts/default/874210712117944755?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/vnf/~3/WOTkZ2DJR38/enlaces-interesantes-77.html" title="Enlaces interesantes 77" /><author><name>José M. Aguilar</name><uri>http://www.blogger.com/profile/11683750380776435448</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://3.bp.blogspot.com/_O9D62hXq-ng/S6Hfc0RM0YI/AAAAAAAABOg/bEEA3DZ7Uac/S220/fb1.png" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://lh3.ggpht.com/-rWWuXCAhlho/T4F-iSyc69I/AAAAAAAAB3E/xgg2wTDxbWg/s72-c/image7_thumb_thumb_thumb_thumb_thumb.png?imgmax=800" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://www.variablenotfound.com/2012/04/enlaces-interesantes-77.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CUMGQnc_eCp7ImA9WhVQE0g.&quot;"><id>tag:blogger.com,1999:blog-27752126.post-8495519501047703401</id><published>2012-04-02T09:57:00.000+02:00</published><updated>2012-04-02T09:57:03.940+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-04-02T09:57:03.940+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="enlaces" /><title>Enlaces interesantes 76</title><content type="html">&lt;a href="http://lh5.ggpht.com/-qYjx_z7BgJo/T3lZlV_aopI/AAAAAAAAB2I/0QoLx1Xfv-M/s1600-h/image7_thumb_thumb_thumb_thumb_thumb.png"&gt;&lt;img align="right" alt="Enlaces interesantes" border="0" height="129" src="http://lh5.ggpht.com/-ZmM97WlntCc/T3lZoAP_bBI/AAAAAAAAB2Q/tbWE8hiuKl0/image7_thumb_thumb_thumb_thumb_thumb%25255B1%25255D.png?imgmax=800" style="background-image: none; border-width: 0px; display: inline; float: right; margin: 0px 0px 10px 10px; padding-left: 0px; padding-right: 0px; padding-top: 0px;" title="Enlaces interesantes" width="172" /&gt;&lt;/a&gt;Estos son los enlaces publicados en &lt;a href="http://www.facebook.com/variablenotfound"&gt;Variable not found en Facebook&lt;/a&gt; y &lt;a href="http://twitter.com/jmaguilar"&gt;Twitter&lt;/a&gt; del 26 de marzo al 1 de abril de 2012. Espero que os resulten interesantes :-)&lt;br /&gt;
&lt;h4&gt;

.Net&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://geekswithblogs.net/BlackRabbitCoder/archive/2012/03/29/c.net-little-wonders-skip-and-take.aspx"&gt;&lt;strong&gt;C#/.NET Little Wonders: Skip() and Take()&lt;/strong&gt;&lt;/a&gt;       &lt;br /&gt;James Michael Hare &lt;/li&gt;
&lt;li&gt;&lt;a href="http://blog.ploeh.dk/2012/03/26/IQueryableIsTightCoupling.aspx"&gt;&lt;strong&gt;IQueryable is Tight Coupling&lt;/strong&gt;&lt;/a&gt;       &lt;br /&gt;Mark Seeman &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="http://dotnetslackers.com/articles/net/Ref-and-Out-The-Inside-Story.aspx"&gt;Ref and Out (The Inside Story)&lt;/a&gt;&lt;/strong&gt;       &lt;br /&gt;Akhil Mittal &lt;/li&gt;
&lt;li&gt;&lt;a href="http://geekswithblogs.net/mtreadwell/archive/2012/03/25/149101.aspx" title="Title of this entry"&gt;&lt;strong&gt;C# Value Type Table&lt;/strong&gt;&lt;/a&gt;       &lt;br /&gt;Mark Treadwell &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="http://www.blackwasp.co.uk/SpecialFolders.aspx"&gt;Identifying .NET 4.0 Special Folders&lt;/a&gt;&lt;/strong&gt;       &lt;br /&gt;Richard Carr &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="http://blogs.msdn.com/b/ericlippert/archive/2012/03/26/null-is-not-false.aspx"&gt;Null is not false&lt;/a&gt;&lt;/strong&gt;       &lt;br /&gt;Eric Lippert &lt;/li&gt;
&lt;li&gt;&lt;a href="http://weblogs.asp.net/salvo/archive/2012/03/26/c-and-vb-net-language-specification.aspx"&gt;&lt;strong&gt;C# and VB.NET language specification&lt;/strong&gt;&lt;/a&gt;       &lt;br /&gt;Salvo Davide Rapisarda &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="http://blogs.msdn.com/b/pfxteam/archive/2012/03/25/10287435.aspx"&gt;Do I need to dispose of Tasks?&lt;/a&gt;&lt;/strong&gt;       &lt;br /&gt;Stephen Toub &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="http://blogs.msdn.com/b/pfxteam/archive/2012/03/24/10287244.aspx"&gt;Should I expose asynchronous wrappers for synchronous methods?&lt;/a&gt;&lt;/strong&gt;       &lt;br /&gt;Stephen Toub &lt;a name='more'&gt;&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;

Asp.net&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="http://www.sitepoint.com/combining-less-with-asp-net"&gt;Combining LESS with ASP.NET&lt;/a&gt;&lt;/strong&gt;       &lt;br /&gt;Malcolm Sheridan &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="http://lostechies.com/jimmybogard/2012/03/29/how-to-fork-the-asp-net-web-stack-to-github/"&gt;How to fork the ASP.NET Web Stack to GitHub&lt;/a&gt;&lt;/strong&gt;       &lt;br /&gt;Jimmy Bogard &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="http://www.codeproject.com/Articles/355007/Some-points-to-consider-while-working-on-ASP-NET-M"&gt;Some points to consider while working on ASP.NET MVC and jQuery&lt;/a&gt;&lt;/strong&gt;       &lt;br /&gt;Rahul Bandopadhyaya &lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.hanselman.com/blog/ASPNETMVC4ASPNETWebAPIAndASPNETWebPagesV2RazorNowAllOpenSourceWithContributions.aspx"&gt;&lt;strong&gt;ASP.NET MVC 4, ASP.NET Web API and ASP.NET Web Pages v2 (Razor) now all open source with contributions&lt;/strong&gt;&lt;/a&gt;       &lt;br /&gt;Scott Hanselman &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="http://weblogs.asp.net/scottgu/archive/2012/03/27/asp-net-mvc-web-api-razor-and-open-source.aspx"&gt;ASP.NET MVC, Web API, Razor and Open Source&lt;/a&gt;&lt;/strong&gt;       &lt;br /&gt;Scott Guthrie &lt;/li&gt;
&lt;li&gt;&lt;a href="http://gurustop.net/blog/2012/03/23/writing-absolute-urls-to-other-actions-in-asp-net-mvc/"&gt;&lt;strong&gt;Creating Absolute Urls Of Controller Actions In ASP.NET MVC&lt;/strong&gt;&lt;/a&gt;       &lt;br /&gt;Mohamed Meligy &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="http://softwaredevelopmentexperiences.blogspot.co.nz/2012/03/how-to-build-grid-with-knockout-and.html"&gt;How to build a grid with knockout and ASP.Net MVC&lt;/a&gt;&lt;/strong&gt;       &lt;br /&gt;David Carter       &lt;ul&gt;&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="http://geeks.ms/blogs/gperez/archive/2012/03/25/tutorial-asp-net-web-api-con-mongodb-parte-2-2.aspx"&gt;Tutorial Asp.net Web API con MongoDB – Parte 2.2&lt;/a&gt;&lt;/strong&gt;       &lt;br /&gt;Gonzalo Pérez &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="http://blogs.msdn.com/b/rickandy/archive/2012/03/23/securing-your-asp-net-mvc-4-app-and-the-new-allowanonymous-attribute.aspx"&gt;Securing your ASP.NET MVC 4 App and the new AllowAnonymous Attribute&lt;/a&gt;&lt;/strong&gt;       &lt;br /&gt;Rick Anderson &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="http://codebetter.com/johnvpetersen/2012/03/22/bringing-odata-to-your-webapi-just-use-iqueryable/"&gt;Bringing oData to your WebAPI – just use IQueryable&lt;/a&gt;&lt;/strong&gt;       &lt;br /&gt;John V. Petersen &lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;

Azure / Cloud&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="http://geeks.ms/blogs/dsalgado/archive/2012/03/23/taller-de-nodejs-express-y-azure-en-el-codemotion.aspx"&gt;Ejemplo de NodeJS, Express y Azure en el codemotion&lt;/a&gt;&lt;/strong&gt;       &lt;br /&gt;David Salgado&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;

Data access&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://geeks.ms/blogs/unai/archive/2012/03/27/ef-datetime2-y-el-237-ndice-perdido.aspx"&gt;&lt;strong&gt;EF DateTime2 y el índice perdido&lt;/strong&gt;&lt;/a&gt;       &lt;br /&gt;Unai Zorrilla &lt;/li&gt;
&lt;li&gt;&lt;a href="http://pietschsoft.com/post/2012/03/24/SQLinq-Use-LINQ-to-generate-Ad-Hoc-strongly-typed-SQL-queries.aspx"&gt;&lt;strong&gt;SQLinq: Use LINQ to generate Ad-Hoc, strongly typed SQL queries&lt;/strong&gt;&lt;/a&gt;       &lt;br /&gt;Chris Pietschmann &lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;

Html/Css/Javascript&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="http://www.sitepoint.com/10-tips-better-jquery-plugins/#fbid=W5O4_xQz2mT"&gt;10 Tips for Developing Better jQuery Plugins&lt;/a&gt;&lt;/strong&gt;       &lt;br /&gt;Craig Buckler &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="http://www.jquery4u.com/plugins/10-exciting-jquery-plugins-early-2012/"&gt;10 Most Exciting jQuery Plugins of Early 2012&lt;/a&gt;&lt;/strong&gt;       &lt;br /&gt;jQuery4u &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="http://lostechies.com/derickbailey/2012/03/27/providing-synchronous-asynchronous-flexibility-with-jquery-when/"&gt;Providing Synchronous / Asynchronous Flexibility With jQuery.when&lt;/a&gt;&lt;/strong&gt;       &lt;br /&gt;Derick Bailey &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="http://html5doctor.com/using-modernizr-to-detect-html5-features-and-provide-fallbacks/"&gt;Using Modernizr to detect HTML5 features and provide fallbacks&lt;/a&gt; &lt;/strong&gt;      &lt;br /&gt;&lt;small&gt;Tom Leadbetter&lt;/small&gt; &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="http://css-tricks.com/minimum-paragraph-widths/"&gt;Minimum Paragraph Widths in Fluid Layouts&lt;/a&gt;&lt;/strong&gt;       &lt;br /&gt;Gustav Andersson &lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.markhneedham.com/blog/2012/03/24/saving-the-values-of-dynamically-populated-dropdown-on-back-button/"&gt;&lt;strong&gt;Saving the values of dynamically populated dropdown on back button&lt;/strong&gt;&lt;/a&gt;       &lt;br /&gt;Mark Needham &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="http://www.adobe.com/devnet/html5/articles/javascript-design-patterns-pt1-singleton-composite-facade.html"&gt;JavaScript design patterns – Part 1: Singleton, composite, and façade&lt;/a&gt;&lt;/strong&gt;       &lt;br /&gt;Joseph Zimmerman &lt;/li&gt;
&lt;li&gt;&lt;a href="http://geekswithblogs.net/Albers/archive/2012/03/25/for-modernizr-donrsquot-stop-with-nuget.aspx"&gt;&lt;strong&gt;For Modernizr, Don’t Stop with NuGet&lt;/strong&gt;&lt;/a&gt;       &lt;br /&gt;Steve Albers &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="http://tympanus.net/codrops/2012/03/23/responsive-content-navigator-with-css3/"&gt;Responsive Content Navigator with CSS3&lt;/a&gt;&lt;/strong&gt;       &lt;br /&gt;Mary Lou &lt;/li&gt;
&lt;li&gt;&lt;a href="http://odetocode.com/Blogs/scott/archive/2012/03/24/readable-dom-ready-event-handlers.aspx"&gt;&lt;strong&gt;Readable DOM Ready Event Handlers&lt;/strong&gt;&lt;/a&gt;       &lt;br /&gt;K. Scott Allen &lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;

Visual Studio/Complementos&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://blogs.telerik.com/blogs/posts/12-03-26/my-top-5-visual-studio-11-designer-improvements-for-asp-net-4-5-development.aspx"&gt;&lt;strong&gt;My Top 5 Visual Studio 11 Designer Improvements for ASP.NET 4.5 Development&lt;/strong&gt;&lt;/a&gt;       &lt;br /&gt;Carl Bergenhem &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="http://ardalis.com/make-iis-express-the-default-for-vs2010-web-projects"&gt;Make IIS Express the Default for VS2010 Web Projects&lt;/a&gt;&lt;/strong&gt;       &lt;br /&gt;Steve Smith &lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;

Otros&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.jasoft.org/Blog/post/161;campusMVP-en-ingles!.aspx" title="¡campusMVP en inglés!"&gt;&lt;strong&gt;¡campusMVP en inglés!&lt;/strong&gt;&lt;/a&gt;       &lt;br /&gt;José Manuel Alarcón &lt;/li&gt;
&lt;/ul&gt;
Y no olvidéis que podéis seguir esta información en vivo y en directo desde &lt;a href="http://www.facebook.com/variablenotfound"&gt;Variable not found en Facebook&lt;/a&gt;, o a través de &lt;a href="http://twitter.com/jmaguilar"&gt;Twitter&lt;/a&gt;.     &lt;br /&gt;
&lt;br /&gt;
Publicado en &lt;a href="http://www.variablenotfound.com/"&gt;Variable not found&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/27752126-8495519501047703401?l=www.variablenotfound.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/znpjT4ZxWjqkPGd4k9QesXJiOEA/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/znpjT4ZxWjqkPGd4k9QesXJiOEA/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/znpjT4ZxWjqkPGd4k9QesXJiOEA/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/znpjT4ZxWjqkPGd4k9QesXJiOEA/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/vnf?a=AA9hmzjC8Js:7XjxrBVqCB4:ecdYMiMMAMM"&gt;&lt;img src="http://feeds.feedburner.com/~ff/vnf?d=ecdYMiMMAMM" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/vnf?a=AA9hmzjC8Js:7XjxrBVqCB4:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/vnf?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/vnf?a=AA9hmzjC8Js:7XjxrBVqCB4:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/vnf?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/vnf?a=AA9hmzjC8Js:7XjxrBVqCB4:4cEx4HpKnUU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/vnf?i=AA9hmzjC8Js:7XjxrBVqCB4:4cEx4HpKnUU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/vnf?a=AA9hmzjC8Js:7XjxrBVqCB4:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/vnf?i=AA9hmzjC8Js:7XjxrBVqCB4:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/vnf?a=AA9hmzjC8Js:7XjxrBVqCB4:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/vnf?i=AA9hmzjC8Js:7XjxrBVqCB4:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/vnf?a=AA9hmzjC8Js:7XjxrBVqCB4:I9og5sOYxJI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/vnf?d=I9og5sOYxJI" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/vnf/~4/AA9hmzjC8Js" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.variablenotfound.com/feeds/8495519501047703401/comments/default" title="Enviar comentarios" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=27752126&amp;postID=8495519501047703401" title="1 comentarios" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/27752126/posts/default/8495519501047703401?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/27752126/posts/default/8495519501047703401?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/vnf/~3/AA9hmzjC8Js/enlaces-interesantes-76.html" title="Enlaces interesantes 76" /><author><name>José M. Aguilar</name><uri>http://www.blogger.com/profile/11683750380776435448</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://3.bp.blogspot.com/_O9D62hXq-ng/S6Hfc0RM0YI/AAAAAAAABOg/bEEA3DZ7Uac/S220/fb1.png" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://lh5.ggpht.com/-ZmM97WlntCc/T3lZoAP_bBI/AAAAAAAAB2Q/tbWE8hiuKl0/s72-c/image7_thumb_thumb_thumb_thumb_thumb%25255B1%25255D.png?imgmax=800" height="72" width="72" /><thr:total>1</thr:total><feedburner:origLink>http://www.variablenotfound.com/2012/04/enlaces-interesantes-76.html</feedburner:origLink></entry><entry gd:etag="W/&quot;AkEHSXo6fSp7ImA9WhVXE0w.&quot;"><id>tag:blogger.com,1999:blog-27752126.post-1049709491250420488</id><published>2012-03-28T19:36:00.000+02:00</published><updated>2012-04-13T14:03:58.415+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-04-13T14:03:58.415+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="novedades" /><category scheme="http://www.blogger.com/atom/ns#" term="noticias" /><category scheme="http://www.blogger.com/atom/ns#" term="aspnetmvc" /><category scheme="http://www.blogger.com/atom/ns#" term="webapi" /><category scheme="http://www.blogger.com/atom/ns#" term="software libre" /><category scheme="http://www.blogger.com/atom/ns#" term="razor" /><title>ASP.NET MVC, WebAPI y Razor, ahora mucho más open source</title><content type="html">¿Ein? ¿Pero no lo &lt;a href="http://www.variablenotfound.com/2009/04/aspnet-mvc-es-open-source.html"&gt;eran ya&lt;/a&gt;? Bueno, sí… pero no en toda la amplitud que puede ofrecer este término.&lt;br /&gt;
&lt;br /&gt;
El progresivo acercamiento de ASP.NET al mundo del open source es algo que llevamos observando bastante tiempo. Desde hace unos años es posible acceder al código fuente de muchos productos, y también hemos visto cómo determinados proyectos puramente libres como jQuery eran incluidos con todos los honores en el conjunto de tecnologías de desarrollo oficiales de Microsoft. Ahora vamos un paso más allá.&lt;br /&gt;
&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;
&lt;img align="right" alt="Open Source Initiative" border="0" height="144" src="http://lh6.ggpht.com/-QpUpfhpGoEk/T3NLfgHscqI/AAAAAAAAB10/IAovcD_1d_M/image%25255B3%25255D.png?imgmax=800" style="background-image: none; border: 0px currentColor; display: inline; float: right; margin: 0px 0px 10px 10px; padding-left: 0px; padding-right: 0px; padding-top: 0px;" title="Open Source Initiative" width="123" /&gt;El código fuente de la primera versión de ASP.NET MVC fue publicado en 2009, poco después de su lanzamiento, bajo &lt;a href="http://www.opensource.org/licenses/ms-pl.html"&gt;licencia MS-PL&lt;/a&gt;, un modelo de licencia open source aprobado por la &lt;a href="http://www.opensource.org/"&gt;OSI&lt;/a&gt; (Open Source Initiative). Desde ese momento, cada lanzamiento del framework iba acompañado de la publicación del código fuente en CodePlex, lo que nos permitía descargarlo, estudiar su funcionamiento, compilarlo, y retocarlo libremente. Lo mismo ocurría con la primera versión de WebPages, y previsiblemente lo mismo iba a ocurrir con las nuevas versiones de MVC, WebPages y Web API.&lt;br /&gt;
&lt;br /&gt;
Sin embargo, el desarrollo de estos productos seguía estando totalmente en manos de Microsoft. Es cierto que podíamos reportar bugs y sugerir cambios, pero en ningún momento participar de forma activa en los proyectos, ni ver lo que iba ocurriendo entre una RTM y otra.&lt;br /&gt;
&lt;br /&gt;
Y de pronto, hoy nos levantamos con la noticia de que &lt;a href="http://weblogs.asp.net/scottgu/archive/2012/03/27/asp-net-mvc-web-api-razor-and-open-source.aspx"&gt;ASP.NET MVC, Web API y Web Pages (Razor) van a ser distribuidos como open source&lt;/a&gt; (licencia Apache 2.0). Pero si ya podíamos acceder al código fuente, ¿cuál es la novedad? &lt;br /&gt;
&lt;br /&gt;
Pues, en primer lugar, que ahora &lt;strong&gt;los proyectos se han abierto totalmente de cara a la comunidad&lt;/strong&gt;. No se trata de dejar que se vean las tripas de estos productos una vez terminados, sino de adoptar un modelo de desarrollo abierto y transparente al cien por cien.&lt;br /&gt;
&lt;br /&gt;
Para empezar, ya no tendremos que esperar a las versiones RTM para acceder al código fuente, como ocurría hasta ahora; tendremos total transparencia durante el proceso de desarrollo, puesto que &lt;a href="http://aspnetwebstack.codeplex.com/"&gt;el fuente está ya disponible en un repositorio público&lt;/a&gt; accesible con Git. Podemos descargarlo, clonarlo, hacer forks, sugerir ideas, ver en cualquier momento el estado de los trabajos, las características pendientes de desarrollo, los bugs subsanados y las modificaciones que se están realizando por parte &lt;em&gt;de los contribuyentes&lt;/em&gt; en tiempo real.&lt;br /&gt;
&lt;br /&gt;
&lt;img align="right" alt="Programadores" border="0" height="159" src="http://lh3.ggpht.com/-RMwL1t72MGI/T3NLgnK9XNI/AAAAAAAAB18/OMiZCskVgww/image%25255B8%25255D.png?imgmax=800" style="background-image: none; border: 0px currentColor; display: inline; float: right; margin: 0px 0px 10px 10px; padding-left: 0px; padding-right: 0px; padding-top: 0px;" title="Programadores" width="234" /&gt;Y recalco aquí la palabra “contribuyentes”, que es el segundo aspecto importante de la noticia a la que hacía referencia. No hablamos ya exclusivamente de los equipos de Microsoft que hasta ahora han llevado las riendas: a partir de ahora, &lt;strong&gt;los desarrolladores de la comunidad podemos contribuir con parches e implementando funcionalidades&lt;/strong&gt; de estos tres productos.&lt;br /&gt;
&lt;br /&gt;
De hecho, el primero en estrenarse ha sido &lt;a href="http://es.wikipedia.org/wiki/Miguel_de_Icaza"&gt;Miguel de Icaza&lt;/a&gt;, que había sido avisado previamente del movimiento, y ha contribuido añadiendo &lt;a href="http://aspnetwebstack.codeplex.com/SourceControl/network/forks/migueldeicaza/MyFirstFork/contribution/2028"&gt;modificaciones a las plantillas de edición&lt;/a&gt; para que tengan en cuenta el &lt;code&gt;DataType&lt;/code&gt; (Email, Url, DateTime, Date, Time, Number, etc.) a la hora de generar los controles en la página, de forma que éstos ya aparezcan con el atributo &lt;code&gt;type&lt;/code&gt; establecidos de forma correcta para aprovechar las ventajas de HTML5.&lt;br /&gt;
&lt;br /&gt;
Pero ojo, que &lt;strong&gt;esto no significa que MVC, Web API o Razor vayan a ser abandonados &lt;/strong&gt;a su suerte. Microsoft va a seguir incluyéndolos con Visual Studio y trabajando en ellos como hasta ahora, desarrollándolos con la misma gente, dándoles soporte oficial, y asegurando su calidad. Cada contribución será minuciosamente revisada y comprobada por el equipo de ASP.NET y sólo serán aprobadas aquellas que cumplan estrictos criterios de calidad y adhesión al Roadmap de cada producto.&lt;br /&gt;
&lt;br /&gt;
En palabras de &lt;a href="http://www.hanselman.com/blog/ASPNETMVC4ASPNETWebAPIAndASPNETWebPagesV2RazorNowAllOpenSourceWithContributions.aspx"&gt;Hanselman&lt;/a&gt;, nada cambia salvo una cosa: &lt;em&gt;“&lt;strong&gt;Es ASP.NET, pero ahora puedes involucrarte&lt;/strong&gt;”&lt;/em&gt;.&lt;br /&gt;
&lt;br /&gt;
Y las ventajas están claras: &lt;strong&gt;estas tecnologías se verán enriquecidas e impulsadas por la comunidad de desarrolladores&lt;/strong&gt;, y, si no se ponen trabas, esto seguro que se traduce en un crecimiento mucho mayor que el que hemos vivido hasta ahora, una respuesta más rápida ante problemas, una mejor y más eficiente adaptación a los cambios tecnológicos del entorno, y sobre todo, una mayor cercanía de los productos a sus usuarios y a la realidad de nuestro trabajo.&lt;br /&gt;
&lt;br /&gt;
En fin, se trata de un importante movimiento por parte de Microsoft cuyas consecuencias y resultado iremos viendo con el tiempo, pero si todas las premisas se cumplen sin duda es una &lt;strong&gt;gran noticia para los desarrolladores ASP.NET&lt;/strong&gt;.&lt;br /&gt;
&lt;br /&gt;
Enlaces:&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;Anuncio oficial de Scott Guthrie: &lt;a href="http://weblogs.asp.net/scottgu/archive/2012/03/27/asp-net-mvc-web-api-razor-and-open-source.aspx"&gt;ASP.NET MVC, Web API, Razor and Open Source&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Anuncio de Hanselman: &lt;a href="http://www.hanselman.com/blog/ASPNETMVC4ASPNETWebAPIAndASPNETWebPagesV2RazorNowAllOpenSourceWithContributions.aspx"&gt;ASP.NET MVC 4, ASP.NET Web API and ASP.NET Web Pages v2 (Razor) now all open source with contributions&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Sitio en codeplex: &lt;a href="http://aspnetwebstack.codeplex.com/" title="http://aspnetwebstack.codeplex.com/"&gt;http://aspnetwebstack.codeplex.com/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Sitio oficial de ASP.NET: &lt;a href="http://asp.net/"&gt;http://asp.net&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
Publicado en: &lt;a href="http://www.variablenotfound.com/"&gt;Variable not found&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/27752126-1049709491250420488?l=www.variablenotfound.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/pvjzCrXS5jmVnCIrICB-5Avv5o0/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/pvjzCrXS5jmVnCIrICB-5Avv5o0/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/pvjzCrXS5jmVnCIrICB-5Avv5o0/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/pvjzCrXS5jmVnCIrICB-5Avv5o0/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/vnf?a=NMHBSbiea08:0Jq4P-B_PUU:ecdYMiMMAMM"&gt;&lt;img src="http://feeds.feedburner.com/~ff/vnf?d=ecdYMiMMAMM" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/vnf?a=NMHBSbiea08:0Jq4P-B_PUU:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/vnf?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/vnf?a=NMHBSbiea08:0Jq4P-B_PUU:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/vnf?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/vnf?a=NMHBSbiea08:0Jq4P-B_PUU:4cEx4HpKnUU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/vnf?i=NMHBSbiea08:0Jq4P-B_PUU:4cEx4HpKnUU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/vnf?a=NMHBSbiea08:0Jq4P-B_PUU:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/vnf?i=NMHBSbiea08:0Jq4P-B_PUU:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/vnf?a=NMHBSbiea08:0Jq4P-B_PUU:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/vnf?i=NMHBSbiea08:0Jq4P-B_PUU:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/vnf?a=NMHBSbiea08:0Jq4P-B_PUU:I9og5sOYxJI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/vnf?d=I9og5sOYxJI" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/vnf/~4/NMHBSbiea08" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.variablenotfound.com/feeds/1049709491250420488/comments/default" title="Enviar comentarios" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=27752126&amp;postID=1049709491250420488" title="2 comentarios" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/27752126/posts/default/1049709491250420488?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/27752126/posts/default/1049709491250420488?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/vnf/~3/NMHBSbiea08/aspnet-mvc-webapi-y-razor-ahora-mucho.html" title="ASP.NET MVC, WebAPI y Razor, ahora mucho más open source" /><author><name>José M. Aguilar</name><uri>http://www.blogger.com/profile/11683750380776435448</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://3.bp.blogspot.com/_O9D62hXq-ng/S6Hfc0RM0YI/AAAAAAAABOg/bEEA3DZ7Uac/S220/fb1.png" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://lh6.ggpht.com/-QpUpfhpGoEk/T3NLfgHscqI/AAAAAAAAB10/IAovcD_1d_M/s72-c/image%25255B3%25255D.png?imgmax=800" height="72" width="72" /><thr:total>2</thr:total><feedburner:origLink>http://www.variablenotfound.com/2012/03/aspnet-mvc-webapi-y-razor-ahora-mucho.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DEUHSXY9eSp7ImA9WhVRGUg.&quot;"><id>tag:blogger.com,1999:blog-27752126.post-872540472369191487</id><published>2012-03-28T11:42:00.000+02:00</published><updated>2012-03-28T19:37:18.861+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-03-28T19:37:18.861+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="webpages" /><category scheme="http://www.blogger.com/atom/ns#" term="asp.net" /><category scheme="http://www.blogger.com/atom/ns#" term="aspnetmvc" /><category scheme="http://www.blogger.com/atom/ns#" term="scripting" /><category scheme="http://www.blogger.com/atom/ns#" term="razor" /><title>Registro centralizado de scripts en MVC 4 y Webpages 2</title><content type="html">&lt;img align="right" alt="ASP.NET MVC" border="0" height="77" src="http://lh4.ggpht.com/-RSKisiVFowM/T2c4wVO7dZI/AAAAAAAAB0o/HCgFR2lGxy0/ASPNETMVC%252520-%252520COPIA%25255B2%25255D.png?imgmax=800" style="background-image: none; border: 0px currentColor; display: inline; float: right; margin: 0px 0px 10px 10px; padding-left: 0px; padding-right: 0px; padding-top: 0px;" title="ASP.NET MVC" width="142" /&gt;Una novedad que descubro en los &lt;a href="http://www.asp.net/web-pages/overview/what's-new/top-features-in-web-pages-2#resmanagement"&gt;tutoriales preliminares de la segunda versión de WebPages&lt;/a&gt;, y que por tanto tendremos disponible en las futuras versiones de WebMatrix y ASP.NET MVC 4, es la posibilidad de registrar los scripts y estilos que necesitan nuestros componentes visuales (sean layouts, vistas completas, parciales o helpers), centralizando su carga y evitando duplicidades.&lt;br /&gt;
&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
Por ejemplo, imaginad que tenemos una vista parcial o helper que requiere la inclusión de una biblioteca de scripts concreta. Si introducimos los correspondientes tags &lt;code&gt;&amp;lt;script&amp;gt;&lt;/code&gt;, y por cualquier causa necesitamos utilizar este componente más de una vez sobre la misma página, estaremos realizando una doble carga del archivo externo, lo que además de lento puede generar errores. Otros escenarios igualmente incómodos son cuando si hay varias parciales distintas que usan una misma biblioteca común, o cuando queremos &lt;strong&gt;generar los scripts en un lugar determinado del HTML&lt;/strong&gt; (por ejemplo, al final de la página) también desde una vista parcial o un helper. Y por supuesto, lo mismo ocurre con los estilos CSS.&lt;br /&gt;
&lt;br /&gt;
El Asset Manager es un componente introducido en WebPages 2, también disponible para MVC 4, que va a poner un poco de orden ahí, usando un mecanismo bastante parecido al disponible en Webforms desde hace bastante tiempo.&lt;br /&gt;
&lt;br /&gt;
Así, el objeto estático &lt;code&gt;Asset&lt;/code&gt; (definido en &lt;code&gt;System.Web.WebPages&lt;/code&gt;) permite registrar bloques de script inline, referencias a archivos de script externos, bloques de estilos, y referencias a archivos de hojas de estilo usando métodos tan simples como los siguientes:&lt;br /&gt;
&lt;pre style="background-color: transparent; overflow: visible; padding: 0px;"&gt;&lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size: 10pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Assets.AddScriptBlock(&lt;span style="color: #a31515;"&gt;"alert('hi!');"&lt;/span&gt;, &lt;span style="color: blue;"&gt;true&lt;/span&gt;); &lt;span style="color: green;"&gt;// Include &amp;lt;script&amp;gt; tag&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; Assets.AddScript(&lt;span style="color: #a31515;"&gt;"~/scripts/jquery.1.6.2.js"&lt;/span&gt;);
    Assets.AddScript(&lt;span style="color: #a31515;"&gt;"~/scripts/jquery.1.6.2.js"&lt;/span&gt;);
&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&amp;nbsp;&amp;nbsp;&amp;nbsp; Assets.AddStyleBlock(&lt;span style="color: #a31515;"&gt;"p { font-size: 4em}"&lt;/span&gt;, &lt;span style="color: blue;"&gt;true&lt;/span&gt;); &lt;span style="color: green;"&gt;// Include &amp;lt;style&amp;gt; tag&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; Assets.AddStyle(&lt;span style="color: #a31515;"&gt;"~/content/site.css"&lt;/span&gt;);&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;
Este registro se puede implementar en cualquier parte dentro del ciclo de ejecución de la vista: en la página de contenido, parciales, helpers, de forma que se irán registrando todos los elementos que puedan hacer falta. Más adelante, para generar los bloques almacenados basta, con hacer lo siguiente por ejemplo en el Layout:&lt;br /&gt;
&lt;pre style="background-color: transparent; overflow: visible; padding: 0px;"&gt;&lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size: 10pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; [...]
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon;"&gt;div&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon;"&gt;div&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon;"&gt;footer&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="background-color: yellow;"&gt;&lt;span style="background-attachment: scroll; background-image: none; background-repeat: repeat;"&gt;@&lt;/span&gt;&lt;span style="color: #2b91af;"&gt;Assets&lt;/span&gt;.GetScripts()&lt;/span&gt;
&lt;span style="color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon;"&gt;body&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size: 10pt;"&gt;&lt;span style="color: blue;"&gt;&amp;gt;
&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon;"&gt;html&lt;/span&gt;&lt;/span&gt;&lt;span style="color: blue; font-size: 10pt;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;
El resultado en ejecución sería:&lt;br /&gt;
&lt;pre style="background-color: transparent; overflow: visible; padding: 0px;"&gt;&lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size: 10pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; [...]
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon;"&gt;div&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon;"&gt;div&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon;"&gt;footer&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;script&lt;/span&gt;&amp;nbsp;&lt;span style="color: red;"&gt;type&lt;/span&gt;&lt;span style="color: blue;"&gt;="text/javascript"&amp;gt;&lt;/span&gt;alert(&lt;span style="color: maroon;"&gt;'hi!'&lt;/span&gt;);&lt;span style="color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon;"&gt;script&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;script&lt;/span&gt;&amp;nbsp;&lt;span style="color: red;"&gt;src&lt;/span&gt;&lt;span style="color: blue;"&gt;="/scripts/jquery.1.6.2.js"&lt;/span&gt;&amp;nbsp;&lt;span style="color: red;"&gt;type&lt;/span&gt;&lt;span style="color: blue;"&gt;="text/javascript"&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon;"&gt;script&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 10pt;"&gt;&lt;span style="font-family: Consolas;"&gt;&lt;span style="color: blue;"&gt;&amp;gt;
&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon;"&gt;body&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size: 10pt;"&gt;&lt;span style="color: blue;"&gt;&amp;gt;
&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon;"&gt;html&lt;/span&gt;&lt;/span&gt;&lt;span style="color: blue; font-size: 10pt;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;
Y de la misma forma, tenemos disponible un método &lt;code&gt;@Assets.GetStyles()&lt;/code&gt; para obtener todos los bloques relativos a estilos de la página que hemos ido registrando, y que podríamos generar en el interior de la etiqueta &lt;code&gt;&amp;lt;head&amp;gt;&lt;/code&gt;, por ejemplo.&lt;br /&gt;
&lt;br /&gt;
Es interesante saber que, al generar el código, &lt;strong&gt;Asset detectará si existen dos referencias hacia el mismo archivo de script o estilos, en cuyo caso la referencia se generará sobre la página una única vez&lt;/strong&gt;, aunque por razones obvias este control no se realizará sobre los bloques de scripts o estilos inline.&lt;br /&gt;
&lt;br /&gt;
Publicado en: &lt;a href="http://www.variablenotfound.com/"&gt;Variable not found&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/27752126-872540472369191487?l=www.variablenotfound.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/rk9ZJULjFCoupjZ2Bympn4jVuiM/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/rk9ZJULjFCoupjZ2Bympn4jVuiM/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/rk9ZJULjFCoupjZ2Bympn4jVuiM/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/rk9ZJULjFCoupjZ2Bympn4jVuiM/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/vnf?a=39Xl2TUQvV8:JVwM6nd0yBI:ecdYMiMMAMM"&gt;&lt;img src="http://feeds.feedburner.com/~ff/vnf?d=ecdYMiMMAMM" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/vnf?a=39Xl2TUQvV8:JVwM6nd0yBI:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/vnf?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/vnf?a=39Xl2TUQvV8:JVwM6nd0yBI:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/vnf?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/vnf?a=39Xl2TUQvV8:JVwM6nd0yBI:4cEx4HpKnUU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/vnf?i=39Xl2TUQvV8:JVwM6nd0yBI:4cEx4HpKnUU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/vnf?a=39Xl2TUQvV8:JVwM6nd0yBI:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/vnf?i=39Xl2TUQvV8:JVwM6nd0yBI:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/vnf?a=39Xl2TUQvV8:JVwM6nd0yBI:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/vnf?i=39Xl2TUQvV8:JVwM6nd0yBI:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/vnf?a=39Xl2TUQvV8:JVwM6nd0yBI:I9og5sOYxJI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/vnf?d=I9og5sOYxJI" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/vnf/~4/39Xl2TUQvV8" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.variablenotfound.com/feeds/872540472369191487/comments/default" title="Enviar comentarios" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=27752126&amp;postID=872540472369191487" title="0 comentarios" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/27752126/posts/default/872540472369191487?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/27752126/posts/default/872540472369191487?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/vnf/~3/39Xl2TUQvV8/registro-centralizado-de-scripts-en-mvc.html" title="Registro centralizado de scripts en MVC 4 y Webpages 2" /><author><name>José M. Aguilar</name><uri>http://www.blogger.com/profile/11683750380776435448</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://3.bp.blogspot.com/_O9D62hXq-ng/S6Hfc0RM0YI/AAAAAAAABOg/bEEA3DZ7Uac/S220/fb1.png" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://lh4.ggpht.com/-RSKisiVFowM/T2c4wVO7dZI/AAAAAAAAB0o/HCgFR2lGxy0/s72-c/ASPNETMVC%252520-%252520COPIA%25255B2%25255D.png?imgmax=800" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://www.variablenotfound.com/2012/03/registro-centralizado-de-scripts-en-mvc.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DEMDQ3g8fSp7ImA9WhVRF0k.&quot;"><id>tag:blogger.com,1999:blog-27752126.post-1363977864947145352</id><published>2012-03-26T09:21:00.001+02:00</published><updated>2012-03-26T09:21:12.675+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-03-26T09:21:12.675+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="enlaces" /><title>Enlaces interesantes 75</title><content type="html">&lt;a href="http://lh3.ggpht.com/-Ah1YSt5qS8w/T3AQJzqLCJI/AAAAAAAAB1c/Z6zUwI6iWTw/s1600-h/image7_thumb_thumb_thumb_thumb_thumb.png"&gt;&lt;img align="right" alt="Enlaces interesantes" border="0" height="129" src="http://lh6.ggpht.com/-cajC0An6Vbs/T3AQK6t2-TI/AAAAAAAAB1k/PI7BV2nZ8Qo/image7_thumb_thumb_thumb_thumb_thumb%25255B2%25255D.png?imgmax=800" style="background-image: none; border-width: 0px; display: inline; float: right; margin: 0px 0px 10px 10px; padding-left: 0px; padding-right: 0px; padding-top: 0px;" title="Enlaces interesantes" width="172" /&gt;&lt;/a&gt;Estos son los enlaces publicados en &lt;a href="http://www.facebook.com/variablenotfound"&gt;Variable not found en Facebook&lt;/a&gt; y &lt;a href="http://twitter.com/jmaguilar"&gt;Twitter&lt;/a&gt; del 19 al 25 de marzo de 2012. Espero que os resulten interesantes :-)&lt;br /&gt;
&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;
&lt;h4&gt;
.Net&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://tirania.org/blog/archive/2012/Mar-22.html" title="Mono 2.11.0 is out"&gt;&lt;strong&gt;Mono 2.11.0 is out&lt;/strong&gt;&lt;/a&gt;       &lt;br /&gt;Miguel de Icaza &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="http://visualstudiomagazine.com/articles/2012/03/20/10-questions-10-answers-on-roslyn.aspx"&gt;10 Questions, 10 Answers on Roslyn&lt;/a&gt;&lt;/strong&gt;       &lt;br /&gt;Joe Kunk &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="http://blackrabbitcoder.net/archive/2012/03/19/c.net-little-wonders-of-linq-and-lambdas---a-presentation.aspx"&gt;C#/.NET Little Wonders: Of LINQ and Lambdas - A Presentation&lt;/a&gt;&lt;/strong&gt;       &lt;br /&gt;James Michael Hare &lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.mindscapehq.com/blog/index.php/2012/03/18/what-else-is-new-in-c-5/" title="permaink to What else is new in C# 5-"&gt;&lt;strong&gt;What else is new in C# 5?&lt;/strong&gt;&lt;/a&gt;       &lt;br /&gt;Ivan Towlson &lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.west-wind.com/weblog/posts/2012/Mar/19/Dynamic-JSON-Parsing-in-NET-with-JsonValue"&gt;&lt;strong&gt;Dynamic JSON Parsing in .NET with JsonValue&lt;/strong&gt;&lt;/a&gt;       &lt;br /&gt;Rick Strahl       &lt;ul&gt;&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;
Asp.net&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://odetocode.com/Blogs/scott/archive/2012/03/20/yet-another-bundling-approach-for-mvc-4.aspx"&gt;&lt;strong&gt;Yet Another Bundling Approach for MVC 4&lt;/strong&gt;&lt;/a&gt;       &lt;br /&gt;K. Scott Allen &lt;/li&gt;
&lt;li&gt;&lt;a href="http://mrubino.net/2012/03/21/exprime-la-potencia-asincrona-en-iis/"&gt;&lt;strong&gt;Exprime la potencia asíncrona en IIS&lt;/strong&gt;&lt;/a&gt;       &lt;br /&gt;Marc Rubiño &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="http://sebys.com.ar/2012/03/14/asp-net-mvc-3-client-side-validation-jquery-blockui/"&gt;ASP.NET MVC 3 Client-Side Validation + jQuery BlockUI&lt;/a&gt;&lt;/strong&gt;       &lt;br /&gt;Sebastián Henzenn &lt;/li&gt;
&lt;li&gt;&lt;a href="http://sblakemore.com/blog/post/Multiple-login-pages-with-ASPNET-MVC.aspx"&gt;&lt;strong&gt;Multiple login pages with ASP.NET MVC&lt;/strong&gt;&lt;/a&gt;       &lt;br /&gt;Sean Blakemore &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="http://geeks.ms/blogs/gperez/archive/2012/03/19/tutorial-asp-net-web-api-con-mongodb-parte-2-1.aspx"&gt;Tutorial Asp.net Web API con MongoDB – Parte 2.1&lt;/a&gt;&lt;/strong&gt;       &lt;br /&gt;Gonzalo Pérez &lt;/li&gt;
&lt;li&gt;&lt;a href="http://leoncullens.nl/post/2012/03/18/A-good-way-to-keep-your-entities-clean.aspx"&gt;&lt;strong&gt;A good way to keep your entities clean&lt;/strong&gt;&lt;/a&gt;       &lt;br /&gt;Leon Cullen &lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;
Azure / Cloud&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="http://rachelappel.com/the-differences-between-development-on-windows-azure-and-windows-server"&gt;The Differences Between Development on Windows Azure and Windows Server&lt;/a&gt;&lt;/strong&gt;       &lt;br /&gt;Rachel Appel &lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;
Data access&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="http://www.itwriting.com/blog/5615-whats-new-in-sql-server-2012.html"&gt;What’s new in SQL Server 2012?&lt;/a&gt;&lt;/strong&gt;       &lt;br /&gt;Tim Anderson &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="http://blogs.msdn.com/b/adonet/archive/2012/03/22/ef5-beta-2-available-on-nuget.aspx"&gt;EF5 Beta 2 Available on NuGet&lt;/a&gt;&lt;/strong&gt;       &lt;br /&gt;EF Team &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="http://geeks.ms/blogs/unai/archive/2012/03/21/ef-inicializadores-migraciones-y-datos-de-referencia.aspx"&gt;EF, inicializadores, migraciones y datos de referencia&lt;/a&gt;&lt;/strong&gt;       &lt;br /&gt;Unai Zorrilla &lt;/li&gt;
&lt;li&gt;&lt;a href="http://odetocode.com/Blogs/scott/archive/2012/03/19/avoiding-notsupportedexception-with-iqueryable.aspx"&gt;&lt;strong&gt;Avoiding NotSupportedException with IQueryable&lt;/strong&gt;&lt;/a&gt;       &lt;br /&gt;K. Scott Allen &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="http://geeks.ms/blogs/jtorrecilla/archive/2012/03/21/usando-enumeraciones-en-entity-framework-5-0.aspx"&gt;Usando Enumeraciones en Entity Framework 5.0&lt;/a&gt;&lt;/strong&gt;       &lt;br /&gt;Javier Torrecilla &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="http://weblogs.asp.net/ricardoperes/archive/2012/03/19/entity-framework-code-first-get-entities-from-local-cache-or-the-database.aspx"&gt;Entity Framework Code First: Get Entities From Local Cache or the Database&lt;/a&gt;&lt;/strong&gt;       &lt;br /&gt;Ricardo Peres &lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;
Html/Css/Javascript&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="http://css.dzone.com/articles/javascripts-two-zeros"&gt;JavaScript's Two Zeros&lt;/a&gt; &lt;/strong&gt;      &lt;br /&gt;Axel Rauschmayer &lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.codeproject.com/Articles/351298/KnockoutJS-and-Google-Maps-binding"&gt;&lt;strong&gt;KnockoutJS and Google Maps binding&lt;/strong&gt;&lt;/a&gt;       &lt;br /&gt;Jan Fajfr &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="http://creativejs.com/2012/03/augmented-reality/"&gt;Augmented Reality comes to JavaScript&lt;/a&gt;&lt;/strong&gt;       &lt;br /&gt;Paul Neave &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="http://blog.jquery.com/2012/03/21/jquery-1-7-2-released/"&gt;jQuery 1.7.2 Released&lt;/a&gt;&lt;/strong&gt;       &lt;br /&gt;Dave Methvin &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="http://blogs.microsoft.co.il/blogs/gilf/archive/2012/03/21/quick-tip-deleting-a-javascript-object-property.aspx"&gt;Quick Tip – Deleting a JavaScript Object Property&lt;/a&gt;&lt;/strong&gt;       &lt;br /&gt;Gil Fink &lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/darcyclarke/jQuery-Fullscreen-Plugin"&gt;&lt;strong&gt;jQuery full-screen plugin&lt;/strong&gt;&lt;/a&gt;       &lt;br /&gt;Darcy Clarke &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="http://blog.michaelckennedy.net/2012/03/19/make-external-links-open-in-a-new-window-with-this-jquery-plugin/"&gt;Make External Links Open in a New Window With This jQuery Plugin&lt;/a&gt;&lt;/strong&gt;       &lt;br /&gt;Michael Kennedy &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="http://stephenwalther.com/blog/archive/2012/03/19/metro-introduction-to-css-3-grid-layout.aspx"&gt;Metro: Introduction to CSS 3 Grid Layout&lt;/a&gt;&lt;/strong&gt;       &lt;br /&gt;Stephen Walther &lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.strathweb.com/2012/03/build-facebook-style-infinite-scroll-with-knockout-js-and-last-fm-api/"&gt;&lt;strong&gt;Build Facebook style infinite scroll with knockout.js and Last.fm API&lt;/strong&gt;&lt;/a&gt;       &lt;br /&gt;StrahWeb &lt;/li&gt;
&lt;li&gt;&lt;a href="http://24ways.org/2011/your-jquery-now-with-less-suck"&gt;&lt;strong&gt;Your jQuery: Now With 67% Less Suck&lt;/strong&gt;&lt;/a&gt;       &lt;br /&gt;Scott Kosman &lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;
Visual Studio/Complementos&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.hanselman.com/blog/FeaturesNOONENOTICEDInVisualStudio11ExpressBetaForWeb.aspx" title="Features NO ONE NOTICED in Visual Studio 11 Express Beta for Web"&gt;&lt;strong&gt;Features NO ONE NOTICED in Visual Studio 11 Express Beta for Web&lt;/strong&gt;&lt;/a&gt;       &lt;br /&gt;Scott Hanselman &lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;
Otros&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.jasoft.org/Blog/post/Propagacion-y-herencia-de-permisos-la-clase-FileSystemAccessRule.aspx" title="Propagación y herencia de permisos- la clase FileSystemAccessRule"&gt;&lt;strong&gt;Propagación y herencia de permisos- la clase FileSystemAccessRule&lt;/strong&gt;&lt;/a&gt;       &lt;br /&gt;José Manuel Alarcón &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="http://blogs.msdn.com/b/ie/archive/2012/03/19/websockets-in-windows-consumer-preview.aspx"&gt;WebSockets in Windows Consumer Preview&lt;/a&gt;&lt;/strong&gt;       &lt;br /&gt;Brian Raymor (IEBlog) &lt;/li&gt;
&lt;li&gt;&lt;a href="http://geeks.ms/blogs/dsalgado/archive/2012/03/20/hola-metro-en-javascript-para-windows-8.aspx" title="Hola Metro en JavaScript para Windows 8"&gt;&lt;strong&gt;Hola Metro en JavaScript para Windows 8&lt;/strong&gt;&lt;/a&gt;       &lt;br /&gt;David Salgado &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="http://www.blackwasp.co.uk/PronounceablePasswords.aspx"&gt;Generating Random Pronounceable Passwords&lt;/a&gt;&lt;/strong&gt;       &lt;br /&gt;Richard Carr &lt;/li&gt;
&lt;li&gt;&lt;a href="http://jmalarcon.es/post/El-efecto-Zeigarnik-y-como-vencer-la-procrastinacion.aspx"&gt;&lt;strong&gt;El efecto Zeigarnik y cómo vencer la procrastinación&lt;/strong&gt;&lt;/a&gt;       &lt;br /&gt;José Manuel Alarcón &lt;/li&gt;
&lt;/ul&gt;
Y no olvidéis que podéis seguir esta información en vivo y en directo desde &lt;a href="http://www.facebook.com/variablenotfound"&gt;Variable not found en Facebook&lt;/a&gt;, o a través de &lt;a href="http://twitter.com/jmaguilar"&gt;Twitter&lt;/a&gt;.     &lt;br /&gt;    &lt;br /&gt;Publicado en &lt;a href="http://www.variablenotfound.com/"&gt;Variable not found&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/27752126-1363977864947145352?l=www.variablenotfound.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/t4UrWfJoaqHwK9J1SQnod6PtKTc/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/t4UrWfJoaqHwK9J1SQnod6PtKTc/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/t4UrWfJoaqHwK9J1SQnod6PtKTc/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/t4UrWfJoaqHwK9J1SQnod6PtKTc/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/vnf?a=YV6j3XdoDR4:VP2b9pyyB4c:ecdYMiMMAMM"&gt;&lt;img src="http://feeds.feedburner.com/~ff/vnf?d=ecdYMiMMAMM" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/vnf?a=YV6j3XdoDR4:VP2b9pyyB4c:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/vnf?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/vnf?a=YV6j3XdoDR4:VP2b9pyyB4c:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/vnf?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/vnf?a=YV6j3XdoDR4:VP2b9pyyB4c:4cEx4HpKnUU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/vnf?i=YV6j3XdoDR4:VP2b9pyyB4c:4cEx4HpKnUU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/vnf?a=YV6j3XdoDR4:VP2b9pyyB4c:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/vnf?i=YV6j3XdoDR4:VP2b9pyyB4c:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/vnf?a=YV6j3XdoDR4:VP2b9pyyB4c:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/vnf?i=YV6j3XdoDR4:VP2b9pyyB4c:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/vnf?a=YV6j3XdoDR4:VP2b9pyyB4c:I9og5sOYxJI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/vnf?d=I9og5sOYxJI" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/vnf/~4/YV6j3XdoDR4" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.variablenotfound.com/feeds/1363977864947145352/comments/default" title="Enviar comentarios" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=27752126&amp;postID=1363977864947145352" title="0 comentarios" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/27752126/posts/default/1363977864947145352?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/27752126/posts/default/1363977864947145352?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/vnf/~3/YV6j3XdoDR4/enlaces-interesantes-75.html" title="Enlaces interesantes 75" /><author><name>José M. Aguilar</name><uri>http://www.blogger.com/profile/11683750380776435448</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://3.bp.blogspot.com/_O9D62hXq-ng/S6Hfc0RM0YI/AAAAAAAABOg/bEEA3DZ7Uac/S220/fb1.png" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://lh6.ggpht.com/-cajC0An6Vbs/T3AQK6t2-TI/AAAAAAAAB1k/PI7BV2nZ8Qo/s72-c/image7_thumb_thumb_thumb_thumb_thumb%25255B2%25255D.png?imgmax=800" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://www.variablenotfound.com/2012/03/enlaces-interesantes-75.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CEIMRX4-eip7ImA9WhVREk4.&quot;"><id>tag:blogger.com,1999:blog-27752126.post-2181505167527823786</id><published>2012-03-20T09:35:00.000+01:00</published><updated>2012-03-20T09:36:24.052+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-03-20T09:36:24.052+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="desarrollo" /><category scheme="http://www.blogger.com/atom/ns#" term="asp.net" /><category scheme="http://www.blogger.com/atom/ns#" term="aspnetmvc" /><category scheme="http://www.blogger.com/atom/ns#" term="signalr" /><title>SignalR (IV): Hubs</title><content type="html">Como vengo comentando desde hace un tiempo, SignalR es un framework realmente impresionante y aporta unas posibilidades enormes en prácticamente cualquier tipo de aplicación. Ya hemos visto &lt;a href="http://www.variablenotfound.com/2012/01/introduccion-signalr-i-conceptos.html"&gt;qué es y las bases en las que se sustenta&lt;/a&gt;, y también hemos visto algunos ejemplos de uso utilizando conexiones persistentes (&lt;a href="http://www.variablenotfound.com/2012/01/signalr-ii-conexiones-persistentes.html"&gt;aquí&lt;/a&gt; y &lt;span style="background-color: white;"&gt;&lt;a href="http://www.variablenotfound.com/2012/03/signalr-iii-mas-conexiones-persistentes.html"&gt;aquí&lt;/a&gt;&lt;/span&gt;), que es el enfoque de menor nivel disponible a la hora de desarrollar servicios basados en esta plataforma.&lt;br /&gt;
&lt;br /&gt;
En este post ascenderemos a un nivel de abstracción mucho mayor que el proporcionado por las conexiones persistentes y veremos &lt;strong&gt;cómo utilizar los Hubs&lt;/strong&gt;, otro mecanismo proporcionado por SignalR que nos permitirá lograr una integración increíble entre el código cliente y de servidor, y hará aún más sencilla la implementación de este tipo de servicios.&lt;br /&gt;
&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;
En este momento ya deberíais tener claro qué cosas se pueden hacer con las conexiones persistentes de SignalR, e incluso cómo implementarlas:&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;En el cliente:      &lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Conectar con un endpoint&lt;/strong&gt; o servicio SignalR, manteniendo la conexión virtualmente abierta. &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Recibir asíncronamente (a través de un callback) los mensajes enviados desde el servidor&lt;/strong&gt; mediante broadcasts o mensajes directos. &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Enviar mensajes al servicio &lt;/strong&gt;usando el método &lt;code&gt;send()&lt;/code&gt;. &lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;En el servidor:      &lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Detectar la conexión&lt;/strong&gt; de nuevos clientes. &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Detectar la desconexión&lt;/strong&gt; de clientes. &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Recibir los mensajes&lt;/strong&gt; enviados por los clientes. &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Enviar objetos&lt;/strong&gt; a todos los clientes conectados, a grupos de ellos, o a un cliente concreto. &lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
Podemos hacer algunas cosillas más, como capturar los errores tanto en cliente como en servidor; aunque no lo hemos visto en los anteriores posts, son aspectos bastante triviales.&lt;br /&gt;
&lt;br /&gt;
Pues bien, con Hubs vamos a poder hacer exactamente las mismas cosas, pero usaremos una sintaxis mucho más fluida y directa tanto en cliente como en servidor, gracias a la mágica flexibilidad que aportan tecnologías como javascript y los tipos dinámicos de .NET.&lt;br /&gt;
&lt;br /&gt;
Y para demostrarlo, &lt;strong&gt;implementaremos una sencilla hoja de cálculo multiusuario en tiempo real&lt;/strong&gt;. Todos los usuarios conectados a la misma podrán editar celdas directamente, y las actualizaciones se irán propagando al resto de clientes de forma automática. Podéis descargar el proyecto para Visual Studio 2010 en el enlace que encontraréis al final del post, aunque en el siguiente vídeo se muestra la locura de resultado en ejecución con algunos clientes conectados editando celdas de forma aleatoria:&lt;br /&gt;
&lt;br /&gt;
&lt;div class="wlWriterEditableSmartContent" id="scid:5737277B-5D6D-4f48-ABFC-DD9C333F4C5D:e20c2a3f-0f2a-4b8b-a506-a98550f2a221" style="display: inline; float: none; margin: 0px; padding: 0px;"&gt;
&lt;div id="56628d78-05b5-41cc-8c5f-ba2cae681d1a" style="display: inline; margin: 0px; padding: 0px;"&gt;
&lt;div&gt;
&lt;a href="http://www.youtube.com/watch?v=ckPtDYCIyLw&amp;amp;feature=youtube_gdata_player" target="_new"&gt;&lt;img alt="" galleryimg="no" onload="var downlevelDiv = document.getElementById('56628d78-05b5-41cc-8c5f-ba2cae681d1a'); downlevelDiv.innerHTML = &amp;quot;&amp;lt;div&amp;gt;&amp;lt;object width=\&amp;quot;448\&amp;quot; height=\&amp;quot;252\&amp;quot;&amp;gt;&amp;lt;param name=\&amp;quot;movie\&amp;quot; value=\&amp;quot;http://www.youtube.com/v/ckPtDYCIyLw?hl=en&amp;amp;hd=1\&amp;quot;&amp;gt;&amp;lt;\/param&amp;gt;&amp;lt;embed src=\&amp;quot;http://www.youtube.com/v/ckPtDYCIyLw?hl=en&amp;amp;hd=1\&amp;quot; type=\&amp;quot;application/x-shockwave-flash\&amp;quot; width=\&amp;quot;448\&amp;quot; height=\&amp;quot;252\&amp;quot;&amp;gt;&amp;lt;\/embed&amp;gt;&amp;lt;\/object&amp;gt;&amp;lt;\/div&amp;gt;&amp;quot;;" src="http://lh6.ggpht.com/-beJgJixhQAc/T2cbNM_eBmI/AAAAAAAAB0g/us__7zlOIEE/video49400dd49400%25255B16%25255D.jpg?imgmax=800" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div style="clear: both; font-size: 0.8em; width: 448px;"&gt;
Hoja de cálculo multiusuario en ejecución&lt;/div&gt;
&lt;/div&gt;
&lt;br /&gt;
Veremos que teniendo las herramientas apropiadas es algo bastante sencillo. Conceptualmente, sólo tenemos que hacer lo siguiente:&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;en el lado cliente, cuando un usuario modifique el valor de una celda, enviar al servidor el nuevo valor V que ha introducido en la celda X, Y. &lt;/li&gt;
&lt;li&gt;en el lado servidor, ante la recepción del mensaje anterior, notificar a todos los clientes conectados que el usuario U ha establecido el nuevo valor V en la celda X, Y. &lt;/li&gt;
&lt;li&gt;de nuevo en el lado cliente, y ante la recepción del mensaje anterior, modificar la celda X, Y para que aparezca el nuevo valor V que introdujo el usuario U. &lt;/li&gt;
&lt;/ul&gt;
Obviamente, esto irá acompañado por algún script más para conseguir que se puedan editar las celdas de forma similar a una hoja de cálculo, o para mantener actualizados los sumatorios de la última fila, pero no nos centraremos en ello. En cualquier caso, siempre podéis verlo descargando el proyecto de prueba.&lt;br /&gt;
&lt;h3&gt;



1. El lado servidor: creación de un Hub&lt;/h3&gt;
En SignalR, un Hub es la clase donde se implementa el servicio, es decir, el punto desde el cual se gestionarán las peticiones enviadas por todos los clientes conectados al mismo, y desde donde se emitirán los mensajes destinados a actualizar su estado.&lt;br /&gt;
&lt;br /&gt;
En la práctica, se trata simplemente de una clase que hereda de la clase &lt;code&gt;Hub&lt;/code&gt;, definida en &lt;code&gt;SignalR.Hubs&lt;/code&gt;, en cuyo interior encontraremos los métodos que van a ser invocados directamente desde el cliente. En tiempo de ejecución, SignalR creará un proxy o representante del hub en el lado cliente, con métodos idénticos a los definidos en la clase, en cuyo cuerpo introducirá las llamadas Ajax necesarias para que se produzca la invocación de forma automática. Por tanto, si nuestra clase Hub tiene un método llamado “&lt;code&gt;hacerAlgo()&lt;/code&gt;” y el proxy que hemos creado en cliente se llama “&lt;code&gt;hub&lt;/code&gt;”, podemos invocarlo desde script haciendo un simple &lt;code&gt;hub.hacerAlgo()&lt;/code&gt;.&lt;br /&gt;
&lt;br /&gt;
En nuestro ejemplo en el servidor lo único que tenemos que hacer es recibir las notificaciones de cambios de celda y enviárselas al resto de usuarios, lo que podemos conseguir con estas líneas:&lt;br /&gt;
&lt;pre style="background-color: transparent; overflow: visible; padding: 0px;"&gt;&lt;span style="font-family: Consolas;"&gt;&lt;span style="color: blue;"&gt;&lt;span style="font-size: 10pt;"&gt;public&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 10pt;"&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;class&lt;/span&gt;&amp;nbsp;&lt;span style="color: #2b91af;"&gt;MultiuserExcel&lt;/span&gt;: &lt;span style="color: #2b91af;"&gt;Hub&lt;/span&gt;
{
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;void&lt;/span&gt; Update(&lt;span style="color: blue;"&gt;int&lt;/span&gt; y, &lt;span style="color: blue;"&gt;int&lt;/span&gt; x, &lt;span style="color: blue;"&gt;string&lt;/span&gt; value)
&amp;nbsp;&amp;nbsp;&amp;nbsp; {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;this&lt;/span&gt;.Clients.updateCell(&lt;span style="color: blue;"&gt;this&lt;/span&gt;.Caller.userName, y, x, value);
&amp;nbsp;&amp;nbsp;&amp;nbsp; }
}&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;
Voy a destacar varios aspectos de este código, comenzando por su &lt;strong&gt;extrema simplicidad&lt;/strong&gt;. Casi sin haber visto antes nada de SignalR se puede intuir lo que hace. Observad también que hemos llegado a un punto de abstracción tal que no vemos nada relativo a conexiones ni desconexiones, simplemente implementamos lógica de nuestro servicio.&lt;br /&gt;
&lt;br /&gt;
Es interesante también &lt;strong&gt;la propiedad &lt;code&gt;Clients&lt;/code&gt;&lt;/strong&gt; de la clase &lt;code&gt;Hub&lt;/code&gt;. Ésta representa al representa al conjunto de clientes conectados, y &lt;strong&gt;nos permite llamar directamente a funciones que creemos en el lado cliente&lt;/strong&gt;. O sea, que si desde el servidor hacemos una llamada a &lt;code&gt;Clients.hacerAlgo()&lt;/code&gt;, se ejecutará la función de script&amp;nbsp;&lt;code&gt;hacerAlgo()&lt;/code&gt; en todos y cada uno de los clientes conectados. Ya ahí cada uno podrá procesar el mensaje y parámetros que enviemos.&lt;br /&gt;
&lt;br /&gt;
Por último llamar la atención también sobre la &lt;strong&gt;propiedad Caller&lt;/strong&gt;. Ésta, también heredada de la clase base &lt;code&gt;Hub&lt;/code&gt;, nos &lt;strong&gt;permite acceder a propiedades definidas a nivel de script en el cliente que ha realizado la llamada&lt;/strong&gt; al método de servidor &lt;code&gt;Update()&lt;/code&gt;. En nuestro caso, será una propiedad en la que almacenaremos el nombre del usuario conectado, como veremos algo más adelante.&lt;br /&gt;
&lt;br /&gt;
Fijaos que &lt;strong&gt;las clásicas fronteras entre cliente y servidor parecen haberse disuelto&lt;/strong&gt;, es como si ambas capas se ejecutaran en el mismo proceso, aunque obviamente no es así: es SignalR el que se está encargando de mapear las llamadas entre ellas de forma transparente. Y aunque pueda parecer pura brujería, se trata simplemente de un uso ingeniosísimo de los tipos dinámicos de .NET 4 y de la flexibilidad de javascript.&lt;br /&gt;
&lt;h3&gt;



2. El lado cliente&lt;/h3&gt;
Como comentaba anteriormente, voy a saltarme el código destinado a hacer que funcionen los mecanismos básicos de edición de la hoja de cálculo, y nos centraremos en lo que nos interesa en este momento, la implementación de la comunicación con el servidor.&lt;br /&gt;
&lt;br /&gt;
Lo primero que debemos hacer en el lado cliente es &lt;strong&gt;referenciar desde la vista o página dos archivos de script&lt;/strong&gt;. El primero de ellos es el mismo que utilizábamos con las conexiones persistentes, &lt;strong&gt;/scripts/jquery.signalR.js&lt;/strong&gt;, mientras que el segundo es un script dinámico generado por SignalR en la dirección &lt;strong&gt;/signalr/hubs&lt;/strong&gt;. Para generarlo, SignalR localizará todas las clases descendientes de &lt;code&gt;Hub&lt;/code&gt; disponibles en el proyecto e incluirá en el script un proxy para cada una de ellas; en nuestro ejemplo, generará un objeto llamado &lt;code&gt;$.connection.multiUserExcel&lt;/code&gt; (el nombre del hub), que es el que podremos utilizar como proxy, aunque normalmente lo asignaremos a una variable para hacer más cómodo su uso.&lt;br /&gt;
&lt;br /&gt;
Por tanto, un primer acercamiento al código de la vista específico para&amp;nbsp;conectarse a un servicio SignalR&amp;nbsp;podría ser algo así:&lt;br /&gt;
&lt;pre style="background-color: transparent; overflow: visible; padding: 0px;"&gt;&lt;span style="font-family: Consolas;"&gt;&lt;span style="color: blue;"&gt;&lt;span style="font-size: 10pt;"&gt;&amp;lt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 10pt;"&gt;&lt;span style="color: maroon;"&gt;script&lt;/span&gt;&amp;nbsp;&lt;span style="color: red;"&gt;src&lt;/span&gt;&lt;span style="color: blue;"&gt;="&lt;/span&gt;&lt;span style="background-attachment: scroll; background-image: none; background-repeat: repeat;"&gt;&lt;span style="background-color: yellow;"&gt;@&lt;/span&gt;&lt;/span&gt;&lt;span style="color: blue;"&gt;Url.Content(&lt;/span&gt;&lt;span style="color: #a31515;"&gt;"~/scripts/jquery.signalR.min.js"&lt;/span&gt;&lt;span style="color: blue;"&gt;)"&lt;/span&gt;&amp;nbsp;&lt;span style="color: red;"&gt;type&lt;/span&gt;&lt;span style="color: blue;"&gt;="text/javascript"&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon;"&gt;script&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 10pt;"&gt;&lt;span style="font-family: Consolas;"&gt;&lt;span style="color: blue;"&gt;&amp;gt;
&amp;lt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;script&lt;/span&gt;&amp;nbsp;&lt;span style="color: red;"&gt;src&lt;/span&gt;&lt;span style="color: blue;"&gt;="signalr/hubs"&lt;/span&gt;&amp;nbsp;&lt;span style="color: red;"&gt;type&lt;/span&gt;&lt;span style="color: blue;"&gt;="text/javascript"&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon;"&gt;script&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size: 10pt;"&gt;&lt;span style="color: blue;"&gt;&amp;gt;
&amp;lt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;script&lt;/span&gt;&amp;nbsp;&lt;span style="color: red;"&gt;type&lt;/span&gt;&lt;span style="color: blue;"&gt;="text/javascript"&amp;gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; $(&lt;span style="color: blue;"&gt;function&lt;/span&gt;() {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;var&lt;/span&gt; hub = $.connection.multiuserExcel; &lt;span style="color: darkgreen;"&gt;// en “hub” tenemos el proxy&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: darkgreen;"&gt;// .. resto del código&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; });
&lt;span style="color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon;"&gt;script&lt;/span&gt;&lt;/span&gt;&lt;span style="color: blue; font-size: 10pt;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;
Una consecuencia derivada de la inclusión del script dinámico generado por SignalR es que, a diferencia de lo que ocurría con las conexiones persistentes, &lt;strong&gt;no será necesario modificar la tabla de rutas de nuestra aplicación&lt;/strong&gt;, puesto que los proxies contienen toda la información necesaria para que los servicios puedan ser utilizados de forma directa.&lt;br /&gt;
&lt;h4&gt;



2.1. Envío de mensajes al servidor&lt;/h4&gt;
Si analizamos &lt;strong&gt;los objetos generados de forma dinámica por SignalR&lt;/strong&gt; para representar al hub en el lado cliente (proxies) podremos ver que éstos &lt;strong&gt;incluyen métodos exactamente con el mismo nombre y parámetros que los que hemos implementado en el lado servidor&lt;/strong&gt;. Es decir, si en nuestra clase Hub tenemos métodos X() e Y(), el proxy en cliente dispondrá de estos dos mismos métodos, aunque en su implementación únicamente se realizarán las llamadas vía Ajax a sus respectivos equivalentes en servidor.&lt;br /&gt;
&lt;br /&gt;
Por tanto, volviendo a nuestro ejemplo, dado que hemos creado un método &lt;code&gt;Update()&lt;/code&gt; en el Hub (lado servidor), desde el cliente tendremos disponible el método &lt;code&gt;update()&lt;/code&gt; en el hub, que podemos utilizar directamente para enviar mensajes al servidor. Así, en nuestra hoja de cálculo podemos capturar el evento de cambio de cada celda y enviar la actualización al servidor para que la distribuya al resto de clientes conectados:&lt;br /&gt;
&lt;pre style="background-color: transparent; overflow: visible; padding: 0px;"&gt;&lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size: 10pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $(&lt;span style="color: maroon;"&gt;"table.excel input"&lt;/span&gt;).change(&lt;span style="color: blue;"&gt;function&lt;/span&gt;() {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;var&lt;/span&gt; newValue = $(&lt;span style="color: blue;"&gt;this&lt;/span&gt;).val(); &lt;span style="color: darkgreen;"&gt;// Get current cell’s value&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;var&lt;/span&gt; x = $(&lt;span style="color: blue;"&gt;this&lt;/span&gt;).data(&lt;span style="color: maroon;"&gt;"x"&lt;/span&gt;);    &lt;span style="color: darkgreen;"&gt;// Get current cell’s coords&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;var&lt;/span&gt; y = $(&lt;span style="color: blue;"&gt;this&lt;/span&gt;).data(&lt;span style="color: maroon;"&gt;"y"&lt;/span&gt;);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="background-color: yellow;"&gt;hub.update(y, x, newValue);&lt;/span&gt;&amp;nbsp; &lt;span style="color: darkgreen;"&gt;// Broadcast this change&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; updateTotal(x);               &lt;span style="color: darkgreen;"&gt;// Update column total&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; });&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;
Un detalle importante a tener en cuenta es que para adaptarse a las convenciones de nombrado de Javascript, &lt;strong&gt;aunque el método en servidor comience por una mayúscula, su correspondencia en cliente comienza en minúscula&lt;/strong&gt;. Esta conversión sólo se realiza en el primer carácter, el resto debe escribirse exactamente igual en ambos extremos.&lt;br /&gt;
&lt;h4&gt;



2.2. ¿Variables de script accesibles desde el servidor?&lt;/h4&gt;
Recordad que decíamos que era posible &lt;strong&gt;acceder desde el servidor a propiedades existentes a nivel de script&lt;/strong&gt; simplemente referenciándolas mediante la propiedad &lt;code&gt;Caller&lt;/code&gt; del &lt;code&gt;Hub&lt;/code&gt;. Pues bien, para que esto sea así, las propiedades deben estar &lt;strong&gt;definidas sobre el proxy&lt;/strong&gt;:&lt;br /&gt;
&lt;pre style="background-color: transparent; overflow: visible; padding: 0px;"&gt;&lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size: 10pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; $(&lt;span style="color: blue;"&gt;function&lt;/span&gt;() {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;var&lt;/span&gt; hub = $.connection.multiuserExcel;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="background-color: yellow;"&gt;hub.userName&lt;/span&gt; = prompt(&lt;span style="color: maroon;"&gt;"Username:"&lt;/span&gt;);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: darkgreen; font-size: 10pt;"&gt;// .. resto del código&lt;/span&gt;&lt;/span&gt;
&lt;/pre&gt;
A partir de ese momento podremos hacer uso de &lt;code&gt;Caller.userName&lt;/code&gt; desde el servidor para acceder al valor que se haya introducido en la misma desde el cliente que realice la llamada al hub. Ojo, que el acceso a las variables es sensible al uso de mayúsculas y minúsculas, deben escribirse igual en ambos extremos.&lt;br /&gt;
&lt;br /&gt;
Otro comportamiento curioso de SignalR a este respecto es que también &lt;strong&gt;es capaz de propagar los cambios realizados en el servidor sobre estas variables, de forma que su nuevo valor pasará al lado cliente&lt;/strong&gt; de forma automática:&lt;br /&gt;
&lt;pre style="background-color: transparent; overflow: visible; padding: 0px;"&gt;&lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size: 10pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;this&lt;/span&gt;.Caller.message = &lt;span style="color: #a31515;"&gt;"Current time: "&lt;/span&gt; + &lt;span style="color: #2b91af;"&gt;DateTime&lt;/span&gt;.Now.ToShortTimeString();&lt;/span&gt;&lt;/span&gt;
&lt;/pre&gt;
Obviamente, podemos crear tantas propiedades como necesitemos sobre el proxy, y todas ellas las tendremos disponibles en el servidor de la misma forma, tanto para consultar su valor como para modificarlo.&lt;br /&gt;
&lt;h4&gt;



2.3. Recepción en cliente de mensajes enviados por el servidor&lt;/h4&gt;
A diferencia de lo que habíamos visto usando conexiones persistentes, utilizando hubs no es necesario implementar evento, es mucho más simple. &lt;strong&gt;Lo único que debemos hacer es definir sobre el objeto que representa al hub en cliente el método o función a la que estamos llamando desde el servidor utilizando el objeto dinámico &lt;code&gt;Clients&lt;/code&gt;&lt;/strong&gt;.&lt;br /&gt;
&lt;br /&gt;
En nuestro ejemplo, si recordáis, en el servidor estamos enviando el mensaje a todos los clientes conectados al servicio de la siguiente forma:&lt;br /&gt;
&lt;pre style="background-color: transparent; overflow: visible; padding: 0px;"&gt;&lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size: 10pt;"&gt;    &lt;span style="color: blue;"&gt;this&lt;/span&gt;.Clients.&lt;span style="background-color: yellow;"&gt;updateCell&lt;/span&gt;(&lt;span style="color: blue;"&gt;this&lt;/span&gt;.Caller.userName, y, x, value);
&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;
Por lo tanto, en cliente debemos implementar un método exactamente con el mismo nombre, y que reciba justo los parámetros que se envían desde el servidor (el usuario que realiza el cambio, la celda modificada y el nuevo valor de ésta):&lt;br /&gt;
&lt;pre style="background-color: transparent; overflow: visible; padding: 0px;"&gt;&lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size: 10pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; hub.&lt;span style="background-color: yellow;"&gt;updateCell&lt;/span&gt; = &lt;span style="color: blue;"&gt;function&lt;/span&gt;(username, y, x, value) {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;if&lt;/span&gt; (username != hub.userName) {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;var&lt;/span&gt; elem = $(&lt;span style="color: maroon;"&gt;"#cell"&lt;/span&gt; + y + &lt;span style="color: maroon;"&gt;"-"&lt;/span&gt; + x);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; elem.val(value);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; updateTotal(x); &lt;span style="color: olive;"&gt;// Update column total&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }
&amp;nbsp;&amp;nbsp;&amp;nbsp; };&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;
&lt;h3&gt;



¡Y eso es todo!&lt;/h3&gt;
En el &lt;strong&gt;&lt;a href="https://skydrive.live.com/redir.aspx?cid=c3a43a99b617d787&amp;amp;resid=C3A43A99B617D787!386&amp;amp;parid=C3A43A99B617D787!279"&gt;proyecto de demostración&lt;/a&gt;&lt;/strong&gt; encontraréis bastante más código que el que hemos visto en este post, pero principalmente va destinado a conseguir un look&amp;amp;feel similar a las hojas de cálculo tradicionales (bueno, salvando las distancias, claro!). En lo que respecta a la comunicación asíncrona desde y hacia el servidor, estas pocas líneas que hemos visto aquí son prácticamente todo lo que necesitamos para el sistema funcione y el resultado sea espectacular.&lt;br /&gt;
&lt;br /&gt;
Como os he recomendado otras veces, no dejéis de descargar el proyecto y probar el sistema con varias instancias del navegador abiertas, o desde varios equipos. Veréis lo sorprendente y espectacular que resulta y lo sencillo que es de implementar.&lt;br /&gt;
&lt;br /&gt;
Publicado en: &lt;a href="http://www.variablenotfound.com/"&gt;Variable not found&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/27752126-2181505167527823786?l=www.variablenotfound.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/N0gmvllxYkC0VAzch156sEA4f-w/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/N0gmvllxYkC0VAzch156sEA4f-w/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/N0gmvllxYkC0VAzch156sEA4f-w/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/N0gmvllxYkC0VAzch156sEA4f-w/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/vnf?a=5tntlPKlQz0:Y4TClduOHf0:ecdYMiMMAMM"&gt;&lt;img src="http://feeds.feedburner.com/~ff/vnf?d=ecdYMiMMAMM" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/vnf?a=5tntlPKlQz0:Y4TClduOHf0:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/vnf?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/vnf?a=5tntlPKlQz0:Y4TClduOHf0:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/vnf?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/vnf?a=5tntlPKlQz0:Y4TClduOHf0:4cEx4HpKnUU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/vnf?i=5tntlPKlQz0:Y4TClduOHf0:4cEx4HpKnUU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/vnf?a=5tntlPKlQz0:Y4TClduOHf0:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/vnf?i=5tntlPKlQz0:Y4TClduOHf0:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/vnf?a=5tntlPKlQz0:Y4TClduOHf0:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/vnf?i=5tntlPKlQz0:Y4TClduOHf0:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/vnf?a=5tntlPKlQz0:Y4TClduOHf0:I9og5sOYxJI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/vnf?d=I9og5sOYxJI" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/vnf/~4/5tntlPKlQz0" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.variablenotfound.com/feeds/2181505167527823786/comments/default" title="Enviar comentarios" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=27752126&amp;postID=2181505167527823786" title="9 comentarios" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/27752126/posts/default/2181505167527823786?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/27752126/posts/default/2181505167527823786?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/vnf/~3/5tntlPKlQz0/signalr-iv-hubs.html" title="SignalR (IV): Hubs" /><author><name>José M. Aguilar</name><uri>http://www.blogger.com/profile/11683750380776435448</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://3.bp.blogspot.com/_O9D62hXq-ng/S6Hfc0RM0YI/AAAAAAAABOg/bEEA3DZ7Uac/S220/fb1.png" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://lh6.ggpht.com/-beJgJixhQAc/T2cbNM_eBmI/AAAAAAAAB0g/us__7zlOIEE/s72-c/video49400dd49400%25255B16%25255D.jpg?imgmax=800" height="72" width="72" /><thr:total>9</thr:total><feedburner:origLink>http://www.variablenotfound.com/2012/03/signalr-iv-hubs.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DEYHQn46cSp7ImA9WhVREUg.&quot;"><id>tag:blogger.com,1999:blog-27752126.post-8269726968453724634</id><published>2012-03-19T09:25:00.000+01:00</published><updated>2012-03-19T12:22:13.019+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-03-19T12:22:13.019+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="enlaces" /><title>Enlaces interesantes 74</title><content type="html">&lt;a href="http://lh4.ggpht.com/-GTFB6fW9urY/T12rRrNkegI/AAAAAAAABzs/3QLJYOQOHZQ/s1600-h/image7_thumb_thumb_thumb_thumb_thumb%25255B1%25255D.png"&gt;&lt;img align="right" alt="Enlaces interesantes" border="0" height="129" src="http://lh3.ggpht.com/-yuv_mW9-ek0/T12rS_S2yYI/AAAAAAAABz0/j2HyFqvMqgs/image7_thumb_thumb_thumb_thumb_thumb%25255B2%25255D.png?imgmax=800" style="background-image: none; border-width: 0px; display: inline; float: right; margin: 0px 0px 10px 10px; padding-left: 0px; padding-right: 0px; padding-top: 0px;" title="Enlaces" width="172" /&gt;&lt;/a&gt;Estos son los enlaces publicados en &lt;a href="http://www.facebook.com/variablenotfound"&gt;Variable not found en Facebook&lt;/a&gt; y &lt;a href="http://twitter.com/jmaguilar"&gt;Twitter&lt;/a&gt; del 12 al 18 de marzo de 2012.&amp;nbsp;Espero que os resulten interesantes :-)&lt;br /&gt;
&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;
&lt;h4&gt; .Net&lt;/h4&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;&lt;a href="http://www.genbetadev.com/cnet/programacion-asincrona-net-4-5"&gt;Programación Asíncrona .NET 4.5&lt;/a&gt;&lt;/strong&gt;       &lt;br /&gt;
Javier Torrecilla &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="http://blogs.msdn.com/b/vbertocci/archive/2012/03/15/windows-identity-foundation-in-the-net-framework-4-5-beta-tools-samples-claims-everywhere.aspx"&gt;Windows Identity Foundation in the .NET Framework 4.5 Beta: Tools, Samples, Claims Everywhere&lt;/a&gt;&lt;/strong&gt;       &lt;br /&gt;
Vittorio Bertocci &lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.west-wind.com/weblog/posts/2012/Mar/13/NET-45-is-an-inplace-replacement-for-NET-40"&gt;&lt;strong&gt;.NET 4.5 is an in-place replacement for .NET 4.0&lt;/strong&gt;&lt;/a&gt;       &lt;br /&gt;
Rick Strahl &lt;/li&gt;
&lt;/ul&gt;&lt;h4&gt; Asp.net&lt;/h4&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://geeks.ms/blogs/lruiz/archive/2012/03/16/asp-net-dale-un-toque-metro-a-tus-aplicaciones-asp-net-con-jquery-i.aspx" title="[ASP.NET] Dale un toque Metro a tus aplicaciones ASP.NET con jQuery (I)"&gt;&lt;strong&gt;[ASP.NET] Dale un toque Metro a tus aplicaciones ASP.NET con jQuery (I)&lt;/strong&gt;&lt;/a&gt;       &lt;br /&gt;
Luis Ruiz Pavón &lt;/li&gt;
&lt;li&gt;&lt;a href="http://encosia.com/jquery-asp-net-web-api-and-json-net-walk-into-a-bar/"&gt;&lt;strong&gt;jQuery, ASP.NET Web API, and Json.NET walk into a bar…&lt;/strong&gt;&lt;/a&gt;       &lt;br /&gt;
Dave Ward &lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.hanselman.com/blog/HowToAccessNuGetWhenNuGetorgIsDownOrYoureOnAPlane.aspx" title="How to access NuGet when NuGet.org is down (or you're on a plane)"&gt;&lt;strong&gt;How to access NuGet when NuGet.org is down (or you're on a plane)&lt;/strong&gt;&lt;/a&gt;       &lt;br /&gt;
Scott Hanselman &lt;/li&gt;
&lt;li&gt;&lt;a href="http://odetocode.com/Blogs/scott/archive/2012/03/11/complete-guide-to-mass-assignment-in-asp-net-mvc.aspx"&gt;&lt;strong&gt;6 Ways To Avoid Mass Assignment in ASP.NET MVC&lt;/strong&gt;&lt;/a&gt;       &lt;br /&gt;
K. Scott Allen &lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.codeproject.com/Articles/344098/MVC-log4net-Controller-Action-tracing-using-global"&gt;&lt;strong&gt;MVC - log4net Controller Action tracing using global filters&lt;/strong&gt;&lt;/a&gt;       &lt;br /&gt;
Dylan Morley &lt;/li&gt;
&lt;li&gt;&lt;a href="http://haacked.com/archive/2012/03/11/itrsquos-the-little-things-about-asp-net-mvc-4.aspx" title="Title of this entry"&gt;&lt;strong&gt;It’s The Little Things about ASP.NET MVC 4&lt;/strong&gt;&lt;/a&gt;       &lt;br /&gt;
Phil Haack &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="http://weblogs.asp.net/imranbaloch/archive/2012/03/10/switching-between-mobile-and-desktop-host-in-asp-net-mvc-4.aspx"&gt;Switching between Mobile and Desktop Host in ASP.NET MVC 4&lt;/a&gt; &lt;/strong&gt;      &lt;br /&gt;
Imran Baloch &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="http://geeks.ms/blogs/gperez/archive/2012/03/11/tutorial-asp-net-web-api-con-mongodb-parte-1.aspx"&gt;Tutorial Asp.net Web API con MongoDB – Parte 1&lt;/a&gt;&lt;/strong&gt;       &lt;br /&gt;
Gonzalo Pérez       &lt;ul&gt;&lt;/ul&gt;&lt;ul&gt;&lt;/ul&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;h4&gt; Data access&lt;/h4&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://geeks.ms/blogs/jtorrecilla/archive/2012/03/16/dbmigration-y-code-first.aspx" title="DbMigration y Code First"&gt;&lt;strong&gt;DbMigration y Code First&lt;/strong&gt;&lt;/a&gt;       &lt;br /&gt;
Javier Torrecilla &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="http://www.codeproject.com/Articles/43417/Entity-Framework-Performance"&gt;Entity Framework Performance&lt;/a&gt;&lt;/strong&gt;       &lt;br /&gt;
Mark Nischalke &lt;/li&gt;
&lt;/ul&gt;&lt;h4&gt; Html/Css/Javascript&lt;/h4&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;&lt;a href="http://www.elijahmanor.com/2012/03/find-jquery-bug-8-suspicious-selectors.html"&gt;Find the jQuery Bug #8: Suspicious Selectors&lt;/a&gt; &lt;/strong&gt;      &lt;br /&gt;
Elijah Manor &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="http://html5doctor.com/ol-element-attributes/"&gt;The ol Element and Related Attributes: type, start, value, and reversed&lt;/a&gt;&lt;code&gt;&lt;/code&gt;&lt;/strong&gt;       &lt;br /&gt;
Oli Studholme &lt;/li&gt;
&lt;li&gt;&lt;a href="http://wildermuth.com/2012/3/10/JavaScript_for_the_C_Guy_Function_Overloads"&gt;&lt;strong&gt;JavaScript for the C# Guy: Function Overloads&lt;/strong&gt;&lt;/a&gt;       &lt;br /&gt;
Shawn Wildermuth       &lt;ul&gt;&lt;/ul&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;h4&gt; Visual Studio/Complementos&lt;/h4&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;&lt;a href="http://blogs.msdn.com/b/webdevtools/archive/2012/03/15/vs11-beta-javascript-feature-comparison-with-vs2010sp1.aspx"&gt;VS11 Beta JavaScript Feature comparison with VS2010sp1&lt;/a&gt;&lt;/strong&gt;       &lt;br /&gt;
Xinyang Qiu &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="http://thedatafarm.com/blog/data-access/vs11-and-ef5-where-rsquo-s-that-database-that-code-first-created/"&gt;VS11 and EF5: Where’s that database that Code First created?&lt;/a&gt;&lt;/strong&gt;       &lt;br /&gt;
Julie Lerman&amp;nbsp;&amp;nbsp; &lt;/li&gt;
&lt;/ul&gt;Y no olvidéis que podéis seguir esta información en vivo y en directo desde &lt;a href="http://www.facebook.com/variablenotfound"&gt;Variable not found en Facebook&lt;/a&gt;, o a través de &lt;a href="http://twitter.com/jmaguilar"&gt;Twitter&lt;/a&gt;.     &lt;br /&gt;
&lt;br /&gt;
Publicado en &lt;a href="http://www.variablenotfound.com/"&gt;Variable not found&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/27752126-8269726968453724634?l=www.variablenotfound.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/cpT8CDonzku8XOGDuxAZ6cJKKAo/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/cpT8CDonzku8XOGDuxAZ6cJKKAo/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/cpT8CDonzku8XOGDuxAZ6cJKKAo/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/cpT8CDonzku8XOGDuxAZ6cJKKAo/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/vnf?a=7-Yrc12Bs0Q:nvhhlV7LJX8:ecdYMiMMAMM"&gt;&lt;img src="http://feeds.feedburner.com/~ff/vnf?d=ecdYMiMMAMM" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/vnf?a=7-Yrc12Bs0Q:nvhhlV7LJX8:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/vnf?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/vnf?a=7-Yrc12Bs0Q:nvhhlV7LJX8:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/vnf?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/vnf?a=7-Yrc12Bs0Q:nvhhlV7LJX8:4cEx4HpKnUU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/vnf?i=7-Yrc12Bs0Q:nvhhlV7LJX8:4cEx4HpKnUU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/vnf?a=7-Yrc12Bs0Q:nvhhlV7LJX8:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/vnf?i=7-Yrc12Bs0Q:nvhhlV7LJX8:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/vnf?a=7-Yrc12Bs0Q:nvhhlV7LJX8:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/vnf?i=7-Yrc12Bs0Q:nvhhlV7LJX8:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/vnf?a=7-Yrc12Bs0Q:nvhhlV7LJX8:I9og5sOYxJI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/vnf?d=I9og5sOYxJI" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/vnf/~4/7-Yrc12Bs0Q" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.variablenotfound.com/feeds/8269726968453724634/comments/default" title="Enviar comentarios" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=27752126&amp;postID=8269726968453724634" title="0 comentarios" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/27752126/posts/default/8269726968453724634?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/27752126/posts/default/8269726968453724634?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/vnf/~3/7-Yrc12Bs0Q/enlaces-interesantes-74.html" title="Enlaces interesantes 74" /><author><name>José M. Aguilar</name><uri>http://www.blogger.com/profile/11683750380776435448</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://3.bp.blogspot.com/_O9D62hXq-ng/S6Hfc0RM0YI/AAAAAAAABOg/bEEA3DZ7Uac/S220/fb1.png" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://lh3.ggpht.com/-yuv_mW9-ek0/T12rS_S2yYI/AAAAAAAABz0/j2HyFqvMqgs/s72-c/image7_thumb_thumb_thumb_thumb_thumb%25255B2%25255D.png?imgmax=800" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://www.variablenotfound.com/2012/03/enlaces-interesantes-74.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DUIMQX89fSp7ImA9WhVSFk8.&quot;"><id>tag:blogger.com,1999:blog-27752126.post-5668287942715440708</id><published>2012-03-13T09:33:00.000+01:00</published><updated>2012-03-13T09:33:00.165+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-03-13T09:33:00.165+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="desarrollo" /><category scheme="http://www.blogger.com/atom/ns#" term="asp.net" /><category scheme="http://www.blogger.com/atom/ns#" term="aspnetmvc" /><category scheme="http://www.blogger.com/atom/ns#" term="signalr" /><title>SignalR (III): Más Conexiones Persistentes</title><content type="html">&lt;img align="right" alt="Qué divertido" border="0" height="230" src="http://lh4.ggpht.com/-ScJZ82L2Rg0/TzwQZn8xo-I/AAAAAAAABw8/ZxTDN4hSkEM/image%25255B8%25255D.png?imgmax=800" style="background-image: none; border: 0px currentColor; display: inline; float: right; margin: 0px 0px 10px 10px; padding-left: 0px; padding-right: 0px; padding-top: 0px;" title="Qué divertido" width="191" /&gt;Lo divertido de escribir sobre productos que están todavía en fase de desarrollo es que cambian...&amp;nbsp;y a veces, ¡de qué forma! Pues esto ha ocurrido con SignalR: recientemente se &lt;a href="http://damianedwards.wordpress.com/2012/01/30/signalr-0-4-released/"&gt;publicó la revisión 0.4&lt;/a&gt; y bastantes cosas de las tratadas en el &lt;a href="http://www.variablenotfound.com/2012/01/signalr-ii-conexiones-persistentes.html"&gt;post anterior&lt;/a&gt; de la serie ha &lt;a href="http://www.cineyletras.es/Origen-de-las-palabras/quedar-en-agua-de-borrajas.html"&gt;quedado en agua de borrajas&lt;/a&gt;. En fin, estaba avisado, así que mucho no puedo quejarme ;-)&lt;br /&gt;
&lt;br /&gt;
Por tanto, esta tercera entrega de la serie vamos a dedicarla (otra vez ;-)) a las conexiones persistentes, veremos qué cosas han cambiado con la llegada de la revisión 0.4, y desarrollaremos un nuevo ejemplo que ilustre las novedades que podemos encontrar a la hora de trabajar a bajo nivel con SignalR.&lt;br /&gt;
&lt;a name='more'&gt;&lt;/a&gt;&lt;h3&gt;


1. Resumen rápido: persistent connections y la versión 0.4 de SignalR&lt;/h3&gt;
Para los que ya dominabais SignalR, os resumo las novedades principales que he encontrado hasta el momento en esta nueva revisión:&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;han desaparecido todos los métodos síncronos&lt;/strong&gt; (&lt;code&gt;OnConnected&lt;/code&gt;, &lt;code&gt;OnDisconnect&lt;/code&gt;, &lt;code&gt;OnReceived&lt;/code&gt;…) que implementábamos en el ejemplo de la segunda entrega de la serie para tomar el control ante determinados eventos de la conexión.&lt;/li&gt;
&lt;li&gt;por tanto, ahora &lt;strong&gt;es obligatorio utilizar las versiones asíncronas&lt;/strong&gt; (&lt;code&gt;OnConnectedAsync&lt;/code&gt;, &lt;code&gt;OnDisconnectAsync&lt;/code&gt;, &lt;code&gt;OnReceivedAsync&lt;/code&gt;…), que retornan un objeto &lt;code&gt;Task&lt;/code&gt; para implementar la lógica de gestión de los eventos.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;SignalR ha sido desacoplado de ASP.NET&lt;/strong&gt;, lo que permite utilizarlo en otros entornos. Como consecuencia, la firma de algunos métodos ha sido modificada. Así, cuando somos notificados de una nueva conexión, ya &lt;strong&gt;no recibimos el contexto HTTP tradicional, sino abstracciones propias de SignalR&lt;/strong&gt; y desvinculadas de ASP.NET, lo cual supone alguna pequeña limitación aunque fácilmente salvable.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;El proceso de negociación utiliza el transporte más apropiado para cada navegador&lt;/strong&gt;, teniendo en cuenta de los componentes disponibles en servidor. En Internet Explorer se utiliza el transporte “Forever frame”, mientras que Firefox y Chrome usan “Long Polling” cuando el servidor no corre sobre .NET 4.5 (en caso contrario usaría websockets de HTML5).&lt;/li&gt;
&lt;li&gt;Curiosamente, &lt;strong&gt;lo que antes denominábamos “clientId”&lt;/strong&gt;, que es ese GUID que identifica de forma única a cada cliente conectado, &lt;strong&gt;ha pasado a llamarse “connectionId”&lt;/strong&gt;. No afecta a nada, sigue significando lo mismo, pero es un cambio conceptual destinado a que tengamos claro qué indica ese dato.&lt;/li&gt;
&lt;li&gt;Ahora, &lt;strong&gt;los broadcasts enviados justo durante la conexión de un nuevo cliente incluyen al propio cliente conectado&lt;/strong&gt;, lo que evita tener que hacer el hack al que nos veíamos obligados en el post anterior (el “ping”).&lt;/li&gt;
&lt;/ul&gt;
A continuación desarrollaremos un ejemplo completo para que podemos ver de nuevo en funcionamiento esta maravilla. Como siempre, al final del artículo encontraréis un enlace para descargar el proyecto de demostración, en el que también he modificado el ejemplo que vimos en el post anterior para adaptarlo a los cambios de la revisión de SignalR.&lt;br /&gt;
&lt;h3&gt;


2. Creación de un chat simple con SignalR&lt;/h3&gt;
En este artículo vamos a complicar ligeramente el ejemplo anterior para construir un pequeño chat al estilo del que encontramos en Facebook, y cuyo aspecto podéis ver en la captura de pantalla siguiente:   &lt;br /&gt;
&lt;br /&gt;
&lt;img alt="Captura de pantalla" border="0" height="515" src="http://lh4.ggpht.com/-zUbexeZ2Cac/TyqNF64WOTI/AAAAAAAABxE/__LXkYNgTvk/image3%25255B1%25255D.png?imgmax=800" style="background-image: none; border: 0px currentColor; display: inline; margin: 0px 0px 10px 10px; padding-left: 0px; padding-right: 0px; padding-top: 0px;" title="Captura de pantalla" width="692" /&gt;    &lt;br /&gt;
De forma muy similar al ejemplo que vimos en el &lt;a href="http://www.variablenotfound.com/2012/01/signalr-ii-conexiones-persistentes.html"&gt;post anterior&lt;/a&gt;, necesitaremos:&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;Crear nuestro servicio, como ya sabemos, implementando una clase que herede de &lt;code&gt;PersistentConnection&lt;/code&gt;. Llamaremos a esta clase &lt;code&gt;SimpleChatService&lt;/code&gt;. &lt;/li&gt;
&lt;li&gt;Tomar el control cuando un cliente envía un mensaje al servidor, con objeto de hacer un broadcast al resto de usuarios. Esto lo conseguiremos sobrescribiendo el método &lt;code&gt;OnReceivedAsync.&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;También tendremos que registrar la ruta hacia el &lt;em&gt;endpoint&lt;/em&gt;, de forma que las peticiones puedan llegar a él.&lt;/li&gt;
&lt;li&gt;Y, por último, implementaremos el lado cliente, que consistirá en el UI y los scripts que se conectan al servidor, envían los mensajes cuando son tecleados por el usuario, y muestran en pantalla a su vez los textos enviados por otros usuarios. &lt;/li&gt;
&lt;/ul&gt;
Vamos con ello.&lt;br /&gt;
&lt;h3&gt;


3. El lado servidor. Asincronía al 100%.&lt;/h3&gt;
Un sistema basado en SignalR no podría funcionar correctamente si no utilizara las capacidades de asincronía del framework, debido a la gran cantidad de mensajes que pueden llegar a intercambiarse entre cliente y servidor. Por ello, el equipo del producto ha puesto especial énfasis en utilizar métodos asíncronos siempre que sea posible, evitando así bloqueos innecesarios y aumentando la capacidad de respuesta del servicio.&lt;br /&gt;
&lt;br /&gt;
&lt;a href="http://www.variablenotfound.com/2012/01/signalr-ii-conexiones-persistentes.html"&gt;En el post anterior&lt;/a&gt; veíamos que podemos tomar el control del sistema cuando los usuarios se conectan, desconectan, o envían información al servidor sobrescribiendo los métodos &lt;code&gt;OnConnected()&lt;/code&gt;, &lt;code&gt;OnDisconnect()&lt;/code&gt;, y &lt;code&gt;OnReceived()&lt;/code&gt; respectivamente. Sin embargo, el uso de esos métodos síncronos podían hacer ver que este aspecto no era importante.&lt;br /&gt;
&lt;br /&gt;
La versión 0.4 ha dado la vuelta a esto, y obliga a utilizar sus equivalentes asíncronos &lt;code&gt;OnConnectedAsync()&lt;/code&gt;, &lt;code&gt;OnDisconnectAsync()&lt;/code&gt; y &lt;code&gt;OnReceivedAsync()&lt;/code&gt;; &lt;strong&gt;en estos casos siempre se retornarán objetos de tipo &lt;code&gt;Task&lt;/code&gt;&lt;/strong&gt;, lo que abre la puerta a la paralelización y mejor aprovechamiento de la infraestructura sobre la que estamos corriendo.&lt;br /&gt;
&lt;br /&gt;
Por tanto, comenzaremos la implementación de nuevo servicio heredando de &lt;code&gt;PersistentConnection&lt;/code&gt; y sobrescribiendo, aunque de momento con un cuerpo vacío, el método que necesitamos para nuestro chat:&lt;br /&gt;
&lt;pre style="background-color: transparent; overflow: visible; padding: 0px;"&gt;&lt;span style="font-family: Consolas;"&gt;&lt;span style="color: blue;"&gt;&lt;span style="font-size: 10pt;"&gt;public&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 10pt;"&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;class&lt;/span&gt;&amp;nbsp;&lt;span style="color: #2b91af;"&gt;SimpleChatService&lt;/span&gt; : &lt;span style="color: #2b91af;"&gt;PersistentConnection&lt;/span&gt;
{

&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;protected&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;override&lt;/span&gt;&amp;nbsp;&lt;span style="color: #2b91af;"&gt;Task&lt;/span&gt; OnReceivedAsync(&lt;span style="color: blue;"&gt;string&lt;/span&gt; connectionId, &lt;span style="color: blue;"&gt;string&lt;/span&gt; data)
&amp;nbsp;&amp;nbsp;&amp;nbsp; {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: green;"&gt;// ...&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; }
}&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;
Observad &lt;strong&gt;el retorno del objeto &lt;code&gt;Task&lt;/code&gt;, que representa la tarea asíncrona que iniciamos desde el método&lt;/strong&gt;. Si el trabajo a realizar en su interior es asíncrono podemos utilizar cualquiera de las vías disponibles para crear un &lt;code&gt;Task&lt;/code&gt;, lo retornamos, y listo, por ejemplo así:&lt;br /&gt;
&lt;pre style="background-color: transparent; overflow: visible; padding: 0px;"&gt;&lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size: 10pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;protected&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;override&lt;/span&gt;&amp;nbsp;&lt;span style="color: #2b91af;"&gt;Task&lt;/span&gt; OnReceivedAsync(&lt;span style="color: blue;"&gt;string&lt;/span&gt; connectionId, &lt;span style="color: blue;"&gt;string&lt;/span&gt; data)
&amp;nbsp;&amp;nbsp;&amp;nbsp; {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;return&lt;/span&gt;&amp;nbsp;&lt;span style="color: #2b91af;"&gt;Task&lt;/span&gt;.Factory.StartNew(() =&amp;gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: green;"&gt;// Async task here...&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; );
&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;
Pero, ¿qué ocurre &lt;strong&gt;si la lógica que queremos implementar en ellos es puramente síncrona&lt;/strong&gt;? Pues no pasa nada, la ejecutaremos y &lt;strong&gt;retornaremos una llamada a la implementación por defecto&lt;/strong&gt; del método, que ya se encarga de devolvernos un &lt;code&gt;Task&lt;/code&gt; vacío :-)&lt;br /&gt;
&lt;pre style="background-color: transparent; overflow: visible; padding: 0px;"&gt;&lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size: 10pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;protected&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;override&lt;/span&gt;&amp;nbsp;&lt;span style="color: #2b91af;"&gt;Task&lt;/span&gt; OnReceivedAsync(&lt;span style="color: blue;"&gt;string&lt;/span&gt; connectionId, &lt;span style="color: blue;"&gt;string&lt;/span&gt; data)
&amp;nbsp;&amp;nbsp;&amp;nbsp; {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: green;"&gt;// Do some sync work and &lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: green;"&gt;// then return an empty Task&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;return&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;base&lt;/span&gt;.OnReceivedAsync(connectionId, data);
&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;
Bueno, continuemos con la implementación de nuestro chat. Cuando un cliente nos envíe un texto, lo recibiremos en el método &lt;code&gt;OnReceivedAsync&lt;/code&gt;, y lo que queremos hacer es enviarlo al resto de usuarios conectados, ¿no? Pues simplemente usaremos la propiedad &lt;code&gt;Connection&lt;/code&gt; disponible en la clase base y llamaremos a su método &lt;code&gt;BroadCast()&lt;/code&gt;. Y dado que éste retorna un &lt;code&gt;Task&lt;/code&gt;, directamente podremos retornarlo como resultado del método. La implementación completa de la clase queda como sigue:&lt;br /&gt;
&lt;pre style="background-color: transparent; overflow: visible; padding: 0px;"&gt;&lt;span style="font-family: Consolas;"&gt;&lt;span style="color: blue;"&gt;&lt;span style="font-size: 10pt;"&gt;public&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 10pt;"&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;class&lt;/span&gt;&amp;nbsp;&lt;span style="color: #2b91af;"&gt;SimpleChatService&lt;/span&gt; : &lt;span style="color: #2b91af;"&gt;PersistentConnection&lt;/span&gt;
{
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;protected&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;override&lt;/span&gt;&amp;nbsp;&lt;span style="color: #2b91af;"&gt;Task&lt;/span&gt; OnReceivedAsync(&lt;span style="color: blue;"&gt;string&lt;/span&gt; connectionId, &lt;span style="color: blue;"&gt;string&lt;/span&gt; data)
&amp;nbsp;&amp;nbsp;&amp;nbsp; {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;string&lt;/span&gt; clientDescription = getClientDescription();
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;return&lt;/span&gt; Connection.Broadcast(&lt;span style="color: blue;"&gt;new&lt;/span&gt; { user = clientDescription, message = data });
&amp;nbsp;&amp;nbsp;&amp;nbsp; }
 
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;private&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;static&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;string&lt;/span&gt; getClientDescription()
&amp;nbsp;&amp;nbsp;&amp;nbsp; {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;var&lt;/span&gt; context = &lt;span style="color: #2b91af;"&gt;HttpContext&lt;/span&gt;.Current;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;var&lt;/span&gt; name = context.Request.IsAuthenticated
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ? context.User.Identity.Name
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; : context.Request.UserHostAddress;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;return&lt;/span&gt; name;
&amp;nbsp;&amp;nbsp;&amp;nbsp; }
}&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;
&lt;br /&gt;
&lt;img align="right" alt="Chat en funcionamiento" border="0" height="180" src="http://lh4.ggpht.com/-lUL4vdCEkRM/TzwQcbmSW-I/AAAAAAAABxI/xQs6tGSNP8A/image%25255B4%25255D.png?imgmax=800" style="background-image: none; border: 0px currentColor; display: inline; float: right; margin: 0px 0px 10px 10px; padding-left: 0px; padding-right: 0px; padding-top: 0px;" title="Chat en funcionamiento" width="158" /&gt;Mediante la invocación a &lt;code&gt;BroadCast()&lt;/code&gt; estamos enviando a todos los clientes conectados un objeto anónimo serializado en JSON. En este caso, dicho objeto contará únicamente con dos propiedades, &lt;code&gt;user&lt;/code&gt; y &lt;code&gt;message&lt;/code&gt;, que recuperaremos desde el lado cliente para mostrar el mensaje en pantalla junto con el nombre del usuario emisor.&lt;br /&gt;
&lt;br /&gt;
El otro método que aparece en el código, &lt;code&gt;getClientDescription()&lt;/code&gt;, es simplemente una ayuda para obtener el nombre del usuario que se mostrará en pantalla, que será el &lt;code&gt;User.Identity.Name&lt;/code&gt; si está autenticado, o la IP en caso contrario.&lt;br /&gt;
&lt;br /&gt;
No sé si os estáis dando cuenta, pero, &lt;strong&gt;¡estamos implementando el lado servidor de un mini-chat en menos de diez líneas de código! &lt;/strong&gt;&lt;br /&gt;
&lt;h3&gt;


4. Rutado de peticiones hacia el endpoint&lt;/h3&gt;
Como también vimos en el artículo anterior de la serie, &lt;strong&gt;para que las peticiones lleguen al &lt;em&gt;endpoint&lt;/em&gt; es necesario registrarlo en el sistema de routing&lt;/strong&gt;. El lugar para hacerlo, como es habitual, será el global.asax:&lt;br /&gt;
&lt;pre style="background-color: transparent; overflow: visible; padding: 0px;"&gt;&lt;span style="font-family: consolas;"&gt;&lt;span style="font-size: 10pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;protected&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;void&lt;/span&gt; Application_Start()
&amp;nbsp;&amp;nbsp;&amp;nbsp; {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #2b91af;"&gt;AreaRegistration&lt;/span&gt;.RegisterAllAreas();
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; RegisterGlobalFilters(&lt;span style="color: #2b91af;"&gt;GlobalFilters&lt;/span&gt;.Filters);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="background-color: yellow;"&gt;RegisterSignalrConnections(&lt;span style="color: #2b91af;"&gt;RouteTable&lt;/span&gt;.Routes);&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; RegisterRoutes(&lt;span style="color: #2b91af;"&gt;RouteTable&lt;/span&gt;.Routes);
&amp;nbsp;&amp;nbsp;&amp;nbsp; }
 
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;static&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;void&lt;/span&gt; RegisterSignalrConnections(&lt;span style="color: #2b91af;"&gt;RouteCollection&lt;/span&gt; routes)
&amp;nbsp;&amp;nbsp;&amp;nbsp; {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; routes.MapConnection&amp;lt;&lt;span style="color: #2b91af;"&gt;SimpleChatService&lt;/span&gt;&amp;gt;(&lt;span style="color: #a31515;"&gt;"SimpleChat"&lt;/span&gt;, &lt;span style="color: #a31515;"&gt;"SimpleChatService/{*operation}"&lt;/span&gt;);
&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;
Esto es todo lo que necesitamos para dejar configuradas las rutas. El parámetro genérico de la llamada a &lt;code&gt;MapConnection()&lt;/code&gt; indica la clase que implementa el servicio; el primer parámetro del método es simplemente el nombre de la ruta (no tiene mayor importancia), y el segundo especifica la URL a través de la cual será posible acceder al &lt;em&gt;endpoint&lt;/em&gt;.&lt;br /&gt;
&lt;br /&gt;
Y así, podemos pasar ahora a implementar el cliente.&lt;br /&gt;
&lt;h3&gt;


5. El lado cliente&lt;/h3&gt;
En el proyecto de demostración que podéis descargar al final del post está un poco más trabajado a nivel de interfaz de usuario, aquí vamos a comentar únicamente los principales aspectos a tener en cuenta.&lt;br /&gt;
&lt;br /&gt;
En lo relativo a la presentación, nuestro chat sólo necesita la inclusión del siguiente código en la página:&lt;br /&gt;
&lt;pre style="background-color: transparent; overflow: visible; padding: 0px;"&gt;&lt;span style="font-family: consolas;"&gt;&lt;span style="color: blue;"&gt;&lt;span style="font-size: 10pt;"&gt;&amp;lt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 10pt;"&gt;&lt;span style="color: maroon;"&gt;div&lt;/span&gt;&amp;nbsp;&lt;span style="color: red;"&gt;id&lt;/span&gt;&lt;span style="color: blue;"&gt;="chat"&amp;gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;div&lt;/span&gt;&amp;nbsp;&lt;span style="color: red;"&gt;id&lt;/span&gt;&lt;span style="color: blue;"&gt;="chat-messages"&amp;gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: darkgreen;"&gt;&amp;lt;!-- Placeholder for messages --&amp;gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon;"&gt;div&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;form&lt;/span&gt;&amp;nbsp;&lt;span style="color: red;"&gt;method&lt;/span&gt;&lt;span style="color: blue;"&gt;="POST"&lt;/span&gt;&amp;nbsp;&lt;span style="color: red;"&gt;action&lt;/span&gt;&lt;span style="color: blue;"&gt;="#"&lt;/span&gt;&amp;nbsp;&lt;span style="color: red;"&gt;id&lt;/span&gt;&lt;span style="color: blue;"&gt;="chat-form"&amp;gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;input&lt;/span&gt;&amp;nbsp;&lt;span style="color: red;"&gt;type&lt;/span&gt;&lt;span style="color: blue;"&gt;="text"&lt;/span&gt;&amp;nbsp;&lt;span style="color: red;"&gt;id&lt;/span&gt;&lt;span style="color: blue;"&gt;="chat-message"&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;/&amp;gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;input&lt;/span&gt;&amp;nbsp;&lt;span style="color: red;"&gt;type&lt;/span&gt;&lt;span style="color: blue;"&gt;="submit"&lt;/span&gt;&amp;nbsp;&lt;span style="color: red;"&gt;value&lt;/span&gt;&lt;span style="color: blue;"&gt;="Send"&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;/&amp;gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon;"&gt;form&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: consolas;"&gt;&lt;span style="font-size: 10pt;"&gt;&lt;span style="color: blue;"&gt;&amp;gt;
&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon;"&gt;div&lt;/span&gt;&lt;/span&gt;&lt;span style="color: blue; font-size: 10pt;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;
Como podéis intuir, el bloque con identificador “chat-messages” será utilizado, obviamente, para introducir los mensajes que vayamos recibiendo desde el servidor, es decir, los escritos por todos los usuarios que estén participando en el chat. El formulario, por otra parte, simplemente es el mecanismo mediante el cual los usuarios podrán enviar sus mensajes.&lt;br /&gt;
&lt;br /&gt;
Además de esto necesitaremos algunos scripts que le den vidilla al asunto:&lt;br /&gt;
&lt;pre style="background-color: transparent; overflow: visible; padding: 0px;"&gt;&lt;span style="font-family: consolas;"&gt;&lt;span style="font-size: 10pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; $(&lt;span style="color: blue;"&gt;function&lt;/span&gt; () {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $(&lt;span style="color: maroon;"&gt;"#chat-form"&lt;/span&gt;).submit(&lt;span style="color: blue;"&gt;function&lt;/span&gt; () {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;var&lt;/span&gt; message = $.trim($(&lt;span style="color: maroon;"&gt;"#chat-message"&lt;/span&gt;).val());
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;if&lt;/span&gt; (message != &lt;span style="color: maroon;"&gt;""&lt;/span&gt;) {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; conn.send(message);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $(&lt;span style="color: maroon;"&gt;"#chat-message"&lt;/span&gt;).focus().val(&lt;span style="color: maroon;"&gt;""&lt;/span&gt;);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;return&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;false&lt;/span&gt;;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; });
 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;var&lt;/span&gt; conn = $.connection(&lt;span style="color: maroon;"&gt;"SimpleChatService"&lt;/span&gt;);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; conn.received(&lt;span style="color: blue;"&gt;function&lt;/span&gt; (data) {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;var&lt;/span&gt; user = data.user;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;var&lt;/span&gt; message = data.message;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $(&lt;span style="color: maroon;"&gt;'#chat-messages'&lt;/span&gt;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .append(&lt;span style="color: maroon;"&gt;"&amp;lt;div&amp;gt;&amp;lt;strong&amp;gt;"&lt;/span&gt; + user + &lt;span style="color: maroon;"&gt;"&amp;lt;/strong&amp;gt;: "&lt;/span&gt; +
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; message + &lt;span style="color: maroon;"&gt;"&amp;lt;/div&amp;gt;"&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; );
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 
            &lt;span style="color: blue;"&gt;var&lt;/span&gt; sh = $(&lt;span style="color: maroon;"&gt;'#chat-messages'&lt;/span&gt;)[0].scrollHeight;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $(&lt;span style="color: maroon;"&gt;"#chat-messages"&lt;/span&gt;).animate({ scrollTop: sh }, 3000);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; });
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; conn.start();
&amp;nbsp;&amp;nbsp;&amp;nbsp; });&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;
&lt;br /&gt;
A grandes rasgos, lo que estamos haciendo es lo siguiente:&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;En primer lugar, creamos y asignamos la función de tratamiento del evento &lt;em&gt;submit&lt;/em&gt; del formulario. En su interior, lo único que hacemos es enviar el contenido de la caja de texto “chat-message” al servidor, limpiar dicho control y volver a posicionar sobre él el foco de edición. El texto enviado desde este punto será el que recibimos en el método &lt;code&gt;OnReceivedAsync()&lt;/code&gt; que hemos visto anteriormente implementado en el servidor. &lt;/li&gt;
&lt;li&gt;A continuación, se obtiene una conexión al servicio, almacenándola en la variable &lt;code&gt;conn&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Implementamos el callback &lt;code&gt;received&lt;/code&gt; sobre el objeto &lt;code&gt;conn&lt;/code&gt;, que será invocado cuando se reciban datos enviados por el servidor. El parámetro &lt;code&gt;data&lt;/code&gt; será la instancia del objeto anónimo que enviamos desde el servidor mediante el broadcast, por eso podemos usar directamente sus propiedades &lt;code&gt;name&lt;/code&gt; y &lt;code&gt;message&lt;/code&gt; para añadirlo a la ventana del chat. Finalmente, desplazamos la ventana hasta el final del scroll para que se puedan ver directamente los últimos mensajes recibidos. &lt;/li&gt;
&lt;li&gt;Por último, iniciamos la conexión llamando a método &lt;code&gt;start()&lt;/code&gt; del objeto correspondiente. &lt;/li&gt;
&lt;/ul&gt;
Y con esto hemos acabado la implementación de nuestro simplísimo chat. Como os comentaba, en el proyecto de demostración está un poco más trabajado a nivel de interfaz, pero básicamente es lo que hemos visto aquí.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;table border="0" cellpadding="2" cellspacing="0" style="width: 500px;"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td valign="top" width="250"&gt;&lt;img alt="Simplechat" border="0" height="266" src="http://lh5.ggpht.com/-oF2-EhTPXyg/TyqNGtq4CgI/AAAAAAAABvw/_r2uapj5BW8/image13.png?imgmax=800" style="background-image: none; border-width: 0px; display: inline; margin: 0px 0px 10px 10px; padding-left: 0px; padding-right: 0px; padding-top: 0px;" title="Simplechat" width="338" /&gt;&lt;/td&gt;&lt;td valign="top" width="250"&gt;&lt;img alt="SimpleChat" border="0" height="266" src="http://lh4.ggpht.com/-G6sIclqvvc4/TyqNHBfpTFI/AAAAAAAABv4/nfauj-Syjzk/image18.png?imgmax=800" style="background-image: none; border-width: 0px; display: inline; margin: 0px 0px 10px 10px; padding-left: 0px; padding-right: 0px; padding-top: 0px;" title="SimpleChat" width="357" /&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h3&gt;


6. Punto extra: agrupación de clientes en SignalR&lt;/h3&gt;
Hasta ahora, hemos visto que &lt;strong&gt;al hacer un broadcast el mensaje es enviado a todos y cada uno de los clientes&lt;/strong&gt; que se encuentran en ese momento conectados al servicio. Esto es válido en muchos escenarios, pero hay otros en los que necesitamos algún mecanismo para segmentar o agrupar los clientes según determinados criterios.&lt;br /&gt;
&lt;br /&gt;
Un ejemplo clásico serían los chats reales, donde es habitual encontrar “salas”. Los mensajes enviados por un usuario concreto son vistos únicamente por los compañeros de la sala en la que se encuentra, por lo que podríamos considerar que se trata simplemente de un mecanismo de agrupación de usuarios.&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;SignalR incluye de serie mecanismos para añadir o eliminar usuarios (clientes) a grupos y enviar mensajes a éstos&lt;/strong&gt; de forma bastante sencilla, mediante los siguientes métodos de la clase &lt;code&gt;PersistentConnection &lt;/code&gt;(que, por cierto, también retornan un objeto de tipo &lt;code&gt;Task&lt;/code&gt;):&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;AddToGroup(string connectionId, string groupName)&lt;/code&gt;: agrega el cliente con el identificador &lt;code&gt;clientId&lt;/code&gt; al grupo denominado &lt;code&gt;groupName&lt;/code&gt;. &lt;/li&gt;
&lt;li&gt;&lt;code&gt;RemoveFromGroup(string connectionId, string groupName)&lt;/code&gt;: elimina el cliente &lt;code&gt;clientId&lt;/code&gt; del grupo identificado como &lt;code&gt;groupName&lt;/code&gt;. &lt;/li&gt;
&lt;li&gt;&lt;code&gt;SendToGroup(string groupName, object value)&lt;/code&gt;: envía el objeto &lt;code&gt;value&lt;/code&gt;, convenientemente serializado en JSON, a todos los clientes conectados al grupo &lt;code&gt;groupName&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
Fijaos que, de momento, el API es bastante simple en lo relativo a los grupos. Por ejemplo, no hay forma de vaciar un grupo, o de consultar los clientes pertenecientes a cada uno de ellos, aunque parece que está previsto &lt;a href="https://github.com/SignalR/SignalR/issues/66"&gt;ampliar las funcionalidades disponibles en futuras versiones&lt;/a&gt; del producto.&lt;br /&gt;
&lt;br /&gt;
De nuevo os animo a que &lt;strong&gt;&lt;a href="https://skydrive.live.com/redir.aspx?cid=c3a43a99b617d787&amp;amp;resid=C3A43A99B617D787!282&amp;amp;parid=C3A43A99B617D787!279&amp;amp;authkey=!APDvbyp4_CgAIQk"&gt;descarguéis el proyecto de demostración&lt;/a&gt;&lt;/strong&gt; y veáis SignalR en ejecución. Un framework que, sin duda, vale la pena conocer por la cantidad de escenarios en los que podemos utilizarlo y aportar ese factor “¡uau!” que comentaba al &lt;a href="http://www.variablenotfound.com/2012/01/introduccion-signalr-i-conceptos.html"&gt;principio de esta serie&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
Publicado en: &lt;a href="http://www.variablenotfound.com/"&gt;Variable not found&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/27752126-5668287942715440708?l=www.variablenotfound.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/DPT4sFE5P9-6YrQKsKKmzsNeEhI/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/DPT4sFE5P9-6YrQKsKKmzsNeEhI/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/DPT4sFE5P9-6YrQKsKKmzsNeEhI/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/DPT4sFE5P9-6YrQKsKKmzsNeEhI/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/vnf?a=u-_L0AhyA-I:DWRUpbn7oh4:ecdYMiMMAMM"&gt;&lt;img src="http://feeds.feedburner.com/~ff/vnf?d=ecdYMiMMAMM" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/vnf?a=u-_L0AhyA-I:DWRUpbn7oh4:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/vnf?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/vnf?a=u-_L0AhyA-I:DWRUpbn7oh4:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/vnf?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/vnf?a=u-_L0AhyA-I:DWRUpbn7oh4:4cEx4HpKnUU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/vnf?i=u-_L0AhyA-I:DWRUpbn7oh4:4cEx4HpKnUU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/vnf?a=u-_L0AhyA-I:DWRUpbn7oh4:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/vnf?i=u-_L0AhyA-I:DWRUpbn7oh4:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/vnf?a=u-_L0AhyA-I:DWRUpbn7oh4:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/vnf?i=u-_L0AhyA-I:DWRUpbn7oh4:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/vnf?a=u-_L0AhyA-I:DWRUpbn7oh4:I9og5sOYxJI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/vnf?d=I9og5sOYxJI" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/vnf/~4/u-_L0AhyA-I" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.variablenotfound.com/feeds/5668287942715440708/comments/default" title="Enviar comentarios" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=27752126&amp;postID=5668287942715440708" title="2 comentarios" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/27752126/posts/default/5668287942715440708?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/27752126/posts/default/5668287942715440708?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/vnf/~3/u-_L0AhyA-I/signalr-iii-mas-conexiones-persistentes.html" title="SignalR (III): Más Conexiones Persistentes" /><author><name>José M. Aguilar</name><uri>http://www.blogger.com/profile/11683750380776435448</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://3.bp.blogspot.com/_O9D62hXq-ng/S6Hfc0RM0YI/AAAAAAAABOg/bEEA3DZ7Uac/S220/fb1.png" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://lh4.ggpht.com/-ScJZ82L2Rg0/TzwQZn8xo-I/AAAAAAAABw8/ZxTDN4hSkEM/s72-c/image%25255B8%25255D.png?imgmax=800" height="72" width="72" /><thr:total>2</thr:total><feedburner:origLink>http://www.variablenotfound.com/2012/03/signalr-iii-mas-conexiones-persistentes.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A0UESH06eCp7ImA9WhVSFU4.&quot;"><id>tag:blogger.com,1999:blog-27752126.post-8572617189899759378</id><published>2012-03-12T09:00:00.000+01:00</published><updated>2012-03-12T09:00:09.310+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-03-12T09:00:09.310+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="enlaces" /><title>Enlaces interesantes 73</title><content type="html">&lt;a href="http://lh6.ggpht.com/-Z4cddyzX0l4/T1zkd1xugmI/AAAAAAAABzc/7vlcRtTDPVM/s1600-h/image7_thumb_thumb_thumb_thumb_thumb%25255B2%25255D.png"&gt;&lt;img align="right" alt="Enlaces interesantes" border="0" height="129" src="http://lh4.ggpht.com/-MRuCf0Vzj-w/T1zkfQBGoHI/AAAAAAAABzk/LmFv8isRv9o/image7_thumb_thumb_thumb_thumb_thumb.png?imgmax=800" style="background-image: none; border-width: 0px; display: inline; float: right; margin: 0px 0px 10px 10px; padding-left: 0px; padding-right: 0px; padding-top: 0px;" title="Enlaces interesantes" width="172" /&gt;&lt;/a&gt;Estos son los enlaces publicados en &lt;a href="http://www.facebook.com/variablenotfound"&gt;Variable not found en Facebook&lt;/a&gt; y &lt;a href="http://twitter.com/jmaguilar"&gt;Twitter&lt;/a&gt; del 7 al 11 de marzo de 2012, y algunos más que tenía pendientes desde antes del viaje a Seattle. Espero que os resulten interesantes :-)&lt;br /&gt;
&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;
&lt;h4&gt;
.Net&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://blackrabbitcoder.net/archive/2012/03/08/c.net-little-wonders-ndash-the-datetimeoffset-struct.aspx" title="Title of this entry"&gt;&lt;strong&gt;C#/.NET Little Wonders – The DateTimeOffset struct&lt;/strong&gt;&lt;/a&gt;       &lt;br /&gt;James Michael Hare &lt;/li&gt;
&lt;li&gt;&lt;a href="http://geekswithblogs.net/BlackRabbitCoder/archive/2012/02/16/c.net-little-wonders-the-sequenceequal-method.aspx"&gt;&lt;strong&gt;C#/.NET Little Wonders: The SequenceEqual() Method&lt;/strong&gt;&lt;/a&gt;       &lt;br /&gt;James Michael Hare &lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;
Asp.net&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="http://blog.michaelckennedy.net/2012/03/07/9-ways-your-brand-new-mvc-project-can-be-better/"&gt;9 Ways Your Brand New ASP.NET MVC Project Can Be Better&lt;/a&gt;&lt;/strong&gt;       &lt;br /&gt;Michael Kennedy &lt;/li&gt;
&lt;li&gt;&lt;a href="http://blog.michaelckennedy.net/2012/03/06/managing-shared-views-folder-for-large-mvc-projects/"&gt;&lt;strong&gt;Managing Cumbersome Shared Views Folder for Large Projects in MVC&lt;/strong&gt;&lt;/a&gt;       &lt;br /&gt;Michael Kennedy &lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.chrissurfleet.co.uk/post/2012/03/08/Simplify-Session-and-ViewState-Access-With-a-Helper-Method-and-Func.aspx"&gt;&lt;strong&gt;Simplify Session and ViewState Access With a Helper Method and Func&amp;lt;&amp;gt;&lt;/strong&gt;&lt;/a&gt;       &lt;br /&gt;Chris Surfleet &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="http://blogs.msdn.com/b/robert_mcmurray/archive/2012/03/05/microsoft-iis-8-0-express-beta-is-released.aspx"&gt;Microsoft IIS 8.0 Express Beta is Released!&lt;/a&gt;&lt;/strong&gt;       &lt;br /&gt;Robert McMurray &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="http://stephenwalther.com/blog/archive/2012/03/05/introduction-to-the-asp-net-web-api.aspx"&gt;Introduction to the ASP.NET Web API&lt;/a&gt;&lt;/strong&gt;       &lt;br /&gt;Stephen Walther &lt;/li&gt;
&lt;li&gt;&lt;a href="http://freshbrewedcode.com/joshbush/2012/03/05/mass-assignment-aspnet-mvc/"&gt;&lt;strong&gt;Mass Assignment Vulnerability in ASP.NET MVC&lt;/strong&gt;&lt;/a&gt;       &lt;br /&gt;Josh Bush &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="http://geeks.ms/blogs/unai/archive/2012/03/05/implementando-cors-en-asp-net-web-api.aspx"&gt;Implementando CORS en ASP.NET Web API&lt;/a&gt;&lt;/strong&gt;       &lt;br /&gt;Unai Zorrilla &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="http://www.sitepoint.com/asp-net-mvc-4-web-api/"&gt;ASP.NET MVC 4 – Web API&lt;/a&gt;&lt;/strong&gt;       &lt;br /&gt;Malcolm Sheridan &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="http://codebetter.com/johnpetersen/2012/03/06/asp-net-mvc-4-beta-bundling-and-minification-dymystified/"&gt;ASP.NET MVC 4 Beta – Bundling and Minification Dymystified&lt;/a&gt;&lt;/strong&gt;       &lt;br /&gt;John V. Petersen &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="http://www.devproconnections.com/article/aspnetmvc/aspnet-exception-141263"&gt;ASP.NET MVC Tutorial: Handling Errors and Exceptions&lt;/a&gt;&lt;/strong&gt;       &lt;br /&gt;Dino Esposito &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="http://madscortz.net/up-and-running-with-less-asp-net-mvc"&gt;Up and running with Less (ASP.NET MVC)&lt;/a&gt;&lt;/strong&gt;       &lt;br /&gt;Mads Cortz &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="http://blogs.msdn.com/b/carlosfigueira/archive/2012/02/20/implementing-cors-support-in-asp-net-web-apis.aspx"&gt;Implementing CORS support in ASP.NET Web APIs&lt;/a&gt;&lt;/strong&gt;       &lt;br /&gt;Carlos Figueira &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="http://blogs.msdn.com/b/henrikn/archive/2012/02/20/asp-net-web-api-and-httpclient-available-on-nuget.aspx"&gt;ASP.NET Web API and HttpClient Available on NuGet&lt;/a&gt;&lt;/strong&gt;       &lt;br /&gt;Henrik F Nielsen &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="http://blogs.msdn.com/b/carlosfigueira/archive/2012/02/16/introducing-asp-net-mvc-4-beta-with-web-apis.aspx"&gt;Introducing ASP.NET MVC 4 Beta with Web APIs&lt;/a&gt;&lt;/strong&gt;       &lt;br /&gt;Carlos Figueira &lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.pieterg.com/Post/CoffeeScriptCustomProcessorinASPNETMVC4Beta" title="CoffeeScript Custom Processor in ASP.NET MVC 4 Beta"&gt;&lt;strong&gt;CoffeeScript Custom Processor in ASP.NET MVC 4 Beta&lt;/strong&gt;&lt;/a&gt;       &lt;br /&gt;Pieter Germishuys &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="http://geeks.ms/blogs/etomas/archive/2012/02/19/explorando-asp-net-mvc4-webapi-3-formatos-de-salida.aspx"&gt;Explorando ASP.NET MVC4 WebAPI–3: Formatos de salida&lt;/a&gt;&lt;/strong&gt;       &lt;br /&gt;Eduard Tomás &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="http://weblogs.asp.net/scottgu/archive/2012/02/19/asp-net-mvc-4-beta.aspx"&gt;ASP.NET MVC 4 Beta&lt;/a&gt;&lt;/strong&gt;       &lt;br /&gt;Scott Guthrie       &lt;ul&gt;            &lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;
Azure / Cloud&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.returngis.net/2012/02/anadir-administradores-en-la-seccion-windows-azure-appfabric/" title="Permanent Link to Añadir administradores en la sección Windows Azure AppFabric"&gt;&lt;strong&gt;Añadir administradores en la sección Windows Azure AppFabric&lt;/strong&gt;&lt;/a&gt;       &lt;br /&gt;Gisela Torres &lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;
Conceptos&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="http://martinfowler.com/bliki/CQRS.html"&gt;CQRS&lt;/a&gt;         &lt;/strong&gt;Martin Fowler &lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;
Data access&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://coolthingoftheday.blogspot.com/2012/03/sql-server-2012-rtm-day-download-link.html" title="SQL Server 2012 RTM Day Download Link Round-up"&gt;&lt;strong&gt;SQL Server 2012 RTM Day Download Link Round-up&lt;/strong&gt;&lt;/a&gt;       &lt;br /&gt;Greg Duncan &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="http://www.davidhayden.me/blog/asp.net-mvc-4-and-entity-framework-database-migrations"&gt;MVC 4 and Entity Framework Database Migrations&lt;/a&gt;&lt;/strong&gt;       &lt;br /&gt;David Hayden &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="http://weblogs.asp.net/fredriknormen/archive/2012/02/15/using-entity-framework-4-3-database-migration-for-any-project.aspx"&gt;Using Entity Framework 4.3 Database migration for any project&lt;/a&gt;&lt;/strong&gt;       &lt;br /&gt;Fredrik Normén &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="http://thedatafarm.com/blog/data-access/using-ef-migrations-with-an-existing-database/"&gt;Using EF 4.3 Code First Migrations with an Existing Database&lt;/a&gt;&lt;/strong&gt;       &lt;br /&gt;Julie Lerman &lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;
Html/Css/Javascript&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.1stwebdesigner.com/design/css3-text-word-wrapping/"&gt;&lt;strong&gt;New CSS3 Properties For Better Text And Word Wrapping&lt;/strong&gt;&lt;/a&gt;       &lt;br /&gt;Christian Vasile &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="http://www.sitepoint.com/mastering-css3-7-cool-text-shadow-samples-you-can%e2%80%99t-miss/#fbid=W5O4_xQz2mT"&gt;Mastering CSS3: 7 Cool text-shadow Samples You Can’t Miss&lt;/a&gt;&lt;/strong&gt;       &lt;br /&gt;Konstantin Kichinsky (Vía @etnassoft) &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="http://jsmaker.com/jsmaker/"&gt;Editor visual de javascript&lt;/a&gt;&lt;/strong&gt;       &lt;br /&gt;Vía @etnassoft &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="http://www.joezimjs.com/javascript/3-simple-things-to-make-your-jquery-code-awesome/"&gt;3 Simple Things to Make Your jQuery Code Awesome&lt;/a&gt;&lt;/strong&gt;       &lt;br /&gt;Joe Zim &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="http://robertnyman.com/2012/03/08/using-the-fullscreen-api-in-web-browsers/"&gt;Using the Fullscreen API in web browsers&lt;/a&gt;&lt;/strong&gt;       &lt;br /&gt;Robert Nyman &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="http://css-tricks.com/thinking-async/"&gt;Thinking Async&lt;/a&gt;&lt;/strong&gt;       &lt;br /&gt;Chris Coyier &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="http://www.elijahmanor.com/2012/03/find-jquery-bug-5-defective-data.html"&gt;Find the jQuery Bug #5: Defective Data&lt;/a&gt;&lt;/strong&gt;       &lt;br /&gt;Elijah Manor &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="http://lostechies.com/derekgreer/2012/02/17/javascript-closures-explained/"&gt;JavaScript Closures Explained&lt;/a&gt;&lt;/strong&gt;       &lt;br /&gt;Derek Greer &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="http://www.kirupa.com/html5/viewport_device_document_size.htm"&gt;Viewport, Device, and Document Size&lt;/a&gt;&lt;/strong&gt;       &lt;br /&gt;Kirupa Chinnathambi &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="http://mathiasbynens.be/notes/css-without-html"&gt;Using CSS without HTML&lt;/a&gt;&lt;/strong&gt;       &lt;br /&gt;Mathias Bynens &lt;/li&gt;
&lt;li&gt;&lt;a href="http://addyosmani.com/resources/essentialjsdesignpatterns/book/"&gt;&lt;strong&gt;Essential JavaScript Design Patterns For Beginners&lt;/strong&gt;&lt;/a&gt;       &lt;br /&gt;Addy Osmani (vía @hhariri) &lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;
Visual Studio/Complementos&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="http://blogs.msdn.com/b/webdevtools/archive/2012/03/01/new-time-saving-features-for-web-projects-in-visual-studio-11-beta.aspx"&gt;New time saving features for Web projects in Visual Studio 11 Beta&lt;/a&gt;&lt;/strong&gt;       &lt;br /&gt;John Wen &lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;
Otros&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.udidahan.com/2012/03/05/dont-try-to-model-the-real-world-it-doesnt-exist/" title="Permanent Link- Don’t try to model the real world, it doesn’t exist"&gt;&lt;strong&gt;Don’t try to model the real world, it doesn’t exist&lt;/strong&gt;&lt;/a&gt;       &lt;br /&gt;Udi Dahan &lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.hanselman.com/blog/DarkMatterDevelopersTheUnseen99.aspx"&gt;&lt;strong&gt;Dark Matter Developers: The Unseen 99%&lt;/strong&gt;&lt;/a&gt;       &lt;br /&gt;Scott Hanselman &lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.returngis.net/2012/03/mapear-los-documentos-de-skydrive-en-windows-7/"&gt;&lt;strong&gt;Mapear los documentos de Skydrive en Windows 7&lt;/strong&gt;&lt;/a&gt;       &lt;br /&gt;Gisela Torres &lt;/li&gt;
&lt;/ul&gt;
Y no olvidéis que podéis seguir esta información en vivo y en directo desde &lt;a href="http://www.facebook.com/variablenotfound"&gt;Variable not found en Facebook&lt;/a&gt;, o a través de &lt;a href="http://twitter.com/jmaguilar"&gt;Twitter&lt;/a&gt;.     &lt;br /&gt;    &lt;br /&gt;Publicado en &lt;a href="http://www.variablenotfound.com/"&gt;Variable not found&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/27752126-8572617189899759378?l=www.variablenotfound.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/8ME9_0iodDbaYNTf-ulQ3UIjQLI/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/8ME9_0iodDbaYNTf-ulQ3UIjQLI/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/8ME9_0iodDbaYNTf-ulQ3UIjQLI/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/8ME9_0iodDbaYNTf-ulQ3UIjQLI/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/vnf?a=VK--g3IkPJM:T5pXVABDB5k:ecdYMiMMAMM"&gt;&lt;img src="http://feeds.feedburner.com/~ff/vnf?d=ecdYMiMMAMM" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/vnf?a=VK--g3IkPJM:T5pXVABDB5k:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/vnf?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/vnf?a=VK--g3IkPJM:T5pXVABDB5k:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/vnf?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/vnf?a=VK--g3IkPJM:T5pXVABDB5k:4cEx4HpKnUU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/vnf?i=VK--g3IkPJM:T5pXVABDB5k:4cEx4HpKnUU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/vnf?a=VK--g3IkPJM:T5pXVABDB5k:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/vnf?i=VK--g3IkPJM:T5pXVABDB5k:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/vnf?a=VK--g3IkPJM:T5pXVABDB5k:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/vnf?i=VK--g3IkPJM:T5pXVABDB5k:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/vnf?a=VK--g3IkPJM:T5pXVABDB5k:I9og5sOYxJI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/vnf?d=I9og5sOYxJI" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/vnf/~4/VK--g3IkPJM" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.variablenotfound.com/feeds/8572617189899759378/comments/default" title="Enviar comentarios" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=27752126&amp;postID=8572617189899759378" title="0 comentarios" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/27752126/posts/default/8572617189899759378?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/27752126/posts/default/8572617189899759378?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/vnf/~3/VK--g3IkPJM/enlaces-interesantes-73.html" title="Enlaces interesantes 73" /><author><name>José M. Aguilar</name><uri>http://www.blogger.com/profile/11683750380776435448</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://3.bp.blogspot.com/_O9D62hXq-ng/S6Hfc0RM0YI/AAAAAAAABOg/bEEA3DZ7Uac/S220/fb1.png" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://lh4.ggpht.com/-MRuCf0Vzj-w/T1zkfQBGoHI/AAAAAAAABzk/LmFv8isRv9o/s72-c/image7_thumb_thumb_thumb_thumb_thumb.png?imgmax=800" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://www.variablenotfound.com/2012/03/enlaces-interesantes-73.html</feedburner:origLink></entry></feed>

