<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://geeks.ms/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>Variable not found en Geeks.ms : consultas</title><link>http://geeks.ms/blogs/jmaguilar/archive/tags/consultas/default.aspx</link><description>Etiquetas: consultas</description><dc:language /><generator>CommunityServer 2008.5 SP1 (Build: 31106.3070)</generator><item><title>Establecer el foco automáticamente, versión declarativa</title><link>http://geeks.ms/blogs/jmaguilar/archive/2012/01/18/establecer-el-foco-autom-225-ticamente-versi-243-n-declarativa.aspx</link><pubDate>Wed, 18 Jan 2012 08:48:00 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:202771</guid><dc:creator>José M. Aguilar</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/jmaguilar/rsscomments.aspx?PostID=202771</wfw:commentRss><comments>http://geeks.ms/blogs/jmaguilar/archive/2012/01/18/establecer-el-foco-autom-225-ticamente-versi-243-n-declarativa.aspx#comments</comments><description>Hace poco escrib&amp;iacute;a un post en el que mostraba c&amp;oacute;mo se pod&amp;iacute;a conseguir establecer el foco inicialmente en un control de edici&amp;oacute;n , algo que era posible con Webforms pero no directamente con las herramientas que ASP.NET MVC trae de f&amp;aacute;brica. La soluci&amp;oacute;n propuesta consist&amp;iacute;a en introducir en la vista c&amp;oacute;digo de script para desplazar el foco hasta el control indicado mediante una llamada al helper Html.SetFocusTo() , que implement&amp;aacute;bamos en el...(&lt;a href="http://geeks.ms/blogs/jmaguilar/archive/2012/01/18/establecer-el-foco-autom-225-ticamente-versi-243-n-declarativa.aspx"&gt;read more&lt;/a&gt;)&lt;img src="http://geeks.ms/aggbug.aspx?PostID=202771" width="1" height="1"&gt;</description><category domain="http://geeks.ms/blogs/jmaguilar/archive/tags/desarrollo/default.aspx">desarrollo</category><category domain="http://geeks.ms/blogs/jmaguilar/archive/tags/trucos/default.aspx">trucos</category><category domain="http://geeks.ms/blogs/jmaguilar/archive/tags/consultas/default.aspx">consultas</category><category domain="http://geeks.ms/blogs/jmaguilar/archive/tags/aspnetmvc/default.aspx">aspnetmvc</category></item><item><title>ASP.NET MVC: WebGrid con filtro, paginación y ordenación</title><link>http://geeks.ms/blogs/jmaguilar/archive/2011/10/26/asp-net-mvc-webgrid-con-filtro-paginaci-243-n-y-ordenaci-243-n.aspx</link><pubDate>Wed, 26 Oct 2011 07:28:00 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:201330</guid><dc:creator>José M. Aguilar</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/jmaguilar/rsscomments.aspx?PostID=201330</wfw:commentRss><comments>http://geeks.ms/blogs/jmaguilar/archive/2011/10/26/asp-net-mvc-webgrid-con-filtro-paginaci-243-n-y-ordenaci-243-n.aspx#comments</comments><description>Hace unos d&amp;iacute;as, el amigo Cadavid realizaba una consulta en los comentarios de la serie de posts que escrib&amp;iacute; hace unos meses sobre el helper Webgrid , sobre c&amp;oacute;mo pod&amp;iacute;amos implementar filtros personalizados sobre los datos mostrados, y dado que no es algo que se pueda explicar en un simple comentario, me compromet&amp;iacute; a escribir un post sobre el tema, as&amp;iacute; que ah&amp;iacute; va. El problema fundamental es que WebGrid no incorpora ning&amp;uacute;n tipo de ayuda para realizar...(&lt;a href="http://geeks.ms/blogs/jmaguilar/archive/2011/10/26/asp-net-mvc-webgrid-con-filtro-paginaci-243-n-y-ordenaci-243-n.aspx"&gt;read more&lt;/a&gt;)&lt;img src="http://geeks.ms/aggbug.aspx?PostID=201330" width="1" height="1"&gt;</description><category domain="http://geeks.ms/blogs/jmaguilar/archive/tags/desarrollo/default.aspx">desarrollo</category><category domain="http://geeks.ms/blogs/jmaguilar/archive/tags/consultas/default.aspx">consultas</category><category domain="http://geeks.ms/blogs/jmaguilar/archive/tags/aspnetmvc/default.aspx">aspnetmvc</category><category domain="http://geeks.ms/blogs/jmaguilar/archive/tags/webgrid/default.aspx">webgrid</category></item><item><title>Referenciar scripts, estilos y otros recursos desde vistas MVC</title><link>http://geeks.ms/blogs/jmaguilar/archive/2010/10/05/referenciar-scripts-estilos-y-otros-recursos-desde-vistas-mvc.aspx</link><pubDate>Tue, 05 Oct 2010 21:45:00 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:182878</guid><dc:creator>José M. Aguilar</dc:creator><slash:comments>1</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/jmaguilar/rsscomments.aspx?PostID=182878</wfw:commentRss><comments>http://geeks.ms/blogs/jmaguilar/archive/2010/10/05/referenciar-scripts-estilos-y-otros-recursos-desde-vistas-mvc.aspx#comments</comments><description>Una cuesti&amp;oacute;n que consultan frecuentemente los alumnos del curso de MVC que tutorizo en CampusMVP , y que veo en los foros oficiales del framework trata sobre el uso correcto de rutas hacia recursos utilizados por las p&amp;aacute;ginas, como scripts, estilos o im&amp;aacute;genes. Unas referencias err&amp;oacute;neas hacia las p&amp;aacute;ginas de estilo o im&amp;aacute;genes pueden hacer que un sitio web, o parte de &amp;eacute;ste, deje de visualizarse correctamente; en el tema de scripts es m&amp;aacute;s grave pues...(&lt;a href="http://geeks.ms/blogs/jmaguilar/archive/2010/10/05/referenciar-scripts-estilos-y-otros-recursos-desde-vistas-mvc.aspx"&gt;read more&lt;/a&gt;)&lt;img src="http://geeks.ms/aggbug.aspx?PostID=182878" width="1" height="1"&gt;</description><category domain="http://geeks.ms/blogs/jmaguilar/archive/tags/desarrollo/default.aspx">desarrollo</category><category domain="http://geeks.ms/blogs/jmaguilar/archive/tags/trucos/default.aspx">trucos</category><category domain="http://geeks.ms/blogs/jmaguilar/archive/tags/asp.net/default.aspx">asp.net</category><category domain="http://geeks.ms/blogs/jmaguilar/archive/tags/consultas/default.aspx">consultas</category><category domain="http://geeks.ms/blogs/jmaguilar/archive/tags/aspnetmvc/default.aspx">aspnetmvc</category></item><item><title>ASP.NET MVC 2: Quince cuestiones que deberías conocer</title><link>http://geeks.ms/blogs/jmaguilar/archive/2010/05/26/asp-net-mvc-2-quince-cuestiones-que-deber-237-as-conocer.aspx</link><pubDate>Wed, 26 May 2010 18:21:00 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:177352</guid><dc:creator>José M. Aguilar</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/jmaguilar/rsscomments.aspx?PostID=177352</wfw:commentRss><comments>http://geeks.ms/blogs/jmaguilar/archive/2010/05/26/asp-net-mvc-2-quince-cuestiones-que-deber-237-as-conocer.aspx#comments</comments><description>En marzo de 2008 publiqu&amp;eacute; un megapost en el que se recog&amp;iacute;an respuestas a diez preguntas b&amp;aacute;sicas sobre el framework ASP.NET MVC , que por aquellos entonces se encontraba todav&amp;iacute;a en una versi&amp;oacute;n muy preliminar, la Preview 2. M&amp;aacute;s de un a&amp;ntilde;o despu&amp;eacute;s, coincidiendo con el lanzamiento de la versi&amp;oacute;n 1.0, actualic&amp;eacute; el contenido y las preguntas conforme a la evoluci&amp;oacute;n de los desarrollos y a lo que hab&amp;iacute;a podido profundizar en...(&lt;a href="http://geeks.ms/blogs/jmaguilar/archive/2010/05/26/asp-net-mvc-2-quince-cuestiones-que-deber-237-as-conocer.aspx"&gt;read more&lt;/a&gt;)&lt;img src="http://geeks.ms/aggbug.aspx?PostID=177352" width="1" height="1"&gt;</description><category domain="http://geeks.ms/blogs/jmaguilar/archive/tags/desarrollo/default.aspx">desarrollo</category><category domain="http://geeks.ms/blogs/jmaguilar/archive/tags/programaci_26002300_243_3B00_n/default.aspx">programaci&amp;#243;n</category><category domain="http://geeks.ms/blogs/jmaguilar/archive/tags/asp.net/default.aspx">asp.net</category><category domain="http://geeks.ms/blogs/jmaguilar/archive/tags/consultas/default.aspx">consultas</category><category domain="http://geeks.ms/blogs/jmaguilar/archive/tags/aspnetmvc/default.aspx">aspnetmvc</category></item><item><title>¿ActionLink te genera direcciones que acaban en Length=N?</title><link>http://geeks.ms/blogs/jmaguilar/archive/2010/04/06/191-actionlink-te-genera-direcciones-que-acaban-en-length-n.aspx</link><pubDate>Tue, 06 Apr 2010 14:28:00 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:173954</guid><dc:creator>José M. Aguilar</dc:creator><slash:comments>2</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/jmaguilar/rsscomments.aspx?PostID=173954</wfw:commentRss><comments>http://geeks.ms/blogs/jmaguilar/archive/2010/04/06/191-actionlink-te-genera-direcciones-que-acaban-en-length-n.aspx#comments</comments><description>Esta es una respuesta r&amp;aacute;pida a una cuesti&amp;oacute;n de Fred C., que me llega v&amp;iacute;a formulario de contacto en Variable not found , sobre un problemilla que tambi&amp;eacute;n sufr&amp;iacute; en algunas ocasiones, y he pensado que posiblemente pueda interesarle a alguien m&amp;aacute;s, as&amp;iacute; que ah&amp;iacute; va. El escenario es el siguiente: tenemos en una vista un c&amp;oacute;digo para generar un enlace hacia una acci&amp;oacute;n, como el mostrado a continuaci&amp;oacute;n: &amp;lt;%= Html.ActionLink( &amp;quot;Acceso...(&lt;a href="http://geeks.ms/blogs/jmaguilar/archive/2010/04/06/191-actionlink-te-genera-direcciones-que-acaban-en-length-n.aspx"&gt;read more&lt;/a&gt;)&lt;img src="http://geeks.ms/aggbug.aspx?PostID=173954" width="1" height="1"&gt;</description><category domain="http://geeks.ms/blogs/jmaguilar/archive/tags/trucos/default.aspx">trucos</category><category domain="http://geeks.ms/blogs/jmaguilar/archive/tags/consultas/default.aspx">consultas</category><category domain="http://geeks.ms/blogs/jmaguilar/archive/tags/aspnetmvc/default.aspx">aspnetmvc</category></item><item><title>ASP.NET MVC: trece preguntas básicas</title><link>http://geeks.ms/blogs/jmaguilar/archive/2009/05/05/asp-net-mvc-trece-preguntas-b-225-sicas.aspx</link><pubDate>Tue, 05 May 2009 21:46:00 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:148029</guid><dc:creator>José M. Aguilar</dc:creator><slash:comments>10</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/jmaguilar/rsscomments.aspx?PostID=148029</wfw:commentRss><comments>http://geeks.ms/blogs/jmaguilar/archive/2009/05/05/asp-net-mvc-trece-preguntas-b-225-sicas.aspx#comments</comments><description>&lt;div class="post-body entry-content"&gt;
&lt;div class="post-header-line-1"&gt;&lt;/div&gt;
&lt;div class="post-body entry-content"&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;img height="199" width="244" src="http://lh6.ggpht.com/_O9D62hXq-ng/SetPkqG0LBI/AAAAAAAABBQ/pO2BP-LO6Nk/image9.png?imgmax=800" align="right" alt="10 Preguntas con respuesta ASP.NET MVC" border="0" title="10 Preguntas con respuesta ASP.NET MVC" style="margin:0px 0px 5px 5px;display:inline;border-width:0px;" /&gt; En marzo de 2008 publiqu&amp;eacute; un post en el que se recog&amp;iacute;an respuestas a diez preguntas b&amp;aacute;sicas sobre el framework ASP.NET MVC, que por aquellos entonces se encontraba todav&amp;iacute;a en una versi&amp;oacute;n muy preliminar, la Preview 2. &lt;/p&gt;
&lt;p&gt;M&amp;aacute;s de un a&amp;ntilde;o despu&amp;eacute;s, coincidiendo con el reciente lanzamiento de la versi&amp;oacute;n 1.0, voy a actualizar el contenido y las preguntas conforme a la evoluci&amp;oacute;n de los desarrollos y a lo que he podido profundizar en el tema desde entonces.&lt;/p&gt;
&lt;p&gt;Las cuestiones que tratar&amp;eacute; son las siguientes:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a&gt;&lt;span style="color:#35537a;"&gt;Empecemos desde el principio, &amp;iquest;qu&amp;eacute; es MVC?&lt;/span&gt;&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;&lt;a&gt;&lt;span style="color:#35537a;"&gt;&amp;iquest;Qu&amp;eacute; ventajas tiene el uso del patr&amp;oacute;n MVC?&lt;/span&gt;&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;&lt;a&gt;&lt;span style="color:#35537a;"&gt;&amp;iquest;Qu&amp;eacute; es ASP.NET MVC framework?&lt;/span&gt;&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;&lt;a&gt;&lt;span style="color:#35537a;"&gt;&amp;iquest;Es el primer framework MVC creado para .NET?&lt;/span&gt;&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;&lt;a&gt;&lt;span style="color:#35537a;"&gt;Como desarrollador de aplicaciones web con ASP.NET, &amp;iquest;me afectar&amp;aacute; la llegada de este framework?&lt;/span&gt;&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;&lt;a&gt;&lt;span style="color:#35537a;"&gt;Entonces, &amp;iquest;no significa la aparici&amp;oacute;n del framework MVC la muerte pr&amp;oacute;xima de los Webforms de ASP.NET?&lt;/span&gt;&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;&lt;a&gt;&lt;span style="color:#35537a;"&gt;&amp;iquest;Vale la pena pasarse a ASP.NET MVC o sigo usando Webforms?&lt;/span&gt;&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;&lt;a&gt;&lt;span style="color:#35537a;"&gt;&amp;iquest;Puedo convertir mi proyecto ASP.NET Webforms a ASP.NET MVC?&lt;/span&gt;&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;&lt;a&gt;&lt;span style="color:#35537a;"&gt;&amp;iquest;Se puede utilizar ASP.NET Ajax con el framework MVC?&lt;/span&gt;&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;&lt;a&gt;&lt;span style="color:#35537a;"&gt;&amp;iquest;Se puede utilizar VB.NET con ASP.NET MVC?&lt;/span&gt;&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;&lt;a&gt;&lt;span style="color:#35537a;"&gt;&amp;iquest;Puedo usar LINQ desarrollando aplicaciones con ASP.NET MVC framework?&lt;/span&gt;&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;&lt;a&gt;&lt;span style="color:#35537a;"&gt;&amp;iquest;Qu&amp;eacute; tipo de tecnolog&amp;iacute;as puedo utilizar en las vistas?&lt;/span&gt;&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;&lt;a&gt;&lt;span style="color:#35537a;"&gt;&amp;iquest;Es ASP.NET MVC framework software libre?&lt;/span&gt;&lt;/a&gt; &lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="p1"&gt;1. Empecemos desde el principio, &amp;iquest;qu&amp;eacute; es MVC?&lt;/h3&gt;
Aunque de forma algo simplista, podr&amp;iacute;amos definir MVC como un patr&amp;oacute;n arquitectural que describe una forma de desarrollar aplicaciones software separando los componentes en tres grupos (o capas): 
&lt;ul&gt;
&lt;li&gt;El &lt;strong&gt;Modelo&lt;/strong&gt; que contiene una representaci&amp;oacute;n de los datos que maneja el sistema, su l&amp;oacute;gica de negocio, y sus mecanismos de persistencia. &lt;/li&gt;
&lt;li&gt;La &lt;strong&gt;Vista&lt;/strong&gt;, o interfaz de usuario, que compone la informaci&amp;oacute;n que se env&amp;iacute;a al cliente y los mecanismos interacci&amp;oacute;n con &amp;eacute;ste. &lt;/li&gt;
&lt;li&gt;El &lt;strong&gt;Controlador&lt;/strong&gt;, que act&amp;uacute;a como intermediario entre el Modelo y la Vista, gestionando el flujo de informaci&amp;oacute;n entre ellos y las transformaciones para adaptar los datos a las necesidades de cada uno. &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;MVC&lt;/strong&gt; son las siglas de Modelo-Vista-Controlador, y se trata de un modelo muy maduro y que ha demostrado su validez a lo largo de los a&amp;ntilde;os en todo tipo de aplicaciones, y sobre multitud de lenguajes y plataformas de desarrollo.&lt;/p&gt;
&lt;p&gt;Puedes encontrar m&amp;aacute;s informaci&amp;oacute;n en: &lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://es.wikipedia.org/wiki/Modelo_Vista_Controlador"&gt;&lt;span style="color:#35537a;"&gt;Wikipedia, Modelo-Vista-Controlador&lt;/span&gt;&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;&lt;a href="http://heim.ifi.uio.no/~trygver/themes/mvc/mvc-index.html"&gt;&lt;span style="color:#35537a;"&gt;Documentos originales de definici&amp;oacute;n de MVC, de Trygve M. H. Reenskaug, en Xerox (&amp;iexcl;a&amp;ntilde;o 1978!)&lt;/span&gt;&lt;/a&gt;&lt;a hreflang="en" href="http://heim.ifi.uio.no/~trygver/themes/mvc/mvc-index.html"&gt;&amp;nbsp;&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.ulpgc.es/otros/tutoriales/java/Apendice/arq_mvc.html"&gt;&lt;span style="color:#35537a;"&gt;Tutorial de Java, Arquitectura MVC&lt;/span&gt;&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;&lt;a hreflang="en" href="http://msdn2.microsoft.com/en-us/library/ms978748.aspx"&gt;Model-View-Controller Web presentation pattern en MSDN&lt;/a&gt; &lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="p2"&gt;2. &amp;iquest;Qu&amp;eacute; ventajas tiene el uso del patr&amp;oacute;n MVC?&lt;/h3&gt;
Como siempre, esto de enumerar ventajas es algo subjetivo, por lo que puede que pienses que falta o sobra alguna &lt;em&gt;(&amp;iexcl;&lt;a target="_blank" href="http://kontactr.com/user/jmaguilar" title="&amp;iquest;alguna ventaja o inconveniente adicional del patr&amp;oacute;n MVC?"&gt;&lt;span style="color:#35537a;"&gt;d&amp;iacute;melo&lt;/span&gt;&lt;/a&gt;!)&lt;/em&gt;. En un primer asalto podr&amp;iacute;amos aportar las siguientes: 
&lt;ul&gt;
&lt;li&gt;Clara separaci&amp;oacute;n entre interfaz, l&amp;oacute;gica de negocio y de presentaci&amp;oacute;n, que adem&amp;aacute;s provoca parte de las ventajas siguientes. &lt;/li&gt;
&lt;li&gt;Sencillez para crear distintas representaciones de los mismos datos. &lt;/li&gt;
&lt;li&gt;Facilidad para la realizaci&amp;oacute;n de pruebas unitarias de los componentes, as&amp;iacute; como de aplicar &lt;a href="http://es.wikipedia.org/wiki/Tdd"&gt;&lt;span style="color:#35537a;"&gt;desarrollo guiado por pruebas (&lt;acronym&gt;TDD&lt;/acronym&gt;)&lt;/span&gt;&lt;/a&gt;. &lt;/li&gt;
&lt;li&gt;Reutilizaci&amp;oacute;n de los componentes. &lt;/li&gt;
&lt;li&gt;Simplicidad en el mantenimiento de los sistemas. &lt;/li&gt;
&lt;li&gt;Facilidad para desarrollar prototipos r&amp;aacute;pidos. &lt;/li&gt;
&lt;li&gt;Los desarrollos suelen ser m&amp;aacute;s escalables. &lt;/li&gt;
&lt;/ul&gt;
Pero bueno, tambi&amp;eacute;n se pueden citar algunos inconvenientes: 
&lt;ul&gt;
&lt;li&gt;Tener que ce&amp;ntilde;irse a una estructura predefinida, lo que a veces puede incrementar la complejidad del sistema. Hay problemas que son m&amp;aacute;s dif&amp;iacute;ciles de resolver respetando el patr&amp;oacute;n MVC. &lt;/li&gt;
&lt;li&gt;La curva de aprendizaje para los nuevos desarrolladores se estima mayor que la de modelos m&amp;aacute;s simples como Webforms. &lt;/li&gt;
&lt;li&gt;La distribuci&amp;oacute;n de componentes obliga a crear y mantener un mayor n&amp;uacute;mero de ficheros. &lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="p3"&gt;3. &amp;iquest;Qu&amp;eacute; es ASP.NET MVC Framework?&lt;/h3&gt;
&lt;p&gt;&lt;img height="187" width="244" src="http://lh6.ggpht.com/_O9D62hXq-ng/SetPlffhMJI/AAAAAAAABBU/gO6lUo1AHso/image8.png?imgmax=800" align="right" alt="Plantilla de aplicaci&amp;oacute;n ASP.NET MVC" border="0" title="Plantilla de aplicaci&amp;oacute;n ASP.NET MVC" style="margin:0px 0px 5px 5px;display:inline;border-width:0px;" /&gt; Es un framework, un entorno de trabajo cuya primera versi&amp;oacute;n acaba de ver la luz, creado por Microsoft con objeto de ayudarnos a desarrollar aplicaciones que sigan la filosof&amp;iacute;a MVC sobre ASP.NET.&lt;/p&gt;
&lt;p&gt;Adem&amp;aacute;s del conjunto de librer&amp;iacute;as (ensamblados) que proporcionan las nuevas funcionalidades a nivel de API, incluye plantillas y herramientas que se integran en Visual Studio 2008 (tanto en la versi&amp;oacute;n Express de Visual Web Developer como en sus hermanas mayores) para facilitarnos un poco las cosas.&lt;/p&gt;
&lt;p&gt;Una vez instalado el marco de trabajo (&lt;a target="_blank" href="http://www.microsoft.com/downloads/details.aspx?FamilyID=53289097-73ce-43bf-b6a6-35e00103cb4b" title="Descargar ASP.NET MVC"&gt;&lt;span style="color:#35537a;"&gt;que puedes iniciar desde aqu&amp;iacute;&lt;/span&gt;&lt;/a&gt; o desde el &lt;a target="_blank" href="http://www.microsoft.com/Web/downloads/platform.aspx" title="Web Platform Installer"&gt;&lt;span style="color:#35537a;"&gt;Web Platform Installer&lt;/span&gt;&lt;/a&gt;), Visual Studio mostrar&amp;aacute; un nuevo tipo de proyecto (&lt;em&gt;ASP.NET MVC Web Application&lt;/em&gt;) que nos permitir&amp;aacute; crear el esqueleto b&amp;aacute;sico de un proyecto de este tipo. Y ya para cuando estemos en faena, el entorno ofrece multitud de utilidades para hacer nuestro trabajo m&amp;aacute;s f&amp;aacute;cil, como la herramienta de creaci&amp;oacute;n de vistas autom&amp;aacute;ticas, el desplazamiento entre controladores y vistas, o plantillas para la definici&amp;oacute;n de controladores, entre otras.&lt;/p&gt;
&lt;h3 id="p4"&gt;4. &amp;iquest;Es el primer framework MVC creado para .NET?&lt;/h3&gt;
&lt;p&gt;No, ni el &amp;uacute;nico. Existen multitud de frameworks MVC para ASP.Net, como &lt;a href="http://www.castleproject.org/monorail/index.html"&gt;&lt;span style="color:#35537a;"&gt;MonoRail&lt;/span&gt;&lt;/a&gt;, &lt;a href="http://mavnet.sourceforge.net/"&gt;&lt;span style="color:#35537a;"&gt;Maverick.Net&lt;/span&gt;&lt;/a&gt;, &lt;a href="http://www.codeplex.com/ProMesh"&gt;&lt;span style="color:#35537a;"&gt;ProMesh.Net&lt;/span&gt;&lt;/a&gt; y muchos otros.&lt;/p&gt;
&lt;h3 id="p5"&gt;5. Como desarrollador de aplicaciones web con ASP.NET, &amp;iquest;me afectar&amp;aacute; la llegada de este framework?&lt;/h3&gt;
&lt;p&gt;No necesariamente. Puedes seguir desarrollando aplicaciones como hasta ahora, con Webforms. Si as&amp;iacute; lo decides, este nuevo framework no te afectar&amp;aacute; nada; simplemente, ign&amp;oacute;ralo.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;De todas formas, ya que has le&amp;iacute;do hasta aqu&amp;iacute;, perm&amp;iacute;teme un consejo: aprende a utilizar ASP.NET MVC framework. Despu&amp;eacute;s podr&amp;aacute;s decidir con conocimiento de causa si te conviene o no.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id="p6"&gt;6. Entonces, &amp;iquest;no significa la aparici&amp;oacute;n del framework MVC la muerte pr&amp;oacute;xima de los Webforms de ASP.NET?&lt;/h3&gt;
&lt;p&gt;&lt;img height="190" width="244" src="http://lh3.ggpht.com/_O9D62hXq-ng/SetPmELDrYI/AAAAAAAABBY/pRjZ30TRf3A/image12.png?imgmax=800" align="right" alt="Dise&amp;ntilde;ador de Webforms" border="0" title="Dise&amp;ntilde;ador de Webforms" style="margin:0px 0px 5px 5px;display:inline;border-width:0px;" /&gt; En absoluto. Son simplemente dos filosof&amp;iacute;as diferentes para conseguir lo mismo, &amp;iexcl;p&amp;aacute;ginas web!&lt;/p&gt;
&lt;p&gt;La tecnolog&amp;iacute;a de Webforms es muy &amp;uacute;til para asemejar el desarrollo de aplicaciones web a las de escritorio, ocultando la complejidad derivada del entorno desconectado y &lt;em&gt;stateless&lt;/em&gt; (sin conservaci&amp;oacute;n de estado) del protocolo HTTP a base de complejos &lt;em&gt;roundtrips&lt;/em&gt;, &lt;em&gt;postbacks&lt;/em&gt; y &lt;em&gt;viewstates&lt;/em&gt;, lo que nos permite crear de forma muy productiva formularios impresionantes y que el funcionamiento de nuestra aplicaci&amp;oacute;n est&amp;eacute; guiado por eventos, como si estuvi&amp;eacute;ramos programando Winforms.&lt;/p&gt;
&lt;p&gt;Sin embargo, esta misma potencia a veces hace que las p&amp;aacute;ginas sean pesadas y dif&amp;iacute;cilmente mantenibles, adem&amp;aacute;s de dificultar enormemente la realizaci&amp;oacute;n de pruebas automatizadas. Y por no hablar de comportamientos extra&amp;ntilde;os cuando intentamos intervenir en el ciclo de vida de las p&amp;aacute;ginas, por ejemplo para la carga y descarga de controles din&amp;aacute;micos.&lt;/p&gt;
&lt;p&gt;ASP.NET MVC propone una forma distinta de trabajar, m&amp;aacute;s cercana a la realidad del protocolo y, curiosamente, m&amp;aacute;s parecida a c&amp;oacute;mo se hac&amp;iacute;a unos a&amp;ntilde;os atr&amp;aacute;s, cuando control&amp;aacute;bamos cada byte que se enviaba al cliente o se recib&amp;iacute;a de &amp;eacute;ste. No existen, por tanto, conceptos como el mantenimiento del estado en el &lt;em&gt;viewstate&lt;/em&gt;, ni el &lt;em&gt;postback&lt;/em&gt;, ni nos valdr&amp;aacute;n los controles de servidor basados en estas caracter&amp;iacute;sticas, que son la mayor&amp;iacute;a. Sin embargo, dado que el framework est&amp;aacute; creado sobre ASP.NET, ser&amp;aacute; posible utilizar p&amp;aacute;ginas maestras, codificar las vistas en un .aspx utilizando C# o VB.NET, usar los mecanismos de seguridad internos, control de cach&amp;eacute;, gesti&amp;oacute;n de sesiones, localizaci&amp;oacute;n, etc.&lt;/p&gt;
&lt;h3 id="p7"&gt;7. &amp;iquest;Vale la pena pasarse a ASP.NET MVC o sigo usando Webforms?&lt;/h3&gt;
&lt;p&gt;En mi opini&amp;oacute;n, probablemente no se trate de decidirse por una u otra tecnolog&amp;iacute;a, sino de conocer ambas y utilizar la m&amp;aacute;s apropiada en cada momento. Hay muchos aspectos a tener en cuenta, por citar algunos:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a&gt;&lt;span style="color:#35537a;"&gt;los conocimientos y experiencia del equipo de desarrollo&lt;/span&gt;&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;&lt;a&gt;&lt;span style="color:#35537a;"&gt;la necesidad de usar controles o sistemas preexistentes&lt;/span&gt;&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;&lt;a&gt;&lt;span style="color:#35537a;"&gt;la madurez del framework&lt;/span&gt;&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;&lt;a&gt;&lt;span style="color:#35537a;"&gt;el futuro de la tecnolog&amp;iacute;a&lt;/span&gt;&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;&lt;a&gt;&lt;span style="color:#35537a;"&gt;la importancia de ventajas propias de MVC&lt;/span&gt;&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;&lt;a&gt;&lt;span style="color:#35537a;"&gt;el tipo de sistema que se pretende construir&lt;/span&gt;&lt;/a&gt; &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Vamos a reflexionar sobre cada uno de estos puntos, y la decisi&amp;oacute;n os la dejo a vosotros. ;-)&lt;/p&gt;
&lt;h4 id="xequipo"&gt;El equipo de desarrollo&lt;/h4&gt;
&lt;p&gt;&lt;img height="154" width="229" src="http://lh4.ggpht.com/_O9D62hXq-ng/SetPnvCSgTI/AAAAAAAABBc/tuCTGRIKU8c/image131.png?imgmax=800" align="right" alt="image" border="0" title="image" style="margin:0px 0px 5px 5px;display:inline;border-width:0px;" /&gt;&lt;/p&gt;
&lt;p&gt;La tecnolog&amp;iacute;a de formularios web (Webforms) permite el desarrollo r&amp;aacute;pido de aplicaciones (RAD) a trav&amp;eacute;s de dise&amp;ntilde;adores visuales con los que es posible componer una p&amp;aacute;gina compleja y definir el comportamiento del interfaz a golpe de rat&amp;oacute;n, puesto que el framework se encarga de realizar parte del trabajo duro, como el mantenimiento del estado entre peticiones, convertir propiedades de controles en c&amp;oacute;digo HTML y CSS, o incluso generar scripts que realicen determinadas tareas en cliente. De hecho, siguiendo este modelo es posible crear aplicaciones para Internet sin tener apenas idea de las particularidades inherentes al desarrollo web, lo que permite que muchos programadores procedentes del mundo del escritorio puedan ser productivos muy r&amp;aacute;pidamente, aunque sea a costa de generar p&amp;aacute;ginas mucho m&amp;aacute;s pesadas y con un c&amp;oacute;digo de marcado complejo.&lt;/p&gt;
&lt;p&gt;No hay que olvidar que para determinado tipo de aplicaciones, los Webforms son una buena opci&amp;oacute;n, tanto como lo han sido hasta ahora. Por tanto, si el equipo de desarrollo tiene ya experiencia creando aplicaciones con esta tecnolog&amp;iacute;a y no poseen grandes conocimientos sobre programaci&amp;oacute;n web de m&amp;aacute;s bajo nivel ni experiencia previa trabajando con el patr&amp;oacute;n MVC, deber&amp;iacute;amos pens&amp;aacute;rnoslo antes de dar el salto a ASP.NET MVC, puesto que la productividad, al menos inicialmente, va a caer.&lt;/p&gt;
&lt;p&gt;ASP.NET MVC requiere un conocimiento m&amp;aacute;s profundo del entorno web y sus tecnolog&amp;iacute;as subyacentes, puesto que a la vez que ofrece un control mucho m&amp;aacute;s riguroso sobre los datos que se env&amp;iacute;an y reciben desde el cliente, exige una mayor responsabilidad por parte del desarrollador, ya que deber&amp;aacute; encargarse &amp;eacute;l mismo de mantener el estado entre peticiones, maquetar las vistas, crear las hojas de estilo apropiadas, e incluso los scripts. Esto, sin embargo, no difiere mucho de la forma de trabajar unos a&amp;ntilde;os atr&amp;aacute;s, y es posible que en el equipo de trabajo haya desarrolladores experimentados que se sientan incluso m&amp;aacute;s c&amp;oacute;modos trabajando a este nivel que utilizando abstracciones como las provistas por ASP.NET Webforms.&lt;/p&gt;
&lt;h4 id="xcontroles"&gt;Controles y m&amp;oacute;dulos reutilizables&lt;/h4&gt;
&lt;p&gt;Otro aspecto a valorar antes de dar el salto a ASP.NET MVC es que existe una alt&amp;iacute;sima probabilidad de que no podamos utilizar sistemas o componentes que hayamos desarrollado previamente, lo cual redundar&amp;aacute; en los tiempos de desarrollo y productividad del equipo de trabajo. No nos valdr&amp;aacute;n los controles de servidor, ni las plantillas de proyectos, ni los generadores de c&amp;oacute;digo, y en muchos casos ni siquiera la &lt;em&gt;herencia de editor&lt;/em&gt; (que por muy &lt;a href="http://www.variablenotfound.com/2008/02/ojo-los-antipatrones.html" title="Ojo a los antipatrones"&gt;&lt;span style="color:#35537a;"&gt;antipatr&amp;oacute;n&lt;/span&gt;&lt;/a&gt; que sea seguro que acostumbramos a utilizar).&lt;/p&gt;
&lt;p&gt;Probablemente en breve dispondremos de componentes para ASP.NET MVC generados por la propia comunidad de desarrolladores, ya sea en forma de &lt;em&gt;helpers (&lt;/em&gt;m&amp;eacute;todos est&amp;aacute;ticos de generaci&amp;oacute;n de c&amp;oacute;digo en cliente), en forma de vistas parciales (por ejemplo en archivos .ASCX) y nos permitan reutilizar c&amp;oacute;digo, o incluso como controles de servidor (ya se puede ver algo de eso en el ensamblado &lt;a href="http://aspnet.codeplex.com/Release/ProjectReleases.aspx?ReleaseId=24471" title="MVC Futures assembly"&gt;&lt;span style="color:#35537a;"&gt;MVC Futures&lt;/span&gt;&lt;/a&gt;, disponible en CodePlex). &lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Puedes ver un ejemplo de &lt;em&gt;helper&lt;/em&gt; en el post &amp;ldquo;&lt;a href="http://www.variablenotfound.com/2008/12/helper-para-desplegables-enlazados-con.html" title="Helper para desplegables enlazados con ASP.NET MVC y jQuery"&gt;&lt;span style="color:#35537a;"&gt;Helper para desplegables enlazados con ASP.NET MVC y jQuery&lt;/span&gt;&lt;/a&gt;&amp;rdquo;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h4 id="xmadurez"&gt;Madurez del framework&lt;/h4&gt;
&lt;p&gt;ASP.NET MVC es un framework reci&amp;eacute;n salido del horno, por lo cual su adopci&amp;oacute;n implica ciertos riesgos, ya superados por los veteranos Webforms.&lt;/p&gt;
&lt;p&gt;En primer lugar, es bastante probable que durante un primer periodo de adopci&amp;oacute;n comiencen a surgir bugs, agujeros de seguridad y otros problemas que podr&amp;aacute;n hacer tambalear los cimientos de los sistemas que utilicen este marco de trabajo. Tambi&amp;eacute;n es cierto que dada la disponibilidad del c&amp;oacute;digo fuente del mismo y su relativa simplicidad frente a los formularios web, los inconvenientes que puedan aparecer podr&amp;iacute;an ser r&amp;aacute;pidamente subsanados.&lt;/p&gt;
&lt;p&gt;La madurez tambi&amp;eacute;n se hace patente en la cantidad y calidad de informaci&amp;oacute;n disponible. ASP.NET MVC, aunque cuenta con una comunidad de desarrolladores bastante entusiasta, son una minor&amp;iacute;a compar&amp;aacute;ndola con su veterana competencia.&lt;/p&gt;
&lt;p&gt;Y lo mismo ocurre con el n&amp;uacute;mero ingente de componentes y controles reutilizables disponibles para Webforms. Dado que no son compatibles con el framework MVC, se parte de una situaci&amp;oacute;n de clara desventaja frente a &amp;eacute;stos, aunque como comentaba anteriormente seguro que con el tiempo este aspecto ir&amp;aacute; mejorando.&lt;/p&gt;
&lt;h4 id="xfuturo"&gt;Consideraciones sobre el futuro de la tecnolog&amp;iacute;a&lt;/h4&gt;
&lt;p&gt;Si lo que te preocupa es el futuro de los Webforms, has de saber que Microsoft va a seguir d&amp;aacute;ndoles soporte y mejor&amp;aacute;ndolos, como no pod&amp;iacute;a ser de otra forma. Por tanto, de momento no es necesario que bases tu decisi&amp;oacute;n en esto.&lt;/p&gt;
&lt;p&gt;Eso s&amp;iacute;, hay quien opina que ASP.NET MVC ser&amp;aacute; el est&amp;aacute;ndar de creaci&amp;oacute;n de sistemas web en unos a&amp;ntilde;os, por lo que en cualquier caso se trata de una tecnolog&amp;iacute;a que no habr&amp;iacute;a que perder de vista&amp;hellip;&lt;/p&gt;
&lt;h4 id="xbeneficios"&gt;Beneficios de ASP.NET MVC&lt;/h4&gt;
&lt;p&gt;Las ventajas de la arquitectura MVC, descritas anteriormente, y las bondades del dise&amp;ntilde;o del framework son un buen aliciente para comenzar a trabajar con ASP.NET MVC. De hecho, deber&amp;iacute;amos tener muy en cuenta en qu&amp;eacute; aspectos nuestros desarrollos van a beneficiarse del uso de esta tecnolog&amp;iacute;a y valorar si estas ventajas compensan los inconvenientes que su adopci&amp;oacute;n va a suponer:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;la separaci&amp;oacute;n de aspectos impuesta por el patr&amp;oacute;n MVC obligar&amp;aacute; a tener un c&amp;oacute;digo m&amp;aacute;s limpio y estructurado, independizando totalmente la interfaz de la l&amp;oacute;gica de navegaci&amp;oacute;n y, por supuesto, de la de negocio. &lt;/li&gt;
&lt;li&gt;de la misma forma, esta divisi&amp;oacute;n facilita el trabajo en equipo, pues permite el avance en paralelo en las distintas capas. &lt;/li&gt;
&lt;li&gt;si entre nuestras prioridades est&amp;aacute; el asegurar el correcto funcionamiento de nuestros componentes a trav&amp;eacute;s de pruebas unitarias, o hemos optado por utilizar una metodolog&amp;iacute;a de desarrollo guiado por pruebas (&lt;a href="http://es.wikipedia.org/wiki/Tdd" title="Desarrollo guiado por pruebas (TDD)"&gt;&lt;span style="color:#35537a;"&gt;TDD&lt;/span&gt;&lt;/a&gt;), ASP.NET MVC nos vendr&amp;aacute; de perlas. La separaci&amp;oacute;n de aspectos citada anteriormente facilita la creaci&amp;oacute;n de pruebas espec&amp;iacute;ficas para los componentes de cada capa de forma independiente, as&amp;iacute; como el uso de t&amp;eacute;cnicas avanzadas (&lt;em&gt;&lt;a href="http://es.wikipedia.org/wiki/Mock_object" title="Mock object en Wikipedia"&gt;&lt;span style="color:#35537a;"&gt;mocking&lt;/span&gt;&lt;/a&gt;&lt;/em&gt;, &lt;a href="http://es.wikipedia.org/wiki/Inyecci%C3%B3n_de_dependencias" title="Inyecci&amp;oacute;n de dependencias"&gt;&lt;span style="color:#35537a;"&gt;inyecci&amp;oacute;n de dependencias&lt;/span&gt;&lt;/a&gt;&amp;hellip;) para que &amp;eacute;stas sean lo m&amp;aacute;s completas posible. &lt;/li&gt;
&lt;li&gt;las friendly URLS, o direcciones amigables, es un beneficio directo del uso del framework de Microsoft. Estrictamente hablando no es m&amp;eacute;rito de la plataforma MVC, sino del juego de clases presentes en el espacio de nombres &lt;a href="http://msdn.microsoft.com/es-es/library/system.web.routing.aspx" title="System.Web.Routing (Espacio de nombres) ()"&gt;&lt;span style="color:#35537a;"&gt;System.Web.Routing&lt;/span&gt;&lt;/a&gt;, incluidas en .NET framework 3.5, pero en cualquier caso si optamos por esta tecnolog&amp;iacute;a la tendremos &amp;ldquo;de serie&amp;rdquo;, con las ventajas que ello conlleva (SEO, REST, claridad en direcciones&amp;hellip;). &lt;/li&gt;
&lt;li&gt;al final, el software ser&amp;aacute; mucho m&amp;aacute;s mantenible; el hecho de que los componentes est&amp;eacute;n separados y bien estructurados simplificar&amp;aacute; las tareas de mantenimiento. &lt;/li&gt;
&lt;li&gt;el conjunto de convenciones en cuanto a la estructura de proyectos y de nombrado y disposici&amp;oacute;n de elementos facilitar&amp;aacute; el desarrollo una vez sean asimiladas. &lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="xtipo"&gt;El tipo de sistema&lt;/h4&gt;
&lt;p&gt;A la hora de plantearse un cambio de este tipo es imprescindible tener en cuenta el tipo de proyecto en el que solemos trabajar. No es lo mismo desarrollar un sitio web colaborativo destinado a un gran n&amp;uacute;mero de usuarios, como Facebook o Digg, donde el control fino sobre la entrada y salida es crucial para asegurar aspectos como la escalabilidad, cumplimiento de est&amp;aacute;ndares, o accesibilidad, que crear una aplicaci&amp;oacute;n de gesti&amp;oacute;n que utilizar&amp;aacute;n un grupo relativamente reducido de usuarios desde una intranet corporativa.&lt;/p&gt;
&lt;p&gt;Para el primer caso, ASP.NET MVC es una buena opci&amp;oacute;n. La simplicidad de la arquitectura MVC hace que el &lt;a href="http://www.variablenotfound.com/2008/06/la-serpiente-aspnet-mvc.html" title="La serpiente ASP.NET MVC"&gt;&lt;span style="color:#35537a;"&gt;ciclo de vida de las p&amp;aacute;ginas&lt;/span&gt;&lt;/a&gt; de este framework sea mucho m&amp;aacute;s sencillo que el de los Webforms, y la ausencia de automatismos y persistencia de estado aligera en gran medida el peso y complejidad de las p&amp;aacute;ginas, lo cual redundar&amp;aacute; muy positivamente en el rendimiento del sistema. Si adem&amp;aacute;s el proyecto requiere o resulta beneficiado por el uso de direcciones URL amigables (por razones de SEO, para presentar un interfaz claro de tipo &lt;a href="http://es.wikipedia.org/wiki/Representational_State_Transfer" title="Representational State Transfer, en la wikipedia"&gt;&lt;span style="color:#35537a;"&gt;REST&lt;/span&gt;&lt;/a&gt;, o cualquier otro motivo), m&amp;aacute;s a&amp;uacute;n. &lt;/p&gt;
&lt;p&gt;Un ejemplo de aplicaci&amp;oacute;n real de este tipo es la famosa comunidad &lt;a hreflang="en" href="http://stackoverflow.com/" title="Stack Overflow"&gt;StackOverflow&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;En cambio, el segundo caso, cuando se trata de crear pesadas aplicaciones de gesti&amp;oacute;n con interfaces de usuario complejos y en las que no es especialmente relevante la calidad del c&amp;oacute;digo HTML enviado al cliente, ni el peso de &amp;eacute;stas al ser entornos cerrados y controlados, ASP.NET Webforms sigue siendo la opci&amp;oacute;n m&amp;aacute;s razonable. Las facilidades para el desarrollo r&amp;aacute;pido de aplicaciones (RAD) son mayores utilizando formularios web, aunque sea a cambio de sacrificar aspectos como la separaci&amp;oacute;n de c&amp;oacute;digo e interfaz, o la facilidad para realizaci&amp;oacute;n de pruebas unitarias.&lt;/p&gt;
&lt;h3 id="p8"&gt;8. &amp;iquest;Puedo convertir mi proyecto ASP.NET Webforms a ASP.NET MVC?&lt;/h3&gt;
&lt;p&gt;S&amp;iacute;, pero tardar&amp;aacute;s un buen rato ;-)&lt;/p&gt;
&lt;p&gt;Al menos que conozca, no existe ninguna herramienta ni siquiera capaz de intentar realizar tal proeza. Hay que tener en cuenta que el cambio de una a otra tecnolog&amp;iacute;a no es una mera traducci&amp;oacute;n como podr&amp;iacute;a ser convertir una aplicaci&amp;oacute;n VB.NET a C#; se trata de un nuevo marco de trabajo que afecta sobre todo a la presentaci&amp;oacute;n y control de flujo del sistema. &lt;/p&gt;
&lt;p&gt;Si tienes unas buenas clases de l&amp;oacute;gica de negocio, bien aisladas de la tecnolog&amp;iacute;a Webforms (como deber&amp;iacute;a ser, por otra parte), probablemente sean los &amp;uacute;nicos componentes que puedas reutilizar de forma directa, sin grandes cambios. El resto, es decir, todo lo relativo a la interacci&amp;oacute;n con el usuario, habr&amp;iacute;a que convertirlo de forma manual, y por tanto, probablemente habr&amp;iacute;a que pensarse bien si vale la pena hacerlo.&lt;/p&gt;
&lt;h3&gt;&lt;/h3&gt;
&lt;h3 id="p9"&gt;9. &amp;iquest;Se puede utilizar ASP.NET Ajax con el framework MVC?&lt;/h3&gt;
&lt;p&gt;Si nos estamos refiriendo a la posibilidad de utilizar controles de servidor Ajax, como el c&amp;eacute;lebre &lt;code&gt;UpdatePanel&lt;/code&gt; o los controles del &lt;a hreflang="en" href="http://www.asp.net/AJAX/AjaxControlToolkit/" title="ASP.NET Ajax Control Toolkit"&gt;ASP.NET Ajax Control Toolkit&lt;/a&gt;, la respuesta es rotunda: &lt;strong&gt;no&lt;/strong&gt;. De hecho, el modelo MVC no permite el uso de controles de servidor (&lt;code&gt;runat=&amp;quot;server&amp;quot;&lt;/code&gt;); bueno, o al menos no lo permite de la forma en que ven&amp;iacute;amos haci&amp;eacute;ndolo, pues han dejado de existir aspectos tan fundamentales para ellos como el &lt;em&gt;viewstate&lt;/em&gt; o los &lt;em&gt;postbacks&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Ahora bien, si la pregunta la generalizamos como &amp;ldquo;&amp;iquest;se pueden utilizar librer&amp;iacute;as Ajax con el framework MVC?&amp;rdquo; la respuesta es &lt;strong&gt;absolutamente&lt;/strong&gt;. De hecho, ASP.NET MVC se lleva de f&amp;aacute;bula con librer&amp;iacute;as de scripting como las incluidas en el framework ASP.NET 3.5, o con la magn&amp;iacute;fica &lt;a hreflang="en" href="http://jquery.com/" title="jQuery"&gt;jQuery&lt;/a&gt;. La limpieza de la filosof&amp;iacute;a MVC hace posible que sea realmente sencillo realizar desde cliente llamadas a los controladores mediante scripting con objeto de obtener datos, actualizar porciones de contenido de la p&amp;aacute;gina con el marcado de la vista correspondiente, o, en definitiva, interactuar con el servidor.&lt;/p&gt;
&lt;p&gt;En este mismo blog puedes encontrar &lt;a href="http://www.variablenotfound.com/search/label/aspnetmvc" title="ASP.NET MVC en Variable not found"&gt;&lt;span style="color:#35537a;"&gt;multitud de ejemplos&lt;/span&gt;&lt;/a&gt; de integraci&amp;oacute;n de jQuery y ASP.NET MVC, que aunque implementados con las previews del framework (&amp;iexcl;a ver si un d&amp;iacute;a tengo un rato y los voy actualizando!), pueden ayudarte a entender c&amp;oacute;mo hacerlo.&lt;/p&gt;
&lt;p&gt;Otro aspecto interesante respecto a jQuery es que &lt;a href="http://www.variablenotfound.com/2008/09/jquery-microsoft-y-t.html" title="jQuery, Microsoft y t&amp;uacute;"&gt;&lt;span style="color:#35537a;"&gt;esta librer&amp;iacute;a entr&amp;oacute; a formar parte de la plataforma de desarrollo de Microsoft&lt;/span&gt;&lt;/a&gt; el pasado mes de septiembre, lo que en la pr&amp;aacute;ctica aporta varias ventajas: la primera, que jQuery viene incluido de serie en las plantillas de proyectos ASP.NET MVC; la segunda, que Microsoft se ha esforzado por mejorar la &lt;a href="http://www.variablenotfound.com/2008/11/intellisense-completo-para-jquery-en.html" title="Intellisense completo para jQuery"&gt;&lt;span style="color:#35537a;"&gt;integraci&amp;oacute;n con Visual Studio&lt;/span&gt;&lt;/a&gt; de esta librer&amp;iacute;a, facilitando archivos que hacen posible el disfrute de &lt;em&gt;intellisense&lt;/em&gt; mientras la utilizamos.&lt;/p&gt;
&lt;h3 id="10"&gt;10. &amp;iquest;Se puede utilizar VB.NET con ASP.NET MVC?&lt;/h3&gt;
&lt;p&gt;Por supuesto. Aunque la mayor&amp;iacute;a de c&amp;oacute;digo que se encuentra por la red utiliza C#, probablemente porque es el lenguaje en el que ha sido desarrollado y sobre el que se est&amp;aacute;n exponiendo m&amp;aacute;s ejemplos desde las previews m&amp;aacute;s tempranas, cualquier lenguaje .NET podr&amp;iacute;a ser utilizado sin problema para desarrollar aplicaciones sobre este framework. &lt;/p&gt;
&lt;p&gt;A nivel de entorno de desarrollo, Visual Basic ofrece el mismo nivel de ayudas y plantillas que C#, pero desconozco si esto es as&amp;iacute; en otros lenguajes.&lt;/p&gt;
&lt;h3 id="p11"&gt;11. &amp;iquest;Puedo usar LINQ desarrollando aplicaciones con ASP.NET MVC framework?&lt;/h3&gt;
&lt;p&gt;S&amp;iacute;, de hecho se complementan a la perfecci&amp;oacute;n.&lt;/p&gt;
&lt;p&gt;Aunque LINQ como tal s&amp;oacute;lo es un mecanismo de consulta integrado en los lenguajes de programaci&amp;oacute;n, las tecnolog&amp;iacute;as &lt;acronym title="Object-Relational Mapping"&gt;ORM&lt;/acronym&gt; que lo rodean, como LINQ2SQL o Entity Framework son ideales para implementar los componentes propios del &lt;strong&gt;M&lt;/strong&gt;odelo (la M de &amp;ldquo;MVC&amp;rdquo;). En aplicaciones relativamente simples, estas clases podr&amp;iacute;an generarse con los dise&amp;ntilde;adores visuales del entorno de desarrollo, o de forma externa con herramientas como SQLMetal, facilit&amp;aacute;ndonos enormemente el trabajo.&lt;/p&gt;
&lt;p&gt;Este es un buen momento para comentar que una de las grandes cr&amp;iacute;ticas que se est&amp;aacute;n haciendo a la implementaci&amp;oacute;n del framework ASP.NET MVC es que parece hacer olvidado la &amp;ldquo;M&amp;rdquo;. Si bien el marco de trabajo establece con claridad el alcance y responsabilidades de los controladores y las vistas y dota de herramientas y convenciones espec&amp;iacute;ficas a cada una de estas capas, no ocurre lo mismo con el Modelo, que queda totalmente al libre albedr&amp;iacute;o del desarrollador.&lt;/p&gt;
&lt;h3 id="p12"&gt;12. &amp;iquest;Qu&amp;eacute; tipo de tecnolog&amp;iacute;as puedo utilizar en las vistas?&lt;/h3&gt;
&lt;p&gt;El objetivo de las vistas es componer el interfaz de usuario y los mecanismos de interacci&amp;oacute;n con el usuario. Lo habitual ser&amp;aacute; utilizar XHTML, CSS y Javascript, aderezado con bloques de c&amp;oacute;digo de servidor que se ejecutar&amp;aacute; en el momento de &lt;em&gt;renderizar&lt;/em&gt; la p&amp;aacute;gina.&lt;/p&gt;
&lt;p&gt;Tambi&amp;eacute;n puedes utilizar la tecnolog&amp;iacute;a Ajax para enviar u obtener informaci&amp;oacute;n desde el servidor, siempre mediante llamadas a acciones definidas en el controlador, que te permitir&amp;aacute;n crear interfaces m&amp;aacute;s din&amp;aacute;micos y actuales.&lt;/p&gt;
&lt;p&gt;Pero sobre todo, nada de utilizar controles de servidor (Label, Button, Dropdowns&amp;hellip;). Estos deber&amp;aacute;n ser sustituidos por sus elementos XHTML equivalentes, lo que implica que perderemos los automatismos provistos por Webforms para el mantenimiento del estado de los controles.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;div class="wlWriterEditableSmartContent" id="scid:57F11A72-B0E5-49c7-9094-E3A15BD5B5E6:dc312513-c5aa-4ac5-abba-94e2ac8f72c8" style="margin:0px 0px 5px 5px;display:inline;float:right;padding:0px;"&gt;
&lt;pre style="background-color:#ffffff;word-wrap:break-word;white-space:pre-wrap;overflow:auto;"&gt;&lt;span style="color:#000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;for&lt;/span&gt;&lt;span style="color:#000000;"&gt; each&lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#800000;"&gt;var name in names&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;br /&gt;  &lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;test &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;if&lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#800000;"&gt;name == &amp;#39;Jose&amp;#39;&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;p&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;Yo mismo&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#000000;"&gt;p&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;else&lt;/span&gt;&lt;span style="color:#000000;"&gt;/&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;p&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;Amigo: ${name}  &lt;br /&gt;  &lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#000000;"&gt;test&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;for&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;Otra posibilidad interesante que aprovecha y demuestra la flexibilidad de la arquitectura de ASP.NET MVC framework, es la utilizaci&amp;oacute;n de motores de vistas distintos al est&amp;aacute;ndar. Existen multitud de motores ligeros (&lt;a href="http://code.google.com/p/nhaml/" title="NHaml View Engine"&gt;&lt;span style="color:#35537a;"&gt;NHaml&lt;/span&gt;&lt;/a&gt;, &lt;a href="http://dev.dejardin.org/" title="Spark View Engine"&gt;&lt;span style="color:#35537a;"&gt;Spark&lt;/span&gt;&lt;/a&gt;, &lt;a title="Brail View Engine" href="http://www.codeplex.com/MVCContrib/Wiki/View.aspx?title=Brail&amp;amp;referringTitle=Documentation"&gt;&lt;span style="color:#35537a;"&gt;Brail&lt;/span&gt;&lt;/a&gt;, &lt;a href="http://www.castleproject.org/others/nvelocity/index.html" title="NVelocity View Engine"&gt;&lt;span style="color:#35537a;"&gt;NVelocity&lt;/span&gt;&lt;/a&gt;&amp;hellip;), cada uno con su propio lenguaje de marcas y convenciones, que permiten la definici&amp;oacute;n de vistas a partir de plantillas como la que se muestra en el lateral (ejemplo de Spark).&amp;nbsp;&lt;/p&gt;
&lt;h3 id="p13"&gt;13. &amp;iquest;Es ASP.NET MVC framework software libre?&lt;/h3&gt;
&lt;p&gt;He aqu&amp;iacute; una de las grandes novedades respecto al post que escrib&amp;iacute; un a&amp;ntilde;o atr&amp;aacute;s. Por aquellos tiempos era inimaginable que esta pregunta pudiera responderse de forma afirmativa, pero&amp;hellip; efectivamente, &lt;strong&gt;ASP.NET MVC Framework es software libre&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;A primeros de abril de 2009 se comenz&amp;oacute; a distribuir oficialmente el c&amp;oacute;digo fuente de ASP.NET MVC con licencia &lt;a href="http://www.microsoft.com/spain/sharedsource/licensingbasics/publiclicense.mspx" title="Licencia MS-PL"&gt;&lt;span style="color:#35537a;"&gt;MS-PL&lt;/span&gt;&lt;/a&gt; (Microsoft Public License), un modelo de licencia aprobado por la &lt;a hreflang="en" href="http://www.opensource.org/" title="Open Source Initiative"&gt;OSI&lt;/a&gt; (Open Source Initiative) que permite el uso del software en aplicaciones comerciales y no comerciales.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;Crossposting desde &lt;a href="http://www.variablenotfound.com/2009/04/aspnet-mvc-trece-preguntas-basicas.html" title="Variable not found"&gt;Variable not found&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=148029" width="1" height="1"&gt;</description><category domain="http://geeks.ms/blogs/jmaguilar/archive/tags/desarrollo/default.aspx">desarrollo</category><category domain="http://geeks.ms/blogs/jmaguilar/archive/tags/programaci_26002300_243_3B00_n/default.aspx">programaci&amp;#243;n</category><category domain="http://geeks.ms/blogs/jmaguilar/archive/tags/asp.net/default.aspx">asp.net</category><category domain="http://geeks.ms/blogs/jmaguilar/archive/tags/consultas/default.aspx">consultas</category><category domain="http://geeks.ms/blogs/jmaguilar/archive/tags/aspnetmvc/default.aspx">aspnetmvc</category></item><item><title>Cómo convertir clases en diccionarios clave/valor</title><link>http://geeks.ms/blogs/jmaguilar/archive/2008/11/16/c-243-mo-convertir-clases-en-diccionarios-clave-valor.aspx</link><pubDate>Sun, 16 Nov 2008 22:40:00 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:115961</guid><dc:creator>José M. Aguilar</dc:creator><slash:comments>7</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/jmaguilar/rsscomments.aspx?PostID=115961</wfw:commentRss><comments>http://geeks.ms/blogs/jmaguilar/archive/2008/11/16/c-243-mo-convertir-clases-en-diccionarios-clave-valor.aspx#comments</comments><description>&lt;p&gt;&lt;img id="BLOGGER_PHOTO_ID_5187550580645795922" style="FLOAT:right;MARGIN:0px 0px 10px 10px;" alt="Cuestiones enviadas por lectores" src="http://bp2.blogger.com/_O9D62hXq-ng/R_3hxK3DmFI/AAAAAAAAAVI/lecw8lWubVE/s320/pregunta.png" border="0" /&gt;El otro día, a raíz del post &lt;a href="http://www.variablenotfound.com/2008/10/atajo-para-instanciar-tipos-annimos-en.html"&gt;&lt;font color="#35537a"&gt;Atajo para instanciar tipos anónimos en C# y VB.NET&lt;/font&gt;&lt;/a&gt;, el amigo Leo H., desde Argentina, me envió una cuestión:&lt;br /&gt;
&lt;blockquote&gt;&lt;br /&gt;[...] Me parece muy interesante crear diccionarios utilizando tipos anónimos, pues simplifica de una forma considerable la cantidad de código que hay que escribir para conseguir llenar una estructura de este tipo. De hecho, estoy pensando en utilizar esta técnica en una librería que estoy desarrollando, pero no veo claro cómo transformar después ese objeto anónimo en el diccionario equivalente [...]&lt;br /&gt;&lt;/blockquote&gt;
&lt;p&gt;&lt;br /&gt;Verás que la idea es muy simple. Sólo necesitamos encontrar una fórmula que nos permita recorrer las propiedades del objeto, y por cada una de ellas, añadir la entrada correspondiente en el diccionario, especificando como clave el nombre de la propiedad y como valor el que tenga establecido la misma.&lt;br /&gt;&lt;br /&gt;Una posibilidad muy sencilla es usar la clase &lt;code&gt;TypeDescriptor&lt;/code&gt;, cuyo método &lt;code&gt;GetProperties()&lt;/code&gt; nos devuelve una colección con los descriptores de las propiedades de la instancia que le pasemos como parámetro. Iterando sobre este conjunto, podremos ir llenando el diccionario con los elementos que nos interese, tal que así, dado un objeto llamado &lt;code&gt;obj&lt;/code&gt;:&lt;/p&gt;&lt;pre&gt;&lt;code&gt;  Dictionary&amp;lt;string, object&amp;gt; dicc = new Dictionary&amp;lt;string, object&amp;gt;();&lt;br /&gt;  foreach (PropertyDescriptor desc in TypeDescriptor.GetProperties(obj))&lt;br /&gt;  {&lt;br /&gt;    dicc.Add(desc.Name, desc.GetValue(obj));&lt;br /&gt;  }&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;br /&gt;Pero vamos a dar una vuelta de tuerca más. Partiendo del código anterior, es muy fácil crear un &lt;a title="Métodos de extensión en C#" href="http://www.variablenotfound.com/2008/02/mtodos-de-extensin-en-c.html"&gt;&lt;font color="#35537a"&gt;método de extensión&lt;/font&gt;&lt;/a&gt; sobre la clase &lt;code&gt;object&lt;/code&gt;, de forma que podamos convertir en un diccionario cualquier objeto de nuestras aplicaciones, con toda la potencia y comodidad que nos aporta esta técnica.&lt;br /&gt;&lt;br /&gt;El código sería:&lt;/p&gt;&lt;pre&gt;&lt;code&gt;  public static class Extensions&lt;br /&gt;  {&lt;br /&gt;    public static Dictionary&amp;lt;string, object&amp;gt; ToDictionary(this object obj)&lt;br /&gt;    {&lt;br /&gt;      Dictionary&amp;lt;string, object&amp;gt; dicc = new Dictionary&amp;lt;string, object&amp;gt;();&lt;br /&gt;      foreach (PropertyDescriptor desc in TypeDescriptor.GetProperties(obj))&lt;br /&gt;      {&lt;br /&gt;        dicc.Add(desc.Name, desc.GetValue(obj));&lt;br /&gt;      }&lt;br /&gt;      return dicc;&lt;br /&gt;    }&lt;br /&gt;  }&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;br /&gt;De esta forma, dispondremos de una potente forma de &amp;quot;diccionarizar&amp;quot; nuestras instancias, sean del tipo que sean, por ejemplo:&lt;br /&gt;&lt;/p&gt;&lt;pre&gt;&lt;code&gt;&lt;br /&gt;  var juan = new { nombre = &amp;quot;Juan&amp;quot;, edad = 23 };&lt;br /&gt;  Dictionary&amp;lt;string, object&amp;gt; dicc = juan.ToDictionary();  &lt;br /&gt;  Console.WriteLine(dicc[&amp;quot;nombre&amp;quot;]); // &lt;span style="COLOR:green;"&gt;Escribe &amp;quot;Juan&amp;quot;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;  var dicc2 = &amp;quot;hola&amp;quot;.ToDictionary();&lt;br /&gt;  Console.WriteLine(dicc2[&amp;quot;Length&amp;quot;]);  &lt;span style="COLOR:green;"&gt;// Escribe 4&lt;/span&gt;&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;br /&gt;Espero que te sea de ayuda, Leo. ¡Y gracias por participar en Variable Not Found!&lt;br /&gt;&lt;br /&gt;Publicado en: &lt;a href="http://www.variablenotfound.com/"&gt;&lt;font color="#35537a"&gt;www.variablenotfound.com&lt;/font&gt;&lt;/a&gt;. &lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=115961" width="1" height="1"&gt;</description><category domain="http://geeks.ms/blogs/jmaguilar/archive/tags/c_2300_/default.aspx">c#</category><category domain="http://geeks.ms/blogs/jmaguilar/archive/tags/trucos/default.aspx">trucos</category><category domain="http://geeks.ms/blogs/jmaguilar/archive/tags/vs2008/default.aspx">vs2008</category><category domain="http://geeks.ms/blogs/jmaguilar/archive/tags/consultas/default.aspx">consultas</category><category domain="http://geeks.ms/blogs/jmaguilar/archive/tags/aspnetmvc/default.aspx">aspnetmvc</category></item><item><title>Referencias en cliente a tipos de servidor con ASP.NET Ajax</title><link>http://geeks.ms/blogs/jmaguilar/archive/2008/07/20/referencias-en-cliente-a-tipos-de-servidor-con-asp-net-ajax.aspx</link><pubDate>Sun, 20 Jul 2008 20:49:00 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:92164</guid><dc:creator>José M. Aguilar</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/jmaguilar/rsscomments.aspx?PostID=92164</wfw:commentRss><comments>http://geeks.ms/blogs/jmaguilar/archive/2008/07/20/referencias-en-cliente-a-tipos-de-servidor-con-asp-net-ajax.aspx#comments</comments><description>&lt;p&gt;&lt;img id="BLOGGER_PHOTO_ID_5187550580645795922" style="FLOAT:right;MARGIN:0px 0px 10px 10px;" alt="Cuestiones enviadas por lectores" src="http://bp2.blogger.com/_O9D62hXq-ng/R_3hxK3DmFI/AAAAAAAAAVI/lecw8lWubVE/s320/pregunta.png" border="0" /&gt;Hace unos días Pedro dejaba una consulta &lt;a title="Cuestión de Pedro" href="http://www.variablenotfound.com/2007/06/usando-aspnet-ajax-para-el-intercambio.html?showComment=1215483240000#c179710069774167157"&gt;&lt;font color="#35537a"&gt;en los comentarios&lt;/font&gt;&lt;/a&gt; del post &amp;quot;&lt;a title="Usando ASP.NET Ajax para el intercambio de entidades de datos" href="http://www.variablenotfound.com/2007/06/usando-aspnet-ajax-para-el-intercambio.html"&gt;&lt;font color="#35537a"&gt;Usando ASP.NET Ajax para el intercambio de entidades de datos&lt;/font&gt;&lt;/a&gt;&amp;quot; sobre un problema que le había surgido a la hora de referenciar desde script, en el lado cliente, una clase propia que utilizaba para intercambiar datos entre éste y el servidor.&lt;br /&gt;&lt;br /&gt;En dicho post se mostraba la forma en que era posible intercambiar información estructurada con Ajax, definiendo en el servidor una clase propia y viendo cómo el &lt;em&gt;ScriptManager&lt;/em&gt;, mágicamente, creaba un proxy (o espejo) en cliente que permitía su manipulación de forma muy cómoda y transparente al otro lado de la red.&lt;br /&gt;&lt;br /&gt;De hecho, partíamos de una definición en el servidor así:&lt;/p&gt;&lt;pre&gt;&lt;code&gt;  public class Mensaje&lt;br /&gt;  {&lt;br /&gt;    public string Remitente;&lt;br /&gt;    public string Destinatario;&lt;br /&gt;    public DateTime Fecha;&lt;br /&gt;    public int Numero;&lt;br /&gt;  }&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;br /&gt;Y veíamos como desde cliente podíamos manipularla, &lt;strong&gt;en &lt;em&gt;javascript&lt;/em&gt;&lt;/strong&gt;, de la siguiente forma:&lt;/p&gt;&lt;pre&gt;&lt;code&gt;  msg = new Mensaje();&lt;br /&gt;  msg.Remitente = $get(&amp;quot;nombre&amp;quot;).value;&lt;br /&gt;  msg.Numero = 1; &lt;br /&gt;  msg.Destinatario = &amp;quot;servidor&amp;quot;;&lt;br /&gt;  msg.Fecha = new Date();&lt;br /&gt;&lt;/pre&gt;
&lt;p&gt;&lt;/code&gt;&lt;font face="Trebuchet MS"&gt;&lt;br /&gt;El problema que comentaba este lector es que, a diferencia del ejemplo, su entidad de datos se encontraba definida en un ensamblado y espacio de nombres diferente al del &lt;em&gt;WebMethod&lt;/em&gt; que lo utilizaba, lo que provocaba la aparición de un error indicando que su clase no estaba definida.&lt;br /&gt;&lt;br /&gt;Aunque al principio sospeché en que podía existir alguna limitación en la seriación JSON de los datos, después de indagar un poco dí con la solución. La lección que he aprendido es: &lt;/font&gt;&lt;/p&gt;
&lt;blockquote&gt;para usar desde cliente una clase generada de forma automática por el ScriptManager, es necesario referenciarla precedida del namespace en el que se encuentra definida&lt;/blockquote&gt;
&lt;p&gt;O en otras palabras, si la clase &lt;code&gt;Mensaje&lt;/code&gt; está definida dentro del espacio de nombres &lt;code&gt;A.B&lt;/code&gt;, la referencia en cliente deberá ser:&lt;/p&gt;&lt;pre&gt;&lt;code&gt;  var x = new A.B.Mensaje();&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;¿Y por qué funciona bien el &lt;a title="Descargar proyecto AjaxPingPong" href="http://www.snapdrive.net/files/415885/AjaxPingPong.zip"&gt;&lt;font color="#35537a"&gt;ejemplo AjaxPingPong&lt;/font&gt;&lt;/a&gt;, si la referencia a la clase &lt;code&gt;Mensaje&lt;/code&gt; no incluía su espacio de nombres? Pues debido a que estaba definida en el &lt;em&gt;namespace&lt;/em&gt; por defecto del proyecto...&lt;br /&gt;&lt;br /&gt;¡Gracias, Pedro, por participar en Variable Not Found!&lt;br /&gt;&lt;br /&gt;Publicado en: &lt;a href="http://www.variablenotfound.com/"&gt;&lt;font color="#35537a"&gt;www.variablenotfound.com&lt;/font&gt;&lt;/a&gt;. &lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=92164" width="1" height="1"&gt;</description><category domain="http://geeks.ms/blogs/jmaguilar/archive/tags/asp.net/default.aspx">asp.net</category><category domain="http://geeks.ms/blogs/jmaguilar/archive/tags/consultas/default.aspx">consultas</category><category domain="http://geeks.ms/blogs/jmaguilar/archive/tags/ajax/default.aspx">ajax</category></item><item><title>Imágenes en cuadros de texto de formularios web</title><link>http://geeks.ms/blogs/jmaguilar/archive/2008/06/15/im-225-genes-en-cuadros-de-texto-de-formularios-web.aspx</link><pubDate>Sun, 15 Jun 2008 20:09:00 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:88933</guid><dc:creator>José M. Aguilar</dc:creator><slash:comments>6</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/jmaguilar/rsscomments.aspx?PostID=88933</wfw:commentRss><comments>http://geeks.ms/blogs/jmaguilar/archive/2008/06/15/im-225-genes-en-cuadros-de-texto-de-formularios-web.aspx#comments</comments><description>&lt;p&gt;&lt;img id="BLOGGER_PHOTO_ID_5187550580645795922" style="FLOAT:right;MARGIN:0px 0px 10px 10px;" alt="Cuestiones enviadas por lectores" src="http://bp2.blogger.com/_O9D62hXq-ng/R_3hxK3DmFI/AAAAAAAAAVI/lecw8lWubVE/s320/pregunta.png" border="0" /&gt;Respondiendo a &lt;a title="Consulta: ¿cómo puedo meter una lupa en el interior de un input type=text?" href="http://www.variablenotfound.com/2007/09/bordes-redondeados-en-webs-sin-esfuerzo.html?showComment=1212319800000#c5060590688862291447"&gt;&lt;font color="#35537a"&gt;una consulta que hacía Joaquín hace un par de días&lt;/font&gt;&lt;/a&gt;, hoy describiremos &lt;em&gt;una forma&lt;/em&gt; de hacer más atractivos los cuadros de edición de nuestros formularios web, introduciéndoles iconos o imágenes que, a la vez que adornan bastante, pueden ayudar al usuario a saber qué información debe introducir.&lt;br /&gt;&lt;br /&gt;Pero para que quede claro lo que pretendemos, primero un ejemplo del resultado que vamos a conseguir:&lt;br /&gt;
&lt;div style="BORDER-RIGHT:#f0f0f0 1px solid;PADDING-RIGHT:10px;BORDER-TOP:#f0f0f0 1px solid;MARGIN-TOP:10px;PADDING-LEFT:10px;PADDING-BOTTOM:10px;BORDER-LEFT:#f0f0f0 1px solid;PADDING-TOP:10px;BORDER-BOTTOM:#f0f0f0 1px solid;TEXT-ALIGN:center;"&gt;&lt;img height="55" alt="Textboxes" src="http://geeks.ms/blogs/jmaguilar/textboxes.JPG" width="179" border="0" /&gt;&lt;br /&gt;&amp;nbsp;&lt;/div&gt;
&lt;p&gt;&lt;br /&gt;La forma de conseguirlo es bastante sencilla. Basta con establecer, en las propiedades de estilo de los cuadros de edición una imagen de fondo con el icono que queremos incluir, y dejar un espaciado por la izquierda (padding-left) equivalente al ancho del mismo para que la introducción del texto comience a partir de ese punto.&lt;br /&gt;&lt;br /&gt;Por ejemplo, si definimos las siguientes clases en el CSS de nuestra página (y suponiendo que la ruta de las imágenes sea correcta, claro):&lt;br /&gt;&lt;/p&gt;&lt;pre&gt;&lt;code&gt; .lupa&lt;br /&gt; {&lt;br /&gt;   background: white url(icono_lupa.gif) no-repeat 2px center;&lt;br /&gt;   padding: 2px 2px 2px 18px;&lt;br /&gt; }&lt;br /&gt; .telefono&lt;br /&gt; {&lt;br /&gt;   background: white url(icono_telefono.gif) no-repeat 2px center;&lt;br /&gt;   padding: 2px 2px 2px 18px;&lt;br /&gt; }&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;br /&gt;Como se puede observar, se establece un fondo blanco con una imagen cuya URL se especifica (icono_xxxx.gif), mostrada sin repetición (&lt;em&gt;no-repeat&lt;/em&gt;), posicionada en coordenada horizontal 2px y centrada verticalmente. El &lt;em&gt;padding &lt;/em&gt;izquierdo será de 18px para que comience ahí el área de edición, a la derecha de la imagen.&lt;br /&gt;&lt;br /&gt;Podremos utilizar después en nuestro HTML un código como el siguiente para conseguir que los cuadros de edición apararezcan &amp;quot;adornados&amp;quot; como nos interese en cada momento eligiendo para cada uno de ellos la clase CSS apropiada:&lt;br /&gt;&lt;/p&gt;&lt;pre&gt;&lt;code&gt; &amp;lt;input type=&amp;quot;text&amp;quot; class=&amp;quot;lupa&amp;quot; /&amp;gt;&lt;br /&gt; &amp;lt;input type=&amp;quot;text&amp;quot; class=&amp;quot;telefono&amp;quot; /&amp;gt;&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;br /&gt;Espero que esto responda la duda, Joaquín. &lt;br /&gt;&lt;br /&gt;Y por cierto, he utilizado esta técnica en el buscador del encabezado del blog, que lo tenía un poco soso...&lt;br /&gt;&lt;br /&gt;Publicado en: &lt;a href="http://www.variablenotfound.com/"&gt;&lt;font color="#35537a"&gt;www.variablenotfound.com&lt;/font&gt;&lt;/a&gt;. &lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=88933" width="1" height="1"&gt;</description><category domain="http://geeks.ms/blogs/jmaguilar/archive/tags/desarrollo/default.aspx">desarrollo</category><category domain="http://geeks.ms/blogs/jmaguilar/archive/tags/asp.net/default.aspx">asp.net</category><category domain="http://geeks.ms/blogs/jmaguilar/archive/tags/web/default.aspx">web</category><category domain="http://geeks.ms/blogs/jmaguilar/archive/tags/css/default.aspx">css</category><category domain="http://geeks.ms/blogs/jmaguilar/archive/tags/dise_26002300_241_3B00_o/default.aspx">dise&amp;#241;o</category><category domain="http://geeks.ms/blogs/jmaguilar/archive/tags/consultas/default.aspx">consultas</category><category domain="http://geeks.ms/blogs/jmaguilar/archive/tags/xhtml/default.aspx">xhtml</category></item><item><title>Ocultar el texto de validadores en javascript (ASP.Net)</title><link>http://geeks.ms/blogs/jmaguilar/archive/2008/04/10/ocultar-el-texto-de-validadores-en-javascript-asp-net.aspx</link><pubDate>Thu, 10 Apr 2008 16:19:00 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:82903</guid><dc:creator>José M. Aguilar</dc:creator><slash:comments>2</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/jmaguilar/rsscomments.aspx?PostID=82903</wfw:commentRss><comments>http://geeks.ms/blogs/jmaguilar/archive/2008/04/10/ocultar-el-texto-de-validadores-en-javascript-asp-net.aspx#comments</comments><description>&lt;p&gt;&lt;a href="http://bp2.blogger.com/_O9D62hXq-ng/R_3hxK3DmFI/AAAAAAAAAVI/lecw8lWubVE/s1600-h/pregunta.png"&gt;&lt;img id="BLOGGER_PHOTO_ID_5187550580645795922" style="FLOAT:right;MARGIN:0px 0px 10px 10px;CURSOR:hand;" alt="" src="http://bp2.blogger.com/_O9D62hXq-ng/R_3hxK3DmFI/AAAAAAAAAVI/lecw8lWubVE/s320/pregunta.png" border="0" /&gt;&lt;/a&gt;Pablo ha lanzado una pregunta en el post &lt;a href="http://www.variablenotfound.com/2007/09/deshabilitarhabilitar-un-validador.html"&gt;&lt;font color="#35537a"&gt;Deshabilitar y habilitar un validador ASP.Net desde Javascript&lt;/font&gt;&lt;/a&gt; publicado hace unos meses, que creo interesante responder en una entrada en exclusiva, por si puede ayudar a alguien más.&lt;br /&gt;
&lt;blockquote&gt;&amp;quot;Al utilizar la funcion ValidatorEnable para habilitar un validador, me activa automaticamente la validacion, y me muestra el texto que pongo para cuando la validacion no se cumpla, como puedo evitar esto&amp;quot;&lt;/blockquote&gt;
&lt;p&gt;&lt;br /&gt;Recordemos que el post trataba sobre cómo conseguir, desde Javascript, habilitar o deshabilitar validadores de controles incluidos en un webform utilizando la función &lt;code&gt;ValidatorEnable()&lt;/code&gt;, que pone a nuestra disposición ASP.Net.&lt;br /&gt;&lt;br /&gt;El problema, como comenta Pablo, es que al habilitar la validación desde script se muestran de forma automática los mensajes de error en todos aquellos controles que no sean válidos, provocando un efecto que puede resultar desconcertante para el usuario.&lt;br /&gt;&lt;br /&gt;Indagando un poco, he comprobado que el problema se debe a que &lt;code&gt;ValidatorEnable()&lt;/code&gt;, después de habilitar el validator, comprueba si los valores del control son correctos, mostrando el error en caso contrario.&lt;br /&gt;&lt;br /&gt;Existen al menos dos formas de solucionar este problema.&lt;br /&gt;&lt;br /&gt;La primera consiste en jugar con la visibilidad del mensaje de error. Como se observa en el siguiente código, al llamar a la función &lt;code&gt;HabilitaValidador()&lt;/code&gt;, ésta llamará a &lt;code&gt;ValidatorEnable&lt;/code&gt; y acto seguido, si el control no es válido, oculta el mensaje de error:&lt;/p&gt;&lt;pre&gt;&lt;code&gt;&lt;br /&gt;    function HabilitaValidador(validator, habilitar)&lt;br /&gt;    {&lt;br /&gt;        ValidatorEnable(validator, habilitar);&lt;br /&gt;        if (habilitar &amp;amp;&amp;amp; !validator.isvalid)&lt;br /&gt;            validator.style.visibility = &amp;quot;hidden&amp;quot;;&lt;br /&gt;    }&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;La segunda forma consiste en simular el comportamiento interno de &lt;code&gt;ValidatorEnable&lt;/code&gt;, pero eliminando la llamada a la comprobación de la validez del control. &lt;/p&gt;&lt;pre&gt;&lt;code&gt;    function HabilitaValidador(validator, habilitar)&lt;br /&gt;    {&lt;br /&gt;        validator.enabled = habilitar;&lt;br /&gt;    }&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Como se puede ver, simplemente se está estableciendo la propiedad &lt;code&gt;enabled&lt;/code&gt; del validador, sin realizar ninguna comprobación posterior.&lt;br /&gt;&lt;br /&gt;En ambos casos, la forma de utilizar esta función desde script sería la misma:&lt;/p&gt;&lt;pre&gt;&lt;code&gt;&lt;br /&gt;    function activar()&lt;br /&gt;    {   &lt;br /&gt;        HabilitaValidador(&amp;quot;&amp;lt;%= RequiredFieldValidator1.ClientID %&amp;gt;&amp;quot;, true);&lt;br /&gt;    }&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Para mi gusto la opción más limpia, aunque sea jugando con la visibilidad de los elementos, es la primera de las mostradas, pues se respeta el ciclo completo de validación. En el segundo método nos estamos saltando las validaciones y el seguimiento de la validez global de la página, que la función original &lt;code&gt;ValidatorEnable&lt;/code&gt; sí contempla.&lt;br /&gt;&lt;br /&gt;Espero que esto resuelva la duda.&lt;br /&gt;&lt;br /&gt;Publicado en: &lt;a href="http://www.variablenotfound.com/"&gt;&lt;font color="#35537a"&gt;www.variablenotfound.com&lt;/font&gt;&lt;/a&gt;. &lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=82903" width="1" height="1"&gt;</description><category domain="http://geeks.ms/blogs/jmaguilar/archive/tags/trucos/default.aspx">trucos</category><category domain="http://geeks.ms/blogs/jmaguilar/archive/tags/asp.net/default.aspx">asp.net</category><category domain="http://geeks.ms/blogs/jmaguilar/archive/tags/javascript/default.aspx">javascript</category><category domain="http://geeks.ms/blogs/jmaguilar/archive/tags/consultas/default.aspx">consultas</category><category domain="http://geeks.ms/blogs/jmaguilar/archive/tags/validadores/default.aspx">validadores</category></item><item><title>Retornar un DataSet desde métodos de página (PageMethods) con ASP.Net Ajax</title><link>http://geeks.ms/blogs/jmaguilar/archive/2007/12/18/retornar-un-dataset-desde-m-233-todos-de-p-225-gina-pagemethods-con-asp-net-ajax.aspx</link><pubDate>Tue, 18 Dec 2007 19:22:00 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:58215</guid><dc:creator>José M. Aguilar</dc:creator><slash:comments>4</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/jmaguilar/rsscomments.aspx?PostID=58215</wfw:commentRss><comments>http://geeks.ms/blogs/jmaguilar/archive/2007/12/18/retornar-un-dataset-desde-m-233-todos-de-p-225-gina-pagemethods-con-asp-net-ajax.aspx#comments</comments><description>&lt;p&gt;Hace unos días Rosario C. realizaba, a través de un comentario en el post &lt;a href="http://www.variablenotfound.com/2007/05/llamar-mtodos-estticos-con-aspnet-ajax.html"&gt;&lt;font color="#35537a"&gt;&amp;quot;Llamar a métodos estáticos con ASP.Net Ajax&amp;quot;&lt;/font&gt;&lt;/a&gt;, una consulta sobre un problema con el se había topado al intentar retornar &lt;em&gt;DataSets&lt;/em&gt; desde un método de página (PageMethod) de ASP.Net Ajax, un tema tan interesante que vale la pena escribir un post en exclusiva.&lt;br /&gt;&lt;br /&gt;Recordemos que los métodos estáticos de página son una interesante capacidad que nos ofrece este framework para poder invocar desde cliente (javascript) funciones de servidor (codebehind) de una forma realmente sencilla. Además, gracias a los mecanismos de &lt;a title="Qué es la seriación o serialización" href="http://es.wikipedia.org/wiki/Serializaci%C3%B3n"&gt;&lt;font color="#35537a"&gt;seriación&lt;/font&gt;&lt;/a&gt; incluidos, y como ya vimos en el post &lt;a href="http://www.variablenotfound.com/2007/06/usando-aspnet-ajax-para-el-intercambio.html"&gt;&lt;font color="#35537a"&gt;&amp;quot;Usando ASP.NET AJAX para el intercambio de entidades de datos&amp;quot;&lt;/font&gt;&lt;/a&gt;, es perfectamente posible devolver desde servidor entidades o estructuras de datos complejas, y obtenerlas y procesarlas directamente desde cliente utilizando javascript, y viceversa.&lt;br /&gt;&lt;br /&gt;Es es ahí donde reside el problema con los DataSets: precisamente este tipo de datos no está soportado directamente por el seriador JSON incorporado, que es el utilizado por defecto, de ahí que se genere una excepción como la que sigue:&lt;br /&gt;
&lt;blockquote&gt;System.InvalidOperationException&lt;br /&gt;A circular reference was detected while serializing an object of type &amp;#39;System.Globalization.CultureInfo&amp;#39;.&lt;br /&gt;en System.Web.Script.Serialization.JavaScriptSerializer.SerializeValueInternal(Object o, StringBuilder sb, Int32 depth, Hashtable objectsInUse, SerializationFormat serializationFormat)\r\n en System.Web.Script.Serialization.JavaScriptSerializer.SerializeValue(Object o, StringBuilder sb, Int32 depth, Hashtable objectsInUse, SerializationFormat [...]&lt;br /&gt;&lt;/blockquote&gt;
&lt;p&gt;Pero antes de nada, un inciso. Dado que la excepción se produce en el momento de la seriación, justo antes de enviar los datos de vuelta al cliente, debe ser capturada en cliente vía la función callback especificada como último parámetro en la llamada al método del servidor:&lt;br /&gt;&lt;/p&gt;&lt;pre&gt;&lt;code&gt;  // Llamada a nuestro PageMethod&lt;br /&gt;  PageMethods.GetData(param, OnOK, &lt;strong&gt;OnError&lt;/strong&gt;); &lt;br /&gt;  [...]&lt;br /&gt;  &lt;br /&gt;&lt;br /&gt;  function &lt;strong&gt;OnError&lt;/strong&gt;(msg)&lt;br /&gt;  {&lt;br /&gt;    // msg es de la clase &lt;a href="http://asp.net/AJAX/Documentation/Live/ClientReference/Sys.Net/WebServiceErrorClass/default.aspx"&gt;&lt;font color="#35537a"&gt;WebServiceError&lt;/font&gt;&lt;/a&gt;.&lt;br /&gt;    alert(&amp;quot;Error: &amp;quot; + msg.get_message());&lt;br /&gt;  }&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;Aclarado esto, continuamos con el tema. La buena noticia es que el soporte para &lt;em&gt;DataSets&lt;/em&gt; estará incluido en futuras versiones de la plataforma. De hecho, es perfectamente posible utilizar las librerías disponibles en previews disponibles en la actualidad. Existen multitud de ejemplos en la red sobre cómo es posible realizar esto, aunque será necesario instalar alguna CTP y referenciar librerías en el Web.config. Podéis echar un vistazo a lo &lt;a href="http://forums.asp.net/p/1045355/1594200.aspx"&gt;&lt;font color="#35537a"&gt;descrito en este foro&lt;/font&gt;&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Esta solución sin embargo no es muy recomendable en estos momentos, puesto que estaríamos introduciendo en un proyecto librerías y componentes que, en primer lugar, están ideados sólo para probar y tomar contacto con las nuevas tecnologías, y, en segundo lugar, las características presentadas en ellos pueden modificarse o incluso eliminarse de las futuras versiones.&lt;br /&gt;&lt;br /&gt;Existen otras formas de hacerlo, como la descrita en &lt;a href="http://siderite.blogspot.com/2007/08/invalidoperationexception-circular.html"&gt;&lt;font color="#35537a"&gt;siderite&lt;/font&gt;&lt;/a&gt;, que consiste en crear un conversor justo a la medida de nuestras necesidades extendiendo la clase &lt;code&gt;JavaScriptConverter&lt;/code&gt;, aunque aún me parecía una salida demasiado compleja al problema.&lt;br /&gt;&lt;br /&gt;Sin embargo, la solución que he visto más simple es utilizar XML para la seriación de estas entidades, lo que se puede lograr de una forma muy sencilla añadiendo al método a utilizar un atributo modificando el formato de respuesta utilizado por defecto, de JSON a XML.&lt;br /&gt;&lt;br /&gt;He creado un &lt;a href="http://www.snapdrive.net/files/415885/AJAXPageStaticDatasetMethod.zip"&gt;&lt;font color="#35537a"&gt;proyecto de demostración para VS2005&lt;/font&gt;&lt;/a&gt;, esta vez en VB.NET aunque la traducción a C# es directa, con una página llamada &lt;strong&gt;DataSetPageMethods.aspx&lt;/strong&gt; en el que se establece un &lt;em&gt;PageMethod&lt;/em&gt; en el lado del servidor, con la siguiente signatura:&lt;a href="http://bp1.blogger.com/_O9D62hXq-ng/R2WCLL0Wb_I/AAAAAAAAAO0/iqAOP1VwYZI/s1600-h/PageMethodsDataSet.jpg"&gt;&lt;img id="BLOGGER_PHOTO_ID_5144661278003195890" style="FLOAT:right;MARGIN:0px 0px 10px 10px;CURSOR:hand;" alt="" src="http://bp1.blogger.com/_O9D62hXq-ng/R2WCLL0Wb_I/AAAAAAAAAO0/iqAOP1VwYZI/s320/PageMethodsDataSet.jpg" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/p&gt;&lt;pre&gt;&lt;code&gt;&lt;br /&gt; &amp;lt;WebMethod()&amp;gt; _&lt;br /&gt; &amp;lt;Script.Services.ScriptMethod(ResponseFormat:=ResponseFormat.Xml)&amp;gt; _&lt;br /&gt; &lt;strong&gt;Public Shared Function ObtenerClientes(ByVal ciudad As String) As DataSet&lt;/strong&gt;&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;br /&gt;Este método estático obtendrá de la tradicional base de datos NorthWind (en italiano, eso sí, no tenía otra a mano O:-)) un &lt;em&gt;DataSet&lt;/em&gt; con los clientes asociados a la ciudad cuyo nombre se recibe como parámetro.&lt;br /&gt;&lt;br /&gt;Como podréis observar, el método está precedido por la declaración de dos atributos. El primero de ellos, &lt;code&gt;WebMethod()&lt;/code&gt;, lo define como un &lt;em&gt;PageMethod &lt;/em&gt;y lo hará visible desde cliente de forma directa. El segundo de ellos redefine su mecanismo de seriación por defecto, pasándolo a XML. Si queréis ver el error al que hacía referencia al principio, podéis modificar el valor del &lt;code&gt;ResponseFormat&lt;/code&gt; a &lt;em&gt;JSON&lt;/em&gt;, su valor por defecto.&lt;br /&gt;&lt;br /&gt;Desde cliente, al cargar la página rellenamos un desplegable con las distintas ciudades. Cuando el usuario selecciona un elemento y pulsa el botón &amp;quot;¡Pulsa!&amp;quot;, se realizará una llamada asíncrona al &lt;em&gt;PageMethod&lt;/em&gt;, según el código:&lt;br /&gt;&lt;/p&gt;&lt;pre&gt;&lt;code&gt;function llamar()&lt;br /&gt;{  &lt;br /&gt;  PageMethods.ObtenerClientes($get(&amp;quot;&amp;lt;%= DropDownList1.ClientID %&amp;gt;&amp;quot;).value , OnOK, OnError); &lt;br /&gt;}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;br /&gt;La función callback de notificación de finalización de la operación, &lt;code&gt;OnOk&lt;/code&gt;, recibirá el &lt;code&gt;DataSet&lt;/code&gt; del servidor y mostrará en la página dos resúmenes de los datos obtenidos que describiré a continuación. He querido hacerlo así para demostrar dos posibles alternativas a la hora de procesar desde cliente los datos recibidos, el &lt;code&gt;DataSet&lt;/code&gt;, desde servidor.&lt;br /&gt;&lt;br /&gt;En el primer ejemplo, se crea en cliente una lista sin orden con los nombres de las personas de contacto de los clientes (valga la redundancia ;-)), donde muestro cómo es posible utilizar el DOM para realizar recorridos sobre el conjunto de datos:&lt;br /&gt;&lt;/p&gt;&lt;pre&gt;&lt;code&gt; var nds = data.documentElement.getElementsByTagName(&amp;quot;NewDataSet&amp;quot;);&lt;br /&gt; var rows = nds[0].getElementsByTagName(&amp;quot;Table&amp;quot;);&lt;br /&gt; var st = rows.length + &amp;quot; filas. Personas: &amp;nbsp;br /&amp;gt;&amp;quot;;&lt;br /&gt; st += &amp;quot;&amp;lt;ul&amp;gt;&amp;quot;;&lt;br /&gt; for(var i = 0; i &amp;lt; rows.length; i++)&lt;br /&gt; {&lt;br /&gt;   st += &amp;quot;&amp;lt;li&amp;gt;&amp;quot; + getText(rows[ i ].getElementsByTagName(&amp;quot;Contatto&amp;quot;)[ 0 ])+ &amp;quot;&amp;lt;/li&amp;gt;&amp;quot;;&lt;br /&gt; }&lt;br /&gt; st += &amp;quot;&amp;lt;/ul&amp;gt;&amp;quot;;&lt;br /&gt; etiqueta.innerHTML = st;&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;br /&gt;En el segundo ejemplo se muestra otra posibilidad, la utilización de DOM para crear una función recursiva que recorra en profundidad la estructura XML mostrando la información contenida. La función javascript que realiza esta tarea se llama &lt;code&gt;procesaXml&lt;/code&gt;.&lt;br /&gt;&lt;br /&gt;Como se puede comprobar analizando el código, utilizar la información del &lt;code&gt;DataSet&lt;/code&gt; en cliente es necesario, en cualquier caso, un conocimiento de la estructura interna de est tipo de datos, lo cual no es sencillo, por lo que &lt;em&gt;recomendaría enviar y gestionar los &lt;em&gt;DataSets&lt;/em&gt; en cliente sólo cuando no haya más remedio&lt;/em&gt;.&lt;br /&gt;&lt;br /&gt;Una alternativa que además de resultar menos pesada en términos de ancho de banda y proceso requerido para su tratamiento es bastante más sencilla de implementar sería enviar a cliente la información incluida un un array, donde cada elemento sería del tipo de datos apropiado (por ejemplo, un array de Personas, Facturas, o lo que sea). La seriación será JSON, mucho más optimizada, además de resultar simplísimo su tratamiento en javascript.&lt;br /&gt;&lt;br /&gt;El proyecto de demostración también incluye una página (&lt;strong&gt;ArrayPageMethods.aspx&lt;/strong&gt;) donde está implementado un método que devuelve un array del tipo &lt;code&gt;Datos&lt;/code&gt;, cuya representación se lleva también a cliente y hace muy sencillo su uso, como se puede observar en esta versión de la función de retorno &lt;code&gt;OnOk&lt;/code&gt;:&lt;br /&gt;&lt;/p&gt;&lt;pre&gt;&lt;code&gt;function OnOK(datos)&lt;br /&gt;{   &lt;br /&gt;  var etiqueta = $get(&amp;quot;lblMensajes&amp;quot;);   &lt;br /&gt;  var s = &amp;quot;&amp;lt;ul&amp;gt;&amp;quot;;&lt;br /&gt;  for (var i = 0; i &amp;lt; datos.length; i++)&lt;br /&gt;  {&lt;br /&gt;    s += &amp;quot;&amp;lt;li&amp;gt;&amp;quot; + datos[ i ].Contacto;&lt;br /&gt;    s += &amp;quot;. Tel: &amp;quot; + datos[ i ].Telefono;&lt;br /&gt;    s += &amp;quot;&amp;lt;/li&amp;gt;&amp;quot;;&lt;br /&gt;  }&lt;br /&gt;  s += &amp;quot;&amp;lt;/ul&amp;gt;&amp;quot;;&lt;br /&gt;  etiqueta.innerHTML = s;&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Por último, comentar que el proyecto de ejemplo funciona también con VS2008 (Web Developer Express), aunque hay que abrirlo como una web existente.&lt;br /&gt;&lt;br /&gt;Publicado en: &lt;a href="http://www.variablenotfound.com/"&gt;&lt;font color="#35537a"&gt;www.variablenotfound.com&lt;/font&gt;&lt;/a&gt;.&lt;br /&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;br /&gt;Enlace: &lt;a href="http://www.snapdrive.net/files/415885/AJAXPageStaticDatasetMethod.zip"&gt;&lt;font color="#35537a"&gt;Descargar proyecto VS2005&lt;/font&gt;&lt;/a&gt;.&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=58215" width="1" height="1"&gt;</description><category domain="http://geeks.ms/blogs/jmaguilar/archive/tags/desarrollo/default.aspx">desarrollo</category><category domain="http://geeks.ms/blogs/jmaguilar/archive/tags/programaci_26002300_243_3B00_n/default.aspx">programaci&amp;#243;n</category><category domain="http://geeks.ms/blogs/jmaguilar/archive/tags/asp.net/default.aspx">asp.net</category><category domain="http://geeks.ms/blogs/jmaguilar/archive/tags/.net/default.aspx">.net</category><category domain="http://geeks.ms/blogs/jmaguilar/archive/tags/javascript/default.aspx">javascript</category><category domain="http://geeks.ms/blogs/jmaguilar/archive/tags/scripting/default.aspx">scripting</category><category domain="http://geeks.ms/blogs/jmaguilar/archive/tags/nivel+medio/default.aspx">nivel medio</category><category domain="http://geeks.ms/blogs/jmaguilar/archive/tags/consultas/default.aspx">consultas</category><category domain="http://geeks.ms/blogs/jmaguilar/archive/tags/ajax/default.aspx">ajax</category></item></channel></rss>