<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	xmlns:media="http://search.yahoo.com/mrss/"
	>

<channel>
	<title>Blackout360</title>
	<atom:link href="http://blackout360.wordpress.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://blackout360.wordpress.com</link>
	<description>.Net Developer with an iMac</description>
	<lastBuildDate>Tue, 03 Nov 2009 23:04:28 +0000</lastBuildDate>
	<generator>http://wordpress.com/</generator>
	<language>es</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<cloud domain='blackout360.wordpress.com' port='80' path='/?rsscloud=notify' registerProcedure='' protocol='http-post' />
<image>
		<url>http://www.gravatar.com/blavatar/72126b343434609611f9e8972f37f853?s=96&#038;d=http://s.wordpress.com/i/buttonw-com.png</url>
		<title>Blackout360</title>
		<link>http://blackout360.wordpress.com</link>
	</image>
			<item>
		<title>ASP.NET MVC y NHibernate (Partes 1 y 2)</title>
		<link>http://blackout360.wordpress.com/2009/11/03/asp-net-mvc-y-nhibernate-partes-1-y-2/</link>
		<comments>http://blackout360.wordpress.com/2009/11/03/asp-net-mvc-y-nhibernate-partes-1-y-2/#comments</comments>
		<pubDate>Tue, 03 Nov 2009 23:04:28 +0000</pubDate>
		<dc:creator>blackout360</dc:creator>
				<category><![CDATA[ASP.NET]]></category>
		<category><![CDATA[Aplicaciones]]></category>
		<category><![CDATA[Tutorial]]></category>

		<guid isPermaLink="false">http://blackout360.wordpress.com/2009/11/03/asp-net-mvc-y-nhibernate-partes-1-y-2/</guid>
		<description><![CDATA[Tengo publicados dos artículos sobre cómo empezar a trabajar con NHibernate y ASP.NET MVC, puede leerlos desde el sitio de ForerunnerG34:

&#160;Using ASP.NET MVC and NHibernate (Part 1) 
Using ASP.NET MVC and NHibernate (Part 2) 

Espero les sirva de ayuda para las personas que recién están empezando con NHibernate&#34;!
       <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blackout360.wordpress.com&blog=2725327&post=574&subd=blackout360&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p align="justify">Tengo publicados dos artículos sobre cómo empezar a trabajar con <a href="http://nhforge.org/Default.aspx">NHibernate</a> y <a href="http://www.asp.net/mvc">ASP.NET MVC</a>, puede leerlos desde el sitio de ForerunnerG34:</p>
<ul>
<li>&#160;<a href="http://forerunnerg34.wordpress.com/2009/11/03/using-asp-net-mvc-and-nhibernate-part-1/">Using ASP.NET MVC and NHibernate (Part 1)</a> </li>
<li><a href="http://forerunnerg34.wordpress.com/2009/11/03/using-asp-net-mvc-and-nhibernate-part-2/">Using ASP.NET MVC and NHibernate (Part 2)</a> </li>
</ul>
<p>Espero les sirva de ayuda para las personas que recién están empezando con NHibernate&quot;!</p>
  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/blackout360.wordpress.com/574/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/blackout360.wordpress.com/574/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/blackout360.wordpress.com/574/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/blackout360.wordpress.com/574/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/blackout360.wordpress.com/574/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/blackout360.wordpress.com/574/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/blackout360.wordpress.com/574/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/blackout360.wordpress.com/574/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/blackout360.wordpress.com/574/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/blackout360.wordpress.com/574/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blackout360.wordpress.com&blog=2725327&post=574&subd=blackout360&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://blackout360.wordpress.com/2009/11/03/asp-net-mvc-y-nhibernate-partes-1-y-2/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/7ae4015ed5758b8db26b1663365fba2f?s=96&#38;d=wavatar" medium="image">
			<media:title type="html">GriffonWrath</media:title>
		</media:content>
	</item>
		<item>
		<title>Bienvenido Forerunner-G34</title>
		<link>http://blackout360.wordpress.com/2009/10/30/bienvenido-forerunner-g34/</link>
		<comments>http://blackout360.wordpress.com/2009/10/30/bienvenido-forerunner-g34/#comments</comments>
		<pubDate>Fri, 30 Oct 2009 18:10:06 +0000</pubDate>
		<dc:creator>blackout360</dc:creator>
				<category><![CDATA[ASP.NET]]></category>
		<category><![CDATA[Noticias]]></category>
		<category><![CDATA[WPF]]></category>

		<guid isPermaLink="false">http://blackout360.wordpress.com/2009/10/30/bienvenido-forerunner-g34/</guid>
		<description><![CDATA[
Mi nuevo blog sobre ASP.NET y WPF (and it’s Green):   [ http://forerunnerg34.wordpress.com ]
       <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blackout360.wordpress.com&blog=2725327&post=571&subd=blackout360&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p align="center"><a href="http://forerunnerg34.wordpress.com"><img style="display:inline;border-width:0;" title="forerunenrG34" border="0" alt="forerunenrG34" src="http://blackout360.files.wordpress.com/2009/10/forerunenrg34.png?w=361&#038;h=307" width="361" height="307" /></a></p>
<p align="center">Mi nuevo blog sobre ASP.NET y WPF (and it’s Green):   <br />[ <a href="http://forerunnerg34.wordpress.com">http://forerunnerg34.wordpress.com</a> ]</p>
  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/blackout360.wordpress.com/571/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/blackout360.wordpress.com/571/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/blackout360.wordpress.com/571/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/blackout360.wordpress.com/571/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/blackout360.wordpress.com/571/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/blackout360.wordpress.com/571/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/blackout360.wordpress.com/571/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/blackout360.wordpress.com/571/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/blackout360.wordpress.com/571/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/blackout360.wordpress.com/571/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blackout360.wordpress.com&blog=2725327&post=571&subd=blackout360&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://blackout360.wordpress.com/2009/10/30/bienvenido-forerunner-g34/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/7ae4015ed5758b8db26b1663365fba2f?s=96&#38;d=wavatar" medium="image">
			<media:title type="html">GriffonWrath</media:title>
		</media:content>

		<media:content url="http://blackout360.files.wordpress.com/2009/10/forerunenrg34.png" medium="image">
			<media:title type="html">forerunenrG34</media:title>
		</media:content>
	</item>
		<item>
		<title>Forzar comentarios en SVN</title>
		<link>http://blackout360.wordpress.com/2009/10/15/forzar-comentarios-en-svn/</link>
		<comments>http://blackout360.wordpress.com/2009/10/15/forzar-comentarios-en-svn/#comments</comments>
		<pubDate>Thu, 15 Oct 2009 22:15:51 +0000</pubDate>
		<dc:creator>blackout360</dc:creator>
				<category><![CDATA[Tutorial]]></category>

		<guid isPermaLink="false">http://blackout360.wordpress.com/2009/10/15/forzar-comentarios-en-svn/</guid>
		<description><![CDATA[Continuando con los temas relacionados a SubVersion, encontré este script para marcar como requeridos los comentarios antes de hacer commit de los cambios en el SVN. Esta es la forma de habilitar esta función usando Visual SVN Server:
Habiendo seleccionado un repositorio, seleccione “Propiedades” del menú contextual (click derecho sobre el repositorio):
 
De la ventana propiedades [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blackout360.wordpress.com&blog=2725327&post=564&subd=blackout360&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p align="justify">Continuando con los temas relacionados a SubVersion, encontré este <a href="http://www.anujgakhar.com/2008/02/14/how-to-force-comments-on-svn-commit/" target="_blank">script</a> para marcar como requeridos los comentarios antes de hacer commit de los cambios en el SVN. Esta es la forma de habilitar esta función usando Visual SVN Server:</p>
<p align="justify">Habiendo seleccionado un repositorio, seleccione “Propiedades” del menú contextual (click derecho sobre el repositorio):</p>
<p><a href="http://blackout360.files.wordpress.com/2009/10/image6.png"><img style="display:block;float:none;margin-left:auto;margin-right:auto;border-width:0;" title="image" border="0" alt="image" src="http://blackout360.files.wordpress.com/2009/10/image_thumb6.png?w=240&#038;h=225" width="240" height="225" /></a> </p>
<p align="justify">De la ventana propiedades seleccione la pestaña “Hooks”, luego “Pre-commit hook” y clic en “Edit…”</p>
<p><a href="http://blackout360.files.wordpress.com/2009/10/image7.png"><img style="display:block;float:none;margin-left:auto;margin-right:auto;border-width:0;" title="image" border="0" alt="image" src="http://blackout360.files.wordpress.com/2009/10/image_thumb7.png?w=186&#038;h=240" width="186" height="240" /></a> </p>
<p align="justify">Finalmente copie y pegue el siguiente script y guarde todos los cambios.</p>
<p><font color="#00ff00">@echo off      <br />::       <br />:: Stops commits that have empty log messages.       <br />::       <br />@echo off       <br />setlocal       <br />rem Subversion sends through the path to the repository and transaction id       <br />set REPOS=%1       <br />set TXN=%2       <br />rem check for an empty log message       <br />svnlook log %REPOS% -t %TXN% | findstr . &gt; nul       <br />if %errorlevel% gtr 0 (goto err) else exit 0       <br />:err       <br />echo. 1&gt;&amp;2       <br />echo Su commit ha sido bloqueado porque no ingresó ningún comentario. 1&gt;&amp;2       <br />echo Por favor escriba un comentario describiendo el propósito de sus cambios y 1&gt;&amp;2       <br />echo luego intente realizar nuevamente un commit. &#8212; Gracias 1&gt;&amp;2       <br />echo. 1&gt;&amp;2       <br />echo &#8212; Si no tienes nada que comentar, entonces probablemente no tienes nada que hacer commit.&#8211;&#160; 1&gt;&amp;2 </font></p>
<p><font color="#00ff00">exit 1</font></p>
</p>
<p align="justify">Ahora cuando se intente guardar cambios o nuevo contenido sin ingresar comentarios, SVN bloqueará el proceso de commit:</p>
<p><a href="http://blackout360.files.wordpress.com/2009/10/image8.png"><img style="display:block;float:none;margin-left:auto;margin-right:auto;" title="image" alt="image" src="http://blackout360.files.wordpress.com/2009/10/image_thumb8.png?w=240&#038;h=110" width="240" height="110" /></a></p>
  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/blackout360.wordpress.com/564/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/blackout360.wordpress.com/564/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/blackout360.wordpress.com/564/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/blackout360.wordpress.com/564/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/blackout360.wordpress.com/564/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/blackout360.wordpress.com/564/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/blackout360.wordpress.com/564/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/blackout360.wordpress.com/564/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/blackout360.wordpress.com/564/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/blackout360.wordpress.com/564/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blackout360.wordpress.com&blog=2725327&post=564&subd=blackout360&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://blackout360.wordpress.com/2009/10/15/forzar-comentarios-en-svn/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/7ae4015ed5758b8db26b1663365fba2f?s=96&#38;d=wavatar" medium="image">
			<media:title type="html">GriffonWrath</media:title>
		</media:content>

		<media:content url="http://blackout360.files.wordpress.com/2009/10/image_thumb6.png" medium="image">
			<media:title type="html">image</media:title>
		</media:content>

		<media:content url="http://blackout360.files.wordpress.com/2009/10/image_thumb7.png" medium="image">
			<media:title type="html">image</media:title>
		</media:content>

		<media:content url="http://blackout360.files.wordpress.com/2009/10/image_thumb8.png" medium="image">
			<media:title type="html">image</media:title>
		</media:content>
	</item>
		<item>
		<title>KDE 4.3 parece Snow Leopard mezclado con Windows 7</title>
		<link>http://blackout360.wordpress.com/2009/10/15/kde-4-3-parece-snow-leopard-mezclado-con-windows-7/</link>
		<comments>http://blackout360.wordpress.com/2009/10/15/kde-4-3-parece-snow-leopard-mezclado-con-windows-7/#comments</comments>
		<pubDate>Thu, 15 Oct 2009 20:45:17 +0000</pubDate>
		<dc:creator>blackout360</dc:creator>
				<category><![CDATA[Opinion]]></category>

		<guid isPermaLink="false">http://blackout360.wordpress.com/2009/10/15/kde-4-3-parece-snow-leopard-mezclado-con-windows-7/</guid>
		<description><![CDATA[Esto no tiene nada que ver ni con .Net, ni Apple ni Microsoft, es solo que se me viene a la mente que el nuevo KDE 4.3 y su tema “Plasma” es la fusión de Snow Leopard y Windows 7.
&#160;

       <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blackout360.wordpress.com&blog=2725327&post=557&subd=blackout360&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p align="justify">Esto no tiene nada que ver ni con .Net, ni Apple ni Microsoft, es solo que se me viene a la mente que el nuevo KDE 4.3 y su tema “Plasma” es la fusión de Snow Leopard y Windows 7.</p>
<p>&#160;</p>
<p><a href="http://blackout360.files.wordpress.com/2009/10/kde430desktop.png"><img style="border-bottom:0;border-left:0;display:inline;border-top:0;border-right:0;" title="kde430-desktop" border="0" alt="kde430-desktop" src="http://blackout360.files.wordpress.com/2009/10/kde430desktop_thumb.png?w=410&#038;h=341" width="410" height="341" /></a></p>
  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/blackout360.wordpress.com/557/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/blackout360.wordpress.com/557/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/blackout360.wordpress.com/557/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/blackout360.wordpress.com/557/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/blackout360.wordpress.com/557/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/blackout360.wordpress.com/557/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/blackout360.wordpress.com/557/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/blackout360.wordpress.com/557/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/blackout360.wordpress.com/557/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/blackout360.wordpress.com/557/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blackout360.wordpress.com&blog=2725327&post=557&subd=blackout360&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://blackout360.wordpress.com/2009/10/15/kde-4-3-parece-snow-leopard-mezclado-con-windows-7/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/7ae4015ed5758b8db26b1663365fba2f?s=96&#38;d=wavatar" medium="image">
			<media:title type="html">GriffonWrath</media:title>
		</media:content>

		<media:content url="http://blackout360.files.wordpress.com/2009/10/kde430desktop_thumb.png" medium="image">
			<media:title type="html">kde430-desktop</media:title>
		</media:content>
	</item>
		<item>
		<title>Usando SVN</title>
		<link>http://blackout360.wordpress.com/2009/10/15/usando-svn/</link>
		<comments>http://blackout360.wordpress.com/2009/10/15/usando-svn/#comments</comments>
		<pubDate>Thu, 15 Oct 2009 16:24:50 +0000</pubDate>
		<dc:creator>blackout360</dc:creator>
				<category><![CDATA[Aplicaciones]]></category>
		<category><![CDATA[Tutorial]]></category>

		<guid isPermaLink="false">http://blackout360.wordpress.com/2009/10/15/usando-svn/</guid>
		<description><![CDATA[&#160;
En un post anterior comentaba sobre herramientas para control de código fuente, y entre ellas estaba probando Subversion (SVN) la cuál explicaré ahora un poco mas a detalle:
Herramientas
Subversion (de ahora en adelante SVN) es una herramienta para&#160; el control de código fuente, independiente de la tecnología de desarrollo o IDE. Para la administración del servidor [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blackout360.wordpress.com&blog=2725327&post=550&subd=blackout360&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p align="justify">&#160;</p>
<p align="justify">En un <a href="http://blackout360.wordpress.com/2009/10/15/control-de-cdigo-fuente/">post anterior comentaba sobre herramientas para control de código fuente</a>, y entre ellas estaba probando Subversion (SVN) la cuál explicaré ahora un poco mas a detalle:</p>
<h2>Herramientas</h2>
<p align="justify">Subversion (de ahora en adelante SVN) es una herramienta para&#160; el control de código fuente, independiente de la tecnología de desarrollo o IDE. Para la administración del servidor y cliente se usa principalmente la línea de comandos, pero también existe herramientas visuales tanto para el lado del servidor como del cliente que nos facilitan en el trabajo:</p>
<ul>
<li>
<div align="justify"><strong><a href="http://www.visualsvn.com/" target="_blank">VisualSVN</a></strong>: Permite configurar y administrar de forma simple y rápida el servidor.</div>
</li>
<li>
<div align="justify"><strong><a href="http://tortoisesvn.tigris.org/" target="_blank">TortoiseSVN</a></strong>: Excelente herramienta de cliente para SVN, se integra con el shell de Windows.</div>
</li>
<li>
<div align="justify">Desde luego que también necesitamos descargar e instalar <a href="subversion.tigris.org" target="_blank">Subversion</a>.</div>
</li>
</ul>
<h2>Repositorios</h2>
<p align="justify">SVN permite crear varios repositorios, por ejemplo podemos tener dos:</p>
<ul>
<li>
<div align="justify">“<strong>DevTeam</strong>”: Donde se almacena la línea principal de desarrollo de nuestras aplicaciones.</div>
</li>
<li>
<div align="justify">“<strong>Sandbox</strong>”: Repositorio personal donde puedo subir cosas personales de prueba o de investigación.</div>
</li>
</ul>
<p align="justify">Usando VisualSVN también podemos configruar el servidor para que soporte comunicación segura via el protocolo Https, y la autenticación y autorización integrada a un servidor LDAP, por lo que podemos usar nuestras credenciales del red para entrar al servidor.</p>
<p align="justify">&#160;</p>
<h2>Proyectos y su organización</h2>
<p align="justify">Los proyectos de desarrollo se crean dentro de los Repositorios, normalmente cada proyecto nuevo tiene la siguiente estructura inicial: <em>branches</em>, <em>tags</em> y <em>trunk</em>, que son simplemente carpetas que nos ayudan a organizar el proyecto y se recomienda que todos tengan esa estructura:</p>
<p align="justify">&#160;</p>
<h4>Trunk</h4>
<p align="justify">Dentro de esta carpeta se almacena todo el código del proyecto, el que está constantemente siendo modificado por el equipo de desarrollo.</p>
<h4>Branches</h4>
<p align="justify">Permite tener ramificaciones del proyecto, por ejemplo: si tenemos una primera versión de la aplicación lista para que sea probada crearíamos un branch llamando “Certificacion-1.0” con una copia del contenido del “trunk”. En este punto tendríamos dos líneas de desarrollo: el “trunk” donde se seguirían agregando nuevas funcionalidades y el branch “Certificacion-1.0” donde se daría soporte a la primera versión del producto, como la corrección de bugs. SVN nos permite sincronizar el trunk con cualquier branch y viceversa, de al forma que si se detecta un bug en el branch “Certificacion-1.0”´ el código que lo corrige (llamando ChangeSet) se lo puede fusionar al trunk principal. Una vez que se finalice el proceso de pruebas se puede reintegrar todo el branch al trunk para fusionar los cambios.</p>
<p align="justify"><strong>TIP</strong>: N<strong>o es bueno esperar al último momento </strong>para fusionar las dos ramas ya que se podrían dar grandes conflictos, es mejor hacerlo con anticipación, cada cierto tiempo y por grupos para evitar problemas en el futuro.</p>
<h4>Tags</h4>
<p align="justify">Esta carpeta nos permite representar estados del proyecto que están listos para ser entregados, por ejemplo: “Version-1.0”, “Version-1.1”, “Version-2.0”. Siguiendo el ejemplo anterior: luego de corregir todos los incidentes del branch “Certificacion-1.0” crearíamos un Tag&#160; nuevo llamado “Version-1.0” con el contenido del branch y, posteriormente borraríamos el branch “Certificacion-1.0”.</p>
<p>&#160;</p>
<h2>Ignorar archivos y carpetas</h2>
<p align="justify">SVN puede ser configurado para no incluir en el repositorio los archivos o carpetas que le especifiquemos, para esto se usan propiedades que se configuran en el lado del cliente. Estas propiedades pueden ser exportadas para que otro cliente las aplique. </p>
<p align="justify"><a href="http://blackout360.files.wordpress.com/2009/10/image9.png"><img style="border-bottom:0;border-left:0;display:block;float:none;margin-left:auto;border-top:0;margin-right:auto;border-right:0;" title="image" border="0" alt="image" src="http://blackout360.files.wordpress.com/2009/10/image_thumb9.png?w=240&#038;h=161" width="240" height="161" /></a> </p>
<p align="justify"><strong>IMPORTANTE: </strong>Si un archivo ya fue subido al servidor, y luego se lo agrega en la lista de elementos que se deben ignorar, SVN no hará caso a esa propiedad ya que tienen prioridad los elementos que ya están bajo el control de código fuente, es decir SVN seguirá versionando el archivo.</p>
<p align="justify">&#160;</p>
<h2>TortoiseSVN</h2>
<p align="justify">TortoiseSVN es una herramienta muy buena que se integra al shell de Windows y permite interactuar con el repositorio, nos permite entre otras cosas:</p>
<ol>
<li>
<div align="justify">Crear proyectos en el repositorio</div>
</li>
<li>
<div align="justify">Importar contenido</div>
</li>
<li>
<div align="justify">Actualizar contenido</div>
</li>
<li>
<div align="justify">Agregar propiedades</div>
</li>
<li>
<div align="justify">Crear branches y tags</div>
</li>
<li>
<div align="justify">Comparar versiones</div>
</li>
<li>
<div align="justify">Resolver conflictos entre archivos</div>
</li>
<li>
<div align="justify">Deshacer cambios</div>
</li>
</ol>
  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/blackout360.wordpress.com/550/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/blackout360.wordpress.com/550/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/blackout360.wordpress.com/550/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/blackout360.wordpress.com/550/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/blackout360.wordpress.com/550/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/blackout360.wordpress.com/550/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/blackout360.wordpress.com/550/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/blackout360.wordpress.com/550/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/blackout360.wordpress.com/550/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/blackout360.wordpress.com/550/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blackout360.wordpress.com&blog=2725327&post=550&subd=blackout360&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://blackout360.wordpress.com/2009/10/15/usando-svn/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/7ae4015ed5758b8db26b1663365fba2f?s=96&#38;d=wavatar" medium="image">
			<media:title type="html">GriffonWrath</media:title>
		</media:content>

		<media:content url="http://blackout360.files.wordpress.com/2009/10/image_thumb9.png" medium="image">
			<media:title type="html">image</media:title>
		</media:content>
	</item>
		<item>
		<title>Control de C&#243;digo Fuente</title>
		<link>http://blackout360.wordpress.com/2009/10/15/control-de-cdigo-fuente/</link>
		<comments>http://blackout360.wordpress.com/2009/10/15/control-de-cdigo-fuente/#comments</comments>
		<pubDate>Thu, 15 Oct 2009 16:12:35 +0000</pubDate>
		<dc:creator>blackout360</dc:creator>
				<category><![CDATA[Opinion]]></category>

		<guid isPermaLink="false">http://blackout360.wordpress.com/2009/10/15/control-de-cdigo-fuente/</guid>
		<description><![CDATA[&#160;
El control de código fuente es un tema importante durante el desarrollo de software, ya que nos permite primero que nada respaldar nuestro trabajo en un servidor central, y adicionalmente otros usuarios pueden trabajar sobre dichos archivos. En el caso de un daño grave de la computadora donde trabajamos no perderíamos algo tan valioso como [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blackout360.wordpress.com&blog=2725327&post=547&subd=blackout360&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p align="justify">&#160;</p>
<p align="justify">El control de código fuente es un tema importante durante el desarrollo de software, ya que nos permite primero que nada respaldar nuestro trabajo en un servidor central, y adicionalmente otros usuarios pueden trabajar sobre dichos archivos. En el caso de un daño grave de la computadora donde trabajamos no perderíamos algo tan valioso como el código que se hemos generado.</p>
<p align="justify">Existen algunos herramientas para control de código fuente, probablemente conozcan de <strong>Source Safe</strong> de Microsoft, que fue descontinuada luego de la versión 2005 para convertirse en Team Foundation. En todo caso esa herramienta está fuertemente ligada al trabajo con el IDE de Visual Studio. En un ambiente multidisciplinario por ejemplo donde se trabajan con mas de un IDE o algunas veces sin ninguno, talvez SourceSafe no cumpla con todos los requerimientos.</p>
<p align="justify">Otro punto importante sobre el control de código fuente es la actualización concurrente de archivos, en SourceSafe existe el mecanismo de:</p>
<p align="justify"><strong>Lock –&gt; Update –&gt; Unlock</strong></p>
<p align="justify">Lo que significa que para poder cambiar un archivo, primero se aplica un bloqueo sobre el mismo en el lado del servidor, luego el usuario puede cambiar el archivo, y finalmente cuando lo sube al servidor, este es desbloquedo. Esto tiene la principal característica de que cuando un usuario A está trabajando sobre un archivo F, un usuario B no podrá cambiar ese archivo hasta que el usuario A lo desbloquee. Es decir la edición de archivos es secuencial, en lo personal pienso que este trae mas molestias que ventajas ya que se pierde tiempo esperando que otro usuario desbloquee el archivo para poder seguir trabajando.</p>
<p align="justify">Otros tipos de soluciones como <strong>SVN</strong> (<strong>Subversion</strong>) siguen un modelo:</p>
<p align="justify"><strong>Copy–&gt; Update&#160; -&gt; Merge </strong></p>
<p align="justify">En SVN cuando un usuario hace un “checkout” de un archivo, éste no queda bloqueado en el servidor, -de tal forma que otro usuario puede hacer lo mismo-, luego de realizar los cambios y querer subirlos al servidor SVN compara la copia local (working copy) con el contenido del servidor, si el contenido original no cambió mientras se modificaba el archivo, éste es copiado al servidor, caso contrario: si mientras estábamos editando el archivo, otro usuario alteró también el contenido, se realiza un proceso de <strong>MERGE</strong> (fusión) del contenido de ambas versiones, en el caso de que exista algún conflicto que SVN no pueda resolver, se le presenta al usuario las herramientas para comparar ambas versiones y <strong>solucionar los conflictos</strong> manualmente. Adicionalmente SVN lleva un número de revisón del proyecto, lo que nos permite conocer si tenemos o no la última versión del proyecto en nuestra carpeta local.</p>
<p align="justify">SVN es ampliamente usado a nivel mundial, gratuito y existen varios clientes para poder trabajar con este servidor, antes había usado esta herramienta, y actualmente estoy probando la versión oficial de SVN.</p>
<p><strong>Mayor información:</strong></p>
<p>Sitio oficial de SVN: <a title="http://subversion.tigris.org/" href="http://subversion.tigris.org/">http://subversion.tigris.org/</a></p>
  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/blackout360.wordpress.com/547/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/blackout360.wordpress.com/547/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/blackout360.wordpress.com/547/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/blackout360.wordpress.com/547/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/blackout360.wordpress.com/547/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/blackout360.wordpress.com/547/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/blackout360.wordpress.com/547/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/blackout360.wordpress.com/547/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/blackout360.wordpress.com/547/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/blackout360.wordpress.com/547/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blackout360.wordpress.com&blog=2725327&post=547&subd=blackout360&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://blackout360.wordpress.com/2009/10/15/control-de-cdigo-fuente/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/7ae4015ed5758b8db26b1663365fba2f?s=96&#38;d=wavatar" medium="image">
			<media:title type="html">GriffonWrath</media:title>
		</media:content>
	</item>
		<item>
		<title>Un peque&#241;o paraiso llamado Mindo. En Ecuador!!</title>
		<link>http://blackout360.wordpress.com/2009/10/14/un-pequeo-paraiso-llamado-mindo-en-ecuador/</link>
		<comments>http://blackout360.wordpress.com/2009/10/14/un-pequeo-paraiso-llamado-mindo-en-ecuador/#comments</comments>
		<pubDate>Wed, 14 Oct 2009 15:36:06 +0000</pubDate>
		<dc:creator>blackout360</dc:creator>
				<category><![CDATA[Opinion]]></category>

		<guid isPermaLink="false">http://blackout360.wordpress.com/2009/10/14/un-pequeo-paraiso-llamado-mindo-en-ecuador/</guid>
		<description><![CDATA[&#160;
Este fin de semana fue excelente, pasamos dos días en Mindo haciendo deportes de aventura. Aquí les dejo unas pocas fotos que tomé de los lugares que visitamos:
   
 
  
 

       <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blackout360.wordpress.com&blog=2725327&post=545&subd=blackout360&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>&#160;</p>
<p align="justify">Este fin de semana fue excelente, pasamos dos días en Mindo haciendo deportes de aventura. Aquí les dejo unas pocas fotos que tomé de los lugares que visitamos:</p>
<p align="center"><a href="http://blackout360.files.wordpress.com/2009/10/p1000505.jpg"><img style="border-bottom:0;border-left:0;display:inline;border-top:0;border-right:0;" title="P1000505" border="0" alt="P1000505" src="http://blackout360.files.wordpress.com/2009/10/p1000505_thumb.jpg?w=240&#038;h=180" width="240" height="180" /></a> <a href="http://blackout360.files.wordpress.com/2009/10/p1000517.jpg"><img style="border-bottom:0;border-left:0;display:inline;border-top:0;border-right:0;" title="P1000517" border="0" alt="P1000517" src="http://blackout360.files.wordpress.com/2009/10/p1000517_thumb.jpg?w=240&#038;h=180" width="240" height="180" /></a> <a href="http://blackout360.files.wordpress.com/2009/10/p1000518.jpg"><img style="border-bottom:0;border-left:0;display:inline;border-top:0;border-right:0;" title="P1000518" border="0" alt="P1000518" src="http://blackout360.files.wordpress.com/2009/10/p1000518_thumb.jpg?w=240&#038;h=180" width="240" height="180" /></a> </p>
<p align="center"><a href="http://blackout360.files.wordpress.com/2009/10/p1000508.jpg"><img style="border-bottom:0;border-left:0;display:inline;border-top:0;border-right:0;" title="P1000508" border="0" alt="P1000508" src="http://blackout360.files.wordpress.com/2009/10/p1000508_thumb.jpg?w=240&#038;h=180" width="240" height="180" /></a> </p>
<p align="center"><a href="http://blackout360.files.wordpress.com/2009/10/p1000519.jpg"><img style="border-bottom:0;border-left:0;display:inline;border-top:0;border-right:0;" title="P1000519" border="0" alt="P1000519" src="http://blackout360.files.wordpress.com/2009/10/p1000519_thumb.jpg?w=240&#038;h=180" width="240" height="180" /></a> <a href="http://blackout360.files.wordpress.com/2009/10/p1000594.jpg"><img style="border-bottom:0;border-left:0;display:inline;border-top:0;border-right:0;" title="P1000594" border="0" alt="P1000594" src="http://blackout360.files.wordpress.com/2009/10/p1000594_thumb.jpg?w=240&#038;h=180" width="240" height="180" /></a> </p>
<p align="center"><a href="http://blackout360.files.wordpress.com/2009/10/p1000577.jpg"><img style="border-bottom:0;border-left:0;display:inline;border-top:0;border-right:0;" title="P1000577" border="0" alt="P1000577" src="http://blackout360.files.wordpress.com/2009/10/p1000577_thumb.jpg?w=240&#038;h=180" width="240" height="180" /></a> </p>
<p align="center"><a href="http://blackout360.files.wordpress.com/2009/10/p1000583.jpg"><img style="border-bottom:0;border-left:0;display:inline;border-top:0;border-right:0;" title="P1000583" border="0" alt="P1000583" src="http://blackout360.files.wordpress.com/2009/10/p1000583_thumb.jpg?w=240&#038;h=180" width="240" height="180" /></a></p>
  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/blackout360.wordpress.com/545/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/blackout360.wordpress.com/545/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/blackout360.wordpress.com/545/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/blackout360.wordpress.com/545/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/blackout360.wordpress.com/545/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/blackout360.wordpress.com/545/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/blackout360.wordpress.com/545/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/blackout360.wordpress.com/545/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/blackout360.wordpress.com/545/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/blackout360.wordpress.com/545/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blackout360.wordpress.com&blog=2725327&post=545&subd=blackout360&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://blackout360.wordpress.com/2009/10/14/un-pequeo-paraiso-llamado-mindo-en-ecuador/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/7ae4015ed5758b8db26b1663365fba2f?s=96&#38;d=wavatar" medium="image">
			<media:title type="html">GriffonWrath</media:title>
		</media:content>

		<media:content url="http://blackout360.files.wordpress.com/2009/10/p1000505_thumb.jpg" medium="image">
			<media:title type="html">P1000505</media:title>
		</media:content>

		<media:content url="http://blackout360.files.wordpress.com/2009/10/p1000517_thumb.jpg" medium="image">
			<media:title type="html">P1000517</media:title>
		</media:content>

		<media:content url="http://blackout360.files.wordpress.com/2009/10/p1000518_thumb.jpg" medium="image">
			<media:title type="html">P1000518</media:title>
		</media:content>

		<media:content url="http://blackout360.files.wordpress.com/2009/10/p1000508_thumb.jpg" medium="image">
			<media:title type="html">P1000508</media:title>
		</media:content>

		<media:content url="http://blackout360.files.wordpress.com/2009/10/p1000519_thumb.jpg" medium="image">
			<media:title type="html">P1000519</media:title>
		</media:content>

		<media:content url="http://blackout360.files.wordpress.com/2009/10/p1000594_thumb.jpg" medium="image">
			<media:title type="html">P1000594</media:title>
		</media:content>

		<media:content url="http://blackout360.files.wordpress.com/2009/10/p1000577_thumb.jpg" medium="image">
			<media:title type="html">P1000577</media:title>
		</media:content>

		<media:content url="http://blackout360.files.wordpress.com/2009/10/p1000583_thumb.jpg" medium="image">
			<media:title type="html">P1000583</media:title>
		</media:content>
	</item>
		<item>
		<title>HTML Render de controles ASP.NET</title>
		<link>http://blackout360.wordpress.com/2009/10/02/html-render-de-controles-asp-net/</link>
		<comments>http://blackout360.wordpress.com/2009/10/02/html-render-de-controles-asp-net/#comments</comments>
		<pubDate>Fri, 02 Oct 2009 17:44:05 +0000</pubDate>
		<dc:creator>blackout360</dc:creator>
				<category><![CDATA[ASP.NET]]></category>
		<category><![CDATA[Microsoft]]></category>
		<category><![CDATA[Tutorial]]></category>

		<guid isPermaLink="false">http://blackout360.wordpress.com/2009/10/02/html-render-de-controles-asp-net/</guid>
		<description><![CDATA[&#160;
Hace algún tiempo, en una compañía dedicada a consultaría Web en donde trabajaba surgió un requerimiento de “integrar” ASP.NET con un CMS que permite únicamente tener contenido estático HTML, CSS y JavaScript en tiempo de diseño.
El escenario era el siguiente:


Un sitio en ASP.NET con varios User Controls.


Los editores usan el CMS para crear nuevas páginas, [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blackout360.wordpress.com&blog=2725327&post=526&subd=blackout360&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>&#160;</p>
<p align="justify">Hace algún tiempo, en una compañía dedicada a consultaría Web en donde trabajaba surgió un requerimiento de “integrar” ASP.NET con un CMS que permite únicamente tener contenido estático HTML, CSS y JavaScript en tiempo de diseño.</p>
<p align="justify">El escenario era el siguiente:</p>
<ol>
<li>
<div align="justify">Un sitio en ASP.NET con varios User Controls.</div>
</li>
<li>
<div align="justify">Los editores usan el CMS para crear nuevas páginas, y en tiempo de diseño pueden insertar los controles de usuario del proyecto de ASP.NET.</div>
</li>
<li>
<div align="justify">En tiempo de diseño, el CMS no soporta ASP.NET.</div>
</li>
<li>
<div align="justify">Cuando el editor envía a publicar las páginas, estas son copiadas dentro del sitio ASP.NET, donde recién el código ASP.NET podrá ser ejecutado.</div>
</li>
<li>
<div align="justify">En tiempo de diseño del CMS, el editor debe poder ver el preview de los controles de ASP.NET.</div>
</li>
</ol>
<p align="justify">Era una tarea bastante interesante, la cual de lo que me comentaron no se había podido realizar antes, por suerte con un poco C# se me ocurrió la siguiente idea:</p>
<p align="justify">Crear una página en el proyecto ASP.NET que reciba como parámetros el nombre del UserControl que se debe mostrar y los parámetros para inicializarlo, luego obtener el HTML resultante y devolverlo al cliente como una función JavaScript. De esta forma quien quiera mostrar un control de usuario en sitios no ASP.NET, solo necesita usar un poco de JavaScript (muy poco a decir verdad).</p>
<h2>RenderControl.aspx</h2>
<p align="justify">Esta es la página que recibe como parámetro en el QueryString el nombre del User Control y crea dinámicamente una función JavaScript con el HTML resultante. Adicionalmente el UserControl puede recibir parámetros de entrada como Strings, Booleanos, o números. Haciendo uso de Reflection, esta página se encarga de asignar dinámicamente estas propiedades antes de dibujar el control.</p>
<h2>Creando los User Controls</h2>
<p>Lo primero que haremos es crear unos 3 controles de usuario de ejemplo:</p>
<p align="justify"><a href="http://blackout360.files.wordpress.com/2009/10/image.png"><img style="border-bottom:0;border-left:0;display:inline;margin-left:0;border-top:0;margin-right:0;border-right:0;" title="image" border="0" alt="image" align="left" src="http://blackout360.files.wordpress.com/2009/10/image_thumb.png?w=240&#038;h=113" width="240" height="113" /></a> <strong>AllUsers.ascx</strong>: Contiene un ASp.NET GridView con una lista de usuarios obtenida de un archivo XML.</p>
<p>&#160;</p>
<p>&#160;</p>
<p align="justify"><a href="http://blackout360.files.wordpress.com/2009/10/image1.png"><img style="border-bottom:0;border-left:0;display:inline;margin-left:0;border-top:0;margin-right:0;border-right:0;" title="image" border="0" alt="image" align="left" src="http://blackout360.files.wordpress.com/2009/10/image_thumb1.png?w=240&#038;h=173" width="240" height="173" /></a> <strong>MyCalendar.ascx</strong>: Contiene un ASP.NET Calendar</p>
<p>&#160;</p>
<p>&#160;</p>
<p>&#160;</p>
<p>&#160;</p>
<p>&#160;</p>
<p align="justify"><a href="http://blackout360.files.wordpress.com/2009/10/image2.png"><img style="border-bottom:0;border-left:0;display:inline;margin-left:0;border-top:0;margin-right:0;border-right:0;" title="image" border="0" alt="image" align="left" src="http://blackout360.files.wordpress.com/2009/10/image_thumb2.png?w=240&#038;h=99" width="240" height="99" /></a> <strong>UserProfile.ascx</strong>: Muestra los datos de un usuario especificado, el usuario se asigna usando la propiedad Username, la cual lee de nu archivo XML los datos del usuario.</p>
<p><font color="#00ff00" size="2" face="Courier New">public string Username     <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; {      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; set      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; {      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; lblUsername.Text = value;      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; LoadProfile();      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; }      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; get      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; {      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; return lblUsername.Text;      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; }      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; } </font></p>
<p><font color="#00ff00" size="2" face="Courier New">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; private void LoadProfile()     <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; {      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; if (!String.IsNullOrEmpty(lblUsername.Text))      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; {      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; XDocument userXml = XDocument.Load(Server.MapPath(&quot;Data/Users.xml&quot;)); </font></p>
<p><font color="#00ff00" size="2" face="Courier New">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; var userProfile = (from user in userXml.Descendants(&quot;user&quot;)     <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; where user.Attribute(&quot;id&quot;).Value == lblUsername.Text      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; select user).Single(); </font></p>
<p><font color="#00ff00" size="2" face="Courier New">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; lblFirstname.Text = userProfile.Attribute(&quot;firstName&quot;).Value;     <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; lblLastname.Text = userProfile.Attribute(&quot;lastName&quot;).Value;      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; lblRole.Text = userProfile.Attribute(&quot;role&quot;).Value;      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; }      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; }</font></p>
<p><a href="http://blackout360.files.wordpress.com/2009/10/image3.png"><img style="border-bottom:0;border-left:0;display:block;float:none;margin-left:auto;border-top:0;margin-right:auto;border-right:0;" title="image" border="0" alt="image" src="http://blackout360.files.wordpress.com/2009/10/image_thumb3.png?w=240&#038;h=195" width="240" height="195" /></a> </p>
<p>Estos son User Controls normales, que pueden tener elementos ASP.NET cuyo HTML resultando será mostrado en otro sitio externo.</p>
<h2>Crear la función JavaScript</h2>
<p align="justify">Para que nuestra página RenderContro.aspx sea capaz de dibujar el control y devolver código JavaScript necesitamos sobreescribir dos métodos de la clase Page: </p>
<ol>
<li>
<div align="justify">CreateHtmlTextWriter</div>
</li>
<li>
<div align="justify">Render</div>
</li>
</ol>
<p align="justify">Si recordamos el ciclo de vida de una página ASP.NET: Init, Load, Render y Unload, nos damos cuenta de que justamente el método Render es el encargado de “dibujar en la página” el contenido:</p>
<p align="justify"><font color="#00ff00" size="2" face="Courier New">StringWriter sw = new StringWriter();     <br />HtmlTextWriter pageWriter = null;</font></p>
<p align="justify"><font color="#00ff00" size="2" face="Courier New">protected override HtmlTextWriter CreateHtmlTextWriter(TextWriter tw)     <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; {      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; pageWriter = base.CreateHtmlTextWriter(tw);      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; return base.CreateHtmlTextWriter(sw);      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; } </font></p>
<p align="justify"><font color="#00ff00" size="2" face="Courier New">&#160;&#160;&#160;&#160;&#160;&#160;&#160; protected override void Render(HtmlTextWriter writer)     <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; {      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; base.Render(writer);      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; string html = sw.ToString();      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; html = html.Replace(Environment.NewLine, String.Empty);      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; html = html.Replace(&quot;\&quot;&quot;, &quot;&#8217;&quot;); </font></p>
<p align="justify"><font color="#00ff00" size="2" face="Courier New">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; string script = &quot;function render_&quot; + controlName + uniqueId + &quot;() { document.write(\&quot;&quot; + html + &quot;\&quot;);}&quot;; </font></p>
<p align="justify"><font color="#00ff00" size="2" face="Courier New">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; pageWriter.Write(script);     <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; }</font></p>
<p align="justify">En el método CreateHtmlTextWriter estamos pasando un objeto StringWriter en lugar del predeterminado (TextWriter), es en este objeto donde el método Render insertará el código HTML de los controles. Todo el contenido de la página en forma de HTML, cualqueira que se este, será escrito dentro de nuestro&#160; StringWriter, y posteriormente podremos manipularlo según nuestras necesidades.</p>
<p align="justify">En el método Render modificamos el HTML antes de que s dibuje en la página, de tal forma que el resultado sea una función JavaScript con el método document.write.</p>
<p align="justify">La función es creada dinámicamente y se forma de la siguiente forma:</p>
<ol>
<li>
<div align="justify">El prefijo “render_”</div>
</li>
<li>
<div align="justify">El nombre del control.</div>
</li>
<li>
<div align="justify">Un identificador único para el nombre de la función.</div>
</li>
<li>
<div align="justify">El cuerpo de la función consiste del método document.write y el contenido es el HTML resultando de la página.</div>
</li>
</ol>
<p align="justify"><strong>NOTA</strong>: Es siempre importante remover saltos de línea y comillas que del contenido puedan generar errores en la función JavaScript.</p>
<p align="justify">Insertar el control dinámicamente</p>
<p align="justify">La última parte de nuestro proyecto es insertar el control dinámicamente en la página para que se cree la función JavaScript. Insertar un control dinámicamente es muy sencillo en ASp.NET:</p>
<p align="justify"><font color="#00ff00"><font size="2" face="Courier New">Control ctrl = LoadControl(@&quot;~\UserControls\&quot; + controlName + &quot;.ascx&quot;);        <br /></font><font size="2" face="Courier New">canvas.Controls.Add(ctrl);</font></font></p>
<p align="justify">La parte interesante está en asginar las propiedades de forma dinámica a cada control. Por ejemplo asignar el valor de la propiedad <strong>Username</strong> de control <strong>UserProfile</strong>. Esto lo logré usando Reflection, gracias a esto puedo asignar el valor de cualqueir propiedad cuyo tipo de dato soporte el método Parse:</p>
<p><font color="#00ff00" size="2" face="Courier New">private void SetProperties(Control ctrl)     <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; {      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; Type controlType = ctrl.GetType();      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; List&lt;PropertyInfo&gt; properties =&#160; controlType.GetProperties().ToList&lt;PropertyInfo&gt;(); </font></p>
<p><font color="#00ff00" size="2" face="Courier New">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; foreach (var qs in Request.QueryString)     <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; {      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; if (!qs.ToString().Equals(qsControl, StringComparison.InvariantCultureIgnoreCase)       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &amp;&amp; !qs.ToString().Equals(qsUniqueId, StringComparison.InvariantCultureIgnoreCase))      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; {      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; PropertyInfo currentProperty = properties.Find(delegate(PropertyInfo pi)      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; {      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; return pi.Name == qs.ToString();      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; }); </font></p>
<p><font color="#00ff00" size="2" face="Courier New">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; if (currentProperty != null)     <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; {      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; if (currentProperty.PropertyType.Name == &quot;String&quot;)      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; {      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; currentProperty.SetValue(ctrl, Request.QueryString[qs.ToString()], null);      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; }      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; if (currentProperty.PropertyType.GetMember(&quot;Parse&quot;).Length &gt; 0)      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; {      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; Object parsedValue = currentProperty.PropertyType.InvokeMember(&quot;Parse&quot;, BindingFlags.InvokeMethod, null, ctrl, new object[] { Request.QueryString[qs.ToString()] });      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; currentProperty.SetValue(ctrl, parsedValue, null);      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; }      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; }      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; }      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; }      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; }</font></p>
</p>
<p align="justify">Este método recibe como parámetro el Control y lee del QueryString las propiedades que se le deben asignar mediante Reflection. De especial interés es el siguiente bloque de código:</p>
<p><font color="#00ff00" size="2" face="Courier New">if (currentProperty.PropertyType.GetMember(&quot;Parse&quot;).Length &gt; 0)     <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; {      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; Object parsedValue = currentProperty.PropertyType.InvokeMember(&quot;Parse&quot;, BindingFlags.InvokeMethod, null, ctrl, new object[] { Request.QueryString[qs.ToString()] });      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; currentProperty.SetValue(ctrl, parsedValue, null);      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; }</font></p>
<p align="justify">Esta sección de código permite transformar el valor de la propiedad que siempre viene como String al tipo de dato que espera la propiedad, por ejemplo Bool o Int. La transformación se la hace invocando dinámicamente el método <strong>Parse</strong> del tipo de datos de la propiedad.</p>
<p>Finalmente ya podemos incrustar controles ASP.NET en paginas desarrolladas en otras tecnologías, o páginas simples HTML, así:</p>
<p><font color="#00ff00" size="2" face="Courier New">&lt;head&gt;     <br />&#160;&#160;&#160; &lt;title&gt;&lt;/title&gt;      <br />&#160;&#160;&#160; &lt;script src=&quot;RenderControl.aspx?control=UserProfile&amp;Username=cintriago&amp;UpperCase=true&quot;&gt;&lt;/script&gt;      <br />&#160;&#160;&#160; &lt;script src=&quot;RenderControl.aspx?control=UserProfile&amp;uniqueId=2&amp;Username=jane&quot;&gt;&lt;/script&gt;      <br />&#160;&#160;&#160; &lt;script src=&quot;RenderControl.aspx?control=UserProfile&amp;uniqueId=3&amp;Username=john&quot;&gt;&lt;/script&gt;      <br />&#160;&#160;&#160; &lt;script src=&quot;RenderControl.aspx?control=AllUsers&quot;&gt;&lt;/script&gt;      <br />&#160;&#160;&#160; &lt;script src=&quot;RenderControl.aspx?control=MyCalendar&quot;&gt;&lt;/script&gt;      <br />&lt;/head&gt;      <br />&lt;body&gt;      <br /> &lt;script language=&quot;javascript&quot; type=&quot;text/javascript&quot;&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160; render_AllUsers();&lt;/script&gt;      <br />&#160;&#160;&#160; &lt;script language=&quot;javascript&quot; type=&quot;text/javascript&quot;&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160; render_UserProfile();&lt;/script&gt;      <br />&#160;&#160;&#160; &lt;script language=&quot;javascript&quot; type=&quot;text/javascript&quot;&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160; render_UserProfile2();&lt;/script&gt;      <br />&#160;&#160;&#160; &lt;script language=&quot;javascript&quot; type=&quot;text/javascript&quot;&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160; render_MyCalendar();&lt;/script&gt;      <br />&#160;&#160;&#160; &lt;script language=&quot;javascript&quot; type=&quot;text/javascript&quot;&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160; render_UserProfile3();&lt;/script&gt;      <br />&lt;/body&gt;      <br />&lt;/html&gt;</font></p>
<p>Y en el navegador tendremos el siguiente resultado:</p>
<p align="justify"><a href="http://blackout360.files.wordpress.com/2009/10/image4.png"><img style="border-bottom:0;border-left:0;display:block;float:none;margin-left:auto;border-top:0;margin-right:auto;border-right:0;" title="image" border="0" alt="image" src="http://blackout360.files.wordpress.com/2009/10/image_thumb4.png?w=240&#038;h=195" width="240" height="195" /></a> Espero que este artículo les haya pareceido de utilidad en interés. Cualquier duda, comentario o sugerencia es bienvenida. Hasta la próxima!!.</p>
</p>
</p>
<p align="center"><a href="http://cid-926d6677262767bd.skydrive.live.com/self.aspx/Blackout360/WebRenderApplication.zip" target="_blank"><font size="4">Bajar el proyecto y código fuente</font></a></p>
  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/blackout360.wordpress.com/526/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/blackout360.wordpress.com/526/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/blackout360.wordpress.com/526/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/blackout360.wordpress.com/526/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/blackout360.wordpress.com/526/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/blackout360.wordpress.com/526/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/blackout360.wordpress.com/526/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/blackout360.wordpress.com/526/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/blackout360.wordpress.com/526/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/blackout360.wordpress.com/526/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blackout360.wordpress.com&blog=2725327&post=526&subd=blackout360&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://blackout360.wordpress.com/2009/10/02/html-render-de-controles-asp-net/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/7ae4015ed5758b8db26b1663365fba2f?s=96&#38;d=wavatar" medium="image">
			<media:title type="html">GriffonWrath</media:title>
		</media:content>

		<media:content url="http://blackout360.files.wordpress.com/2009/10/image_thumb.png" medium="image">
			<media:title type="html">image</media:title>
		</media:content>

		<media:content url="http://blackout360.files.wordpress.com/2009/10/image_thumb1.png" medium="image">
			<media:title type="html">image</media:title>
		</media:content>

		<media:content url="http://blackout360.files.wordpress.com/2009/10/image_thumb2.png" medium="image">
			<media:title type="html">image</media:title>
		</media:content>

		<media:content url="http://blackout360.files.wordpress.com/2009/10/image_thumb3.png" medium="image">
			<media:title type="html">image</media:title>
		</media:content>

		<media:content url="http://blackout360.files.wordpress.com/2009/10/image_thumb4.png" medium="image">
			<media:title type="html">image</media:title>
		</media:content>
	</item>
		<item>
		<title>ASP.NET MVC 2 Preview 2 Liberado</title>
		<link>http://blackout360.wordpress.com/2009/10/01/asp-net-mvc-2-preview-2-liberado/</link>
		<comments>http://blackout360.wordpress.com/2009/10/01/asp-net-mvc-2-preview-2-liberado/#comments</comments>
		<pubDate>Thu, 01 Oct 2009 19:42:30 +0000</pubDate>
		<dc:creator>blackout360</dc:creator>
				<category><![CDATA[ASP.NET]]></category>
		<category><![CDATA[Microsoft]]></category>
		<category><![CDATA[Noticias]]></category>

		<guid isPermaLink="false">http://blackout360.wordpress.com/2009/10/01/asp-net-mvc-2-preview-2-liberado/</guid>
		<description><![CDATA[&#160;
Ya está disponible hace unos momentos el Preview 2 de ASP.NET MVC 2 el cual pueden descargar desde aquí. Desde luego existe para toda la comundiad videos y documentación para conocer las nuevas características de este framework, entre las cuales destacan:


ModelMetadata and ModelMetadataProvider Classes: Proveen mecanismos para obtener metadados del modelo de una vista.


Model Validator [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blackout360.wordpress.com&blog=2725327&post=515&subd=blackout360&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>&#160;</p>
<p align="justify">Ya está disponible hace unos momentos el Preview 2 de ASP.NET MVC 2 el cual pueden <a href="http://www.microsoft.com/downloads/details.aspx?FamilyID=d3f06bb9-5f5f-4f46-91e9-813b3fce2db1&amp;displaylang=en" target="_blank">descargar desde aquí</a>. Desde luego existe para toda la comundiad videos y documentación para conocer las nuevas características de este framework, entre las cuales destacan:</p>
<ol>
<li>
<div align="justify"><strong>ModelMetadata and ModelMetadataProvider Classes</strong>: Proveen mecanismos para obtener metadados del modelo de una vista.</div>
</li>
<li>
<div align="justify"><strong>Model Validator Providers</strong>: Mecanismos para obtener la lógica de validación del modelo.</div>
</li>
<li>
<div align="justify"><strong>Client-Side Validation</strong>: Incluye la librería de validación de jQuery 2 y también para el lado del cliente.</div>
</li>
<li>
<div align="justify"><strong>RequireHttpsAttribute Action Filter</strong>: Nuevo atributo que puede ser aplicado a acciones y controladores. De forma predeterminada las peticiones no-SSL se redirigen a la llamada SSL equivalente (en el caso de estar disponible).</div>
</li>
<li>
<div align="justify">Soporte para <strong>Single-Project Areas</strong>.</div>
</li>
</ol>
<p><a href="http://blackout360.files.wordpress.com/2009/10/clip_image002.jpg"><img style="border-bottom:0;border-left:0;display:block;float:none;margin-left:auto;border-top:0;margin-right:auto;border-right:0;" title="clip_image002" border="0" alt="clip_image002" src="http://blackout360.files.wordpress.com/2009/10/clip_image002_thumb.jpg?w=182&#038;h=240" width="182" height="240" /></a></p>
<p>&#160;</p>
<p>Les recomiendo que visiten el <a href="http://aspnet.codeplex.com/Wiki/View.aspx?title=Road%20Map&amp;referringTitle=Home" target="_blank">Roadmap</a> de ASP.NET MVC para ver es lo nuevo que se viene!.</p>
  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/blackout360.wordpress.com/515/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/blackout360.wordpress.com/515/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/blackout360.wordpress.com/515/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/blackout360.wordpress.com/515/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/blackout360.wordpress.com/515/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/blackout360.wordpress.com/515/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/blackout360.wordpress.com/515/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/blackout360.wordpress.com/515/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/blackout360.wordpress.com/515/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/blackout360.wordpress.com/515/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blackout360.wordpress.com&blog=2725327&post=515&subd=blackout360&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://blackout360.wordpress.com/2009/10/01/asp-net-mvc-2-preview-2-liberado/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/7ae4015ed5758b8db26b1663365fba2f?s=96&#38;d=wavatar" medium="image">
			<media:title type="html">GriffonWrath</media:title>
		</media:content>

		<media:content url="http://blackout360.files.wordpress.com/2009/10/clip_image002_thumb.jpg" medium="image">
			<media:title type="html">clip_image002</media:title>
		</media:content>
	</item>
		<item>
		<title>WCF y OperationBehaviors</title>
		<link>http://blackout360.wordpress.com/2009/09/30/wcf-y-operationbehaviors/</link>
		<comments>http://blackout360.wordpress.com/2009/09/30/wcf-y-operationbehaviors/#comments</comments>
		<pubDate>Wed, 30 Sep 2009 20:35:26 +0000</pubDate>
		<dc:creator>blackout360</dc:creator>
				<category><![CDATA[ASP.NET]]></category>
		<category><![CDATA[Microsoft]]></category>
		<category><![CDATA[Patrones de Diseño]]></category>
		<category><![CDATA[Tutorial]]></category>

		<guid isPermaLink="false">http://blackout360.wordpress.com/2009/09/30/wcf-y-operationbehaviors/</guid>
		<description><![CDATA[&#160;
Windows Communication Foundation nos permite desarrollar servicios en .Net&#160; de una manera rápida y sencilla, permitiendo soportar varios endpoints y esquemas de configuración. También ofrece un gran nivel de personalización, uno de ellos es poder escribir OperationBehaviors personalizados para nuestro servicio.
Un OperationBehavior nos permite cambiar y controlar el modo en que WCF ejecuta un método, [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blackout360.wordpress.com&blog=2725327&post=512&subd=blackout360&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>&#160;</p>
<p align="justify">Windows Communication Foundation nos permite desarrollar servicios en .Net&#160; de una manera rápida y sencilla, permitiendo soportar varios endpoints y esquemas de configuración. También ofrece un gran nivel de personalización, uno de ellos es poder escribir OperationBehaviors personalizados para nuestro servicio.</p>
<p align="justify">Un OperationBehavior nos permite cambiar y controlar el modo en que WCF ejecuta un método, por ejemplo podemos ejecutar código automáticamente antes de que se llame a una operación o después. Este es el caso que veremos en el siguiente ejemplo:</p>
<h2>Creación del Servicio</h2>
<p align="justify">Ok manos a la obra, lo primero es crear un nuevo proyecto WCF, el cual llamaremos “CalculatorService”</p>
<p><a href="http://blackout360.files.wordpress.com/2009/09/image9.png"><img style="border-bottom:0;border-left:0;display:block;float:none;margin-left:auto;border-top:0;margin-right:auto;border-right:0;" title="image" border="0" alt="image" src="http://blackout360.files.wordpress.com/2009/09/image_thumb6.png?w=240&#038;h=221" width="240" height="221" /></a> </p>
<p align="justify">Luego agregamos dos operaciones a nuestro servicio, tanto en la interfaz como en la implementación: Add y Substract, como se ve en la siguiente figura:</p>
<p><a href="http://blackout360.files.wordpress.com/2009/09/image10.png"><img style="border-bottom:0;border-left:0;display:block;float:none;margin-left:auto;border-top:0;margin-right:auto;border-right:0;" title="image" border="0" alt="image" src="http://blackout360.files.wordpress.com/2009/09/image_thumb7.png?w=240&#038;h=195" width="240" height="195" /></a> </p>
<p align="justify">Estas dos funciones lo que hacen es agregar y restar un valor de la variable de instancia _currentValue.</p>
<p align="justify">Ejecutamos el proyecto, y Visual Studio abrirá un cliente básico para poder probar nuestro servicio:</p>
<p><a href="http://blackout360.files.wordpress.com/2009/09/image11.png"><img style="border-bottom:0;border-left:0;display:block;float:none;margin-left:auto;border-top:0;margin-right:auto;border-right:0;" title="image" border="0" alt="image" src="http://blackout360.files.wordpress.com/2009/09/image_thumb8.png?w=240&#038;h=203" width="240" height="203" /></a> </p>
</p>
<h2>Behaviors</h2>
<p align="justify">Ahora haremos algo interesante: Cada vez que se llame al método Add o Substract invocaremos de forma automática a un tercer método llamado “Audit”, esto lo hacemos usando OperationBehviors que nos permitirá tener acceso a personalizar la invocación de nuestros métodos.</p>
<p align="justify">En el proyecto de nuestro servicio WCF creamos una nueva carpeta llamada Behaviors ya agregamos una nueva clase llamada “MyOperationBehavior.cs” con el siguiente código:</p>
<p><font size="2" face="Courier New">using System;     <br />using System.Collections.Generic;      <br />using System.Linq;      <br />using System.Text;      <br />using System.ServiceModel.Description;      <br />using System.ServiceModel.Dispatcher; </font></p>
<p><font size="2" face="Courier New">namespace CalculatorService.Behaviors     <br />{      <br />&#160;&#160;&#160; public class MyOperationBehavior : Attribute, IOperationBehavior      <br />&#160;&#160;&#160; { </font></p>
<p><font size="2" face="Courier New">&#160;&#160;&#160;&#160;&#160;&#160;&#160; #region IOperationBehavior Members </font></p>
<p><font size="2" face="Courier New">&#160;&#160;&#160;&#160;&#160;&#160;&#160; public void AddBindingParameters(OperationDescription operationDescription, System.ServiceModel.Channels.BindingParameterCollection bindingParameters)     <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; {      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; } </font></p>
<p><font size="2" face="Courier New">&#160;&#160;&#160;&#160;&#160;&#160;&#160; public void ApplyClientBehavior(OperationDescription operationDescription, System.ServiceModel.Dispatcher.ClientOperation clientOperation)     <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; {      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; } </font></p>
<p><font size="2" face="Courier New">&#160;&#160;&#160;&#160;&#160;&#160;&#160; public void ApplyDispatchBehavior(OperationDescription operationDescription, System.ServiceModel.Dispatcher.DispatchOperation dispatchOperation)     <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; {</font></p>
<p><font size="2" face="Courier New">// Decorator pattern.     <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; dispatchOperation.Invoker = new MyOperationInvoker(dispatchOperation);      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; } </font></p>
<p><font size="2" face="Courier New">&#160;&#160;&#160;&#160;&#160;&#160;&#160; public void Validate(OperationDescription operationDescription)     <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; {      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; } </font></p>
<p><font size="2" face="Courier New">&#160;&#160;&#160;&#160;&#160;&#160;&#160; #endregion     <br />&#160;&#160;&#160; } </font></p>
<p><font size="2" face="Courier New">&#160;&#160;&#160; class MyOperationInvoker : IOperationInvoker     <br />&#160;&#160;&#160; {      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; private readonly IOperationInvoker _invoker;      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; private readonly System.ServiceModel.Dispatcher.DispatchOperation _dispatchOperation; </font></p>
<p><font size="2" face="Courier New">&#160;&#160;&#160;&#160;&#160;&#160;&#160; public MyOperationInvoker(System.ServiceModel.Dispatcher.DispatchOperation dispatchOperation)     <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; {      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; this._invoker = dispatchOperation.Invoker;      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; this._dispatchOperation = dispatchOperation;      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; } </font></p>
<p><font size="2" face="Courier New">&#160;&#160;&#160;&#160;&#160;&#160;&#160; private void HandleOperationRequest(object instance, object[] inputs)     <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; {      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; Service1 srv = (Service1)instance;      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; srv.Audit(_dispatchOperation.Name, inputs);      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; } </font></p>
<p><font size="2" face="Courier New">&#160;&#160;&#160;&#160;&#160;&#160;&#160; #region IOperationInvoker Members </font></p>
<p><font size="2" face="Courier New">&#160;&#160;&#160;&#160;&#160;&#160;&#160; public object[] AllocateInputs()     <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; {      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; return _invoker.AllocateInputs();      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; } </font></p>
<p><font size="2" face="Courier New">&#160;&#160;&#160;&#160;&#160;&#160;&#160; public object Invoke(object instance, object[] inputs, out object[] outputs)     <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; {      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; HandleOperationRequest(instance, inputs);      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; return _invoker.Invoke(instance, inputs, out outputs);      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; } </font></p>
<p><font size="2" face="Courier New">&#160;&#160;&#160;&#160;&#160;&#160;&#160; public IAsyncResult InvokeBegin(object instance, object[] inputs, AsyncCallback callback, object state)     <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; {      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; HandleOperationRequest(instance, inputs);      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; return _invoker.InvokeBegin(instance, inputs, callback, state);      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; } </font></p>
<p><font size="2" face="Courier New">&#160;&#160;&#160;&#160;&#160;&#160;&#160; public object InvokeEnd(object instance, out object[] outputs, IAsyncResult result)     <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; {      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; return _invoker.InvokeEnd(instance, out outputs, result);      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; } </font></p>
<p><font size="2" face="Courier New">&#160;&#160;&#160;&#160;&#160;&#160;&#160; public bool IsSynchronous     <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; {      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; get { return _invoker.IsSynchronous; }      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; } </font></p>
<p><font size="2" face="Courier New">&#160;&#160;&#160;&#160;&#160;&#160;&#160; #endregion     <br />&#160;&#160;&#160; }      <br />}</font></p>
<p align="justify">Ahora decoramos nuestros métodos Add y Substract con el atributo anterior y creamos el método “Audit”:</p>
<p><a href="http://blackout360.files.wordpress.com/2009/09/image13.png"><img style="border-bottom:0;border-left:0;display:block;float:none;margin-left:auto;border-top:0;margin-right:auto;border-right:0;" title="image" border="0" alt="image" src="http://blackout360.files.wordpress.com/2009/09/image_thumb9.png?w=240&#038;h=195" width="240" height="195" /></a> </p>
<p align="justify">Lo que hemos hecho hasta el momento es crear una clase <strong>MyOperationBehavior</strong> que se encarga de conectar el <strong>MyOperationInvoker</strong> al servicio. Al aplicar el atributo&#160; [MyOperationBehavior] en cada operación hacemos que WCF use nuestro Operation Invoker para llamar a las respectivas funciones. </p>
<p align="justify">Dentro de <strong>MyOperationInvoker </strong>estamos llamando primero al método <strong>Audit </strong>para imprimir en pantalla la operación que el usuario está a punto de ejecutar.</p>
<p align="justify">Esto nos da el control de poder ejecutar código adicional antes de que se ejecute el método que invocó el cliente (o incluso desués). Si volvemos a ejecutar el servicio podemos ver los resultados en la ventana “<strong>Output</strong>” de Visual Studio 2010.</p>
<p><a href="http://blackout360.files.wordpress.com/2009/09/image14.png"><img style="border-bottom:0;border-left:0;display:block;float:none;margin-left:auto;border-top:0;margin-right:auto;border-right:0;" title="image" border="0" alt="image" src="http://blackout360.files.wordpress.com/2009/09/image_thumb10.png?w=240&#038;h=193" width="240" height="193" /></a> </p>
<p align="justify">Nota: Este mismo resultado se pudo obtener llamando desde los métodos <strong>Add</strong> y <strong>Substract</strong> al método <strong>Audit</strong>. Pero gracias a los OperationBehaviors podemos remover esta lógica de cada posible método que tengamos y ponerla en un solo lugar.</p>
  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/blackout360.wordpress.com/512/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/blackout360.wordpress.com/512/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/blackout360.wordpress.com/512/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/blackout360.wordpress.com/512/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/blackout360.wordpress.com/512/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/blackout360.wordpress.com/512/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/blackout360.wordpress.com/512/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/blackout360.wordpress.com/512/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/blackout360.wordpress.com/512/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/blackout360.wordpress.com/512/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blackout360.wordpress.com&blog=2725327&post=512&subd=blackout360&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://blackout360.wordpress.com/2009/09/30/wcf-y-operationbehaviors/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/7ae4015ed5758b8db26b1663365fba2f?s=96&#38;d=wavatar" medium="image">
			<media:title type="html">GriffonWrath</media:title>
		</media:content>

		<media:content url="http://blackout360.files.wordpress.com/2009/09/image_thumb6.png" medium="image">
			<media:title type="html">image</media:title>
		</media:content>

		<media:content url="http://blackout360.files.wordpress.com/2009/09/image_thumb7.png" medium="image">
			<media:title type="html">image</media:title>
		</media:content>

		<media:content url="http://blackout360.files.wordpress.com/2009/09/image_thumb8.png" medium="image">
			<media:title type="html">image</media:title>
		</media:content>

		<media:content url="http://blackout360.files.wordpress.com/2009/09/image_thumb9.png" medium="image">
			<media:title type="html">image</media:title>
		</media:content>

		<media:content url="http://blackout360.files.wordpress.com/2009/09/image_thumb10.png" medium="image">
			<media:title type="html">image</media:title>
		</media:content>
	</item>
	</channel>
</rss>