<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://geeks.ms/utility/FeedStylesheets/atom.xsl" media="screen"?><feed xmlns="http://www.w3.org/2005/Atom" xml:lang=""><title type="html">.NET del día a día</title><subtitle type="html">By Ronny Carreras
MVP en ASP.NET</subtitle><id>http://geeks.ms/blogs/rcarreras/atom.aspx</id><link rel="alternate" type="text/html" href="http://geeks.ms/blogs/rcarreras/default.aspx" /><link rel="self" type="application/atom+xml" href="http://geeks.ms/blogs/rcarreras/atom.aspx" /><generator uri="http://communityserver.org" version="4.1.31106.3070">Community Server</generator><updated>2009-09-08T15:41:00Z</updated><entry><title>Validando ASP.NET Web Form con DataAnnotation en Ambos lado(Cliente y Servidor).</title><link rel="alternate" type="text/html" href="/blogs/rcarreras/archive/2010/04/20/validando-asp-net-web-form-con-dataannotation-en-ambos-lado-cliente-y-servidor.aspx" /><id>/blogs/rcarreras/archive/2010/04/20/validando-asp-net-web-form-con-dataannotation-en-ambos-lado-cliente-y-servidor.aspx</id><published>2010-04-20T19:01:00Z</published><updated>2010-04-20T19:01:00Z</updated><content type="html">&lt;p&gt;DataAnnotation es el namespace que desde el SP1 de .NET Framework 3.5 ha sido incluido para hacer validaciones a los campos definidos en un modelo de datos (Entity Framework por Ejemplo), la funcionalidad se muestra mucho en ASP.NET MVC y se utiliza definiendo atributos de validacion a un objeto; atributos que son aprovechados en ASP.NET MVC para hacer validaciones automaticas. En estos dias estoy involucrado en un proyecto de Webform que contiene un monton de clases y objetos, es por eso que he querido utilizar esta funcionalidad para reutilizar codigo disminuyendo considerablemente la cantidad de validadores que conlleva cada formulario web.&lt;/p&gt;
&lt;p&gt;Si se busca en internet vemos que en la version actual de ASP.NET MVC (version 2) se logra combinar DataAnnotation con JQuery Validators para hacer validaciones tanto del lado del servidor como del lado del cliente con el minimo esfuerzo de programacion, pero si esa funcionalidad se quiere incorporar en ASP.NET Webform, se hace cuesta arriba buscar alternativas para hacer un trabajo similar.&amp;nbsp; Es por eso que he decidio compartir este codigo implementado luego de algunas horas de investigacion por parte de mis compa&amp;ntilde;eros y yo involucrados en el proyecto.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;La finalidad es la siguiente:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Hacer uso de DataAnnotation para centralizar las validaciones de los objetos. &lt;/li&gt;
&lt;li&gt;Simplificar y Retulizar el codigo utilizado para validacion. &lt;/li&gt;
&lt;li&gt;Tener Validacion del lado del servidor, asi como tambien del lado del cliente con el minimo esfuerzo. &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Incluyendo el namespace System.ComponentModel.DataAnnotations en nuestra clase de personas podemos hacer lo siguiente:&lt;/p&gt;
&lt;pre class="code"&gt;&lt;span style="color:blue;"&gt;public class &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;Person&lt;br /&gt;   &lt;/span&gt;{&lt;br /&gt;&lt;br /&gt;       &lt;span style="color:green;"&gt;//Public Properties&lt;br /&gt;       &lt;/span&gt;[&lt;span style="color:#2b91af;"&gt;Display&lt;/span&gt;(Name = &lt;span style="color:#a31515;"&gt;&amp;quot;Nombre&amp;quot;&lt;/span&gt;)]&lt;br /&gt;       [&lt;span style="color:#2b91af;"&gt;Required&lt;/span&gt;(ErrorMessage = &lt;span style="color:#a31515;"&gt;&amp;quot;El nombre es requerido.&amp;quot;&lt;/span&gt;)]&lt;br /&gt;       [&lt;span style="color:#2b91af;"&gt;StringLength&lt;/span&gt;(35)]&lt;br /&gt;       &lt;span style="color:blue;"&gt;public string &lt;/span&gt;Name { &lt;span style="color:blue;"&gt;get&lt;/span&gt;; &lt;span style="color:blue;"&gt;set&lt;/span&gt;; }&lt;br /&gt;&lt;br /&gt;       [&lt;span style="color:#2b91af;"&gt;Display&lt;/span&gt;(Name = &lt;span style="color:#a31515;"&gt;&amp;quot;Apellido&amp;quot;&lt;/span&gt;)]&lt;br /&gt;       [&lt;span style="color:#2b91af;"&gt;Required&lt;/span&gt;(ErrorMessage = &lt;span style="color:#a31515;"&gt;&amp;quot;El apellido es requerido.&amp;quot;&lt;/span&gt;)]&lt;br /&gt;       [&lt;span style="color:#2b91af;"&gt;StringLength&lt;/span&gt;(35)]&lt;br /&gt;       &lt;span style="color:blue;"&gt;public string &lt;/span&gt;LastName { &lt;span style="color:blue;"&gt;get&lt;/span&gt;; &lt;span style="color:blue;"&gt;set&lt;/span&gt;; }&lt;br /&gt;&lt;br /&gt;       [&lt;span style="color:#2b91af;"&gt;Display&lt;/span&gt;(Name = &lt;span style="color:#a31515;"&gt;&amp;quot;Edad&amp;quot;&lt;/span&gt;)]&lt;br /&gt;       [&lt;span style="color:#2b91af;"&gt;Required&lt;/span&gt;(ErrorMessage = &lt;span style="color:#a31515;"&gt;&amp;quot;La edad es requerida.&amp;quot;&lt;/span&gt;)]&lt;br /&gt;       [&lt;span style="color:#2b91af;"&gt;Range&lt;/span&gt;(&lt;span style="color:blue;"&gt;typeof&lt;/span&gt;(&lt;span style="color:#2b91af;"&gt;Int32&lt;/span&gt;), &lt;span style="color:#a31515;"&gt;&amp;quot;18&amp;quot;&lt;/span&gt;, &lt;span style="color:#a31515;"&gt;&amp;quot;65&amp;quot;&lt;/span&gt;, &lt;br /&gt;       ErrorMessage = &lt;span style="color:#a31515;"&gt;&amp;quot;La edad debe ser entre 18 y 65 a&amp;ntilde;os.&amp;quot;&lt;/span&gt;)]&lt;br /&gt;       &lt;span style="color:blue;"&gt;public int &lt;/span&gt;Age { &lt;span style="color:blue;"&gt;get&lt;/span&gt;; &lt;span style="color:blue;"&gt;set&lt;/span&gt;; }&lt;br /&gt;&lt;br /&gt;       [&lt;span style="color:#2b91af;"&gt;Display&lt;/span&gt;(Name = &lt;span style="color:#a31515;"&gt;&amp;quot;Email&amp;quot;&lt;/span&gt;)]&lt;br /&gt;       [&lt;span style="color:#2b91af;"&gt;RegularExpression&lt;/span&gt;(&lt;span style="color:#a31515;"&gt;@&amp;quot;\w+([-+.&amp;#39;]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*&amp;quot;&lt;/span&gt;, &lt;br /&gt;       ErrorMessage = &lt;span style="color:#a31515;"&gt;&amp;quot;El email es inv&amp;aacute;lido.&amp;quot;&lt;/span&gt;)]&lt;br /&gt;       &lt;span style="color:blue;"&gt;public string &lt;/span&gt;Email { &lt;span style="color:blue;"&gt;get&lt;/span&gt;; &lt;span style="color:blue;"&gt;set&lt;/span&gt;; }&lt;br /&gt;&lt;br /&gt;       &lt;span style="color:blue;"&gt;public &lt;/span&gt;Person()&lt;br /&gt;       {&lt;br /&gt;&lt;br /&gt;       }&lt;br /&gt;   }&lt;/pre&gt;
&lt;p&gt;
&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;div class="csharpcode"&gt;&amp;nbsp;&lt;/div&gt;
&lt;p style="width:450px;"&gt;


&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Como podemos observar ante de cada propiedad hay algunos atributos&amp;nbsp; que son colocados de acuerdo a los tipo de validacion que querramos hacer.&amp;nbsp; Una vez incluido los atributos crearemos un &amp;ldquo;Custom Validator&amp;rdquo; que procese cada atributo de la propiedad segun el ASP.NET Control asociado a dicha propiedad.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre class="code"&gt;&lt;span style="color:blue;"&gt;public class &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;DACustomVal &lt;/span&gt;: &lt;span style="color:#2b91af;"&gt;BaseValidator&lt;br /&gt;   &lt;/span&gt;{&lt;br /&gt;&lt;br /&gt;       &lt;span style="color:blue;"&gt;public string &lt;/span&gt;PropertyName { &lt;span style="color:blue;"&gt;get&lt;/span&gt;; &lt;span style="color:blue;"&gt;set&lt;/span&gt;; }&lt;br /&gt;       &lt;span style="color:blue;"&gt;public string &lt;/span&gt;SourceType { &lt;span style="color:blue;"&gt;get&lt;/span&gt;; &lt;span style="color:blue;"&gt;set&lt;/span&gt;; }&lt;br /&gt;&lt;br /&gt;       &lt;span style="color:blue;"&gt;protected override bool &lt;/span&gt;EvaluateIsValid()&lt;br /&gt;       {&lt;br /&gt;           &lt;span style="color:green;"&gt;//Obtenemos la info del tipo, propiedades y del control.&lt;br /&gt;           &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;Type &lt;/span&gt;objType = &lt;span style="color:#2b91af;"&gt;Type&lt;/span&gt;.GetType(SourceType, &lt;span style="color:blue;"&gt;true&lt;/span&gt;, &lt;span style="color:blue;"&gt;true&lt;/span&gt;);&lt;br /&gt;           &lt;span style="color:#2b91af;"&gt;PropertyInfo &lt;/span&gt;propInfo = objType.GetProperty(PropertyName);&lt;br /&gt;           &lt;span style="color:#2b91af;"&gt;Control &lt;/span&gt;control = &lt;span style="color:blue;"&gt;this&lt;/span&gt;.FindControl(&lt;span style="color:blue;"&gt;this&lt;/span&gt;.ControlToValidate);&lt;br /&gt;&lt;br /&gt;           &lt;span style="color:green;"&gt;//Verificamos si el control es de tipo textbox.&lt;br /&gt;           &lt;/span&gt;&lt;span style="color:blue;"&gt;if &lt;/span&gt;(control &lt;span style="color:blue;"&gt;is &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;TextBox&lt;/span&gt;)&lt;br /&gt;           {&lt;br /&gt;               &lt;span style="color:#2b91af;"&gt;TextBox &lt;/span&gt;txt = &lt;span style="color:blue;"&gt;this&lt;/span&gt;.FindControl(&lt;span style="color:blue;"&gt;this&lt;/span&gt;.ControlToValidate) &lt;span style="color:blue;"&gt;as &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;TextBox&lt;/span&gt;;&lt;br /&gt;               &lt;span style="color:blue;"&gt;foreach &lt;/span&gt;(&lt;span style="color:#2b91af;"&gt;ValidationAttribute &lt;/span&gt;attr &lt;span style="color:blue;"&gt;in &lt;br /&gt;&lt;/span&gt;propInfo.GetCustomAttributes(&lt;span style="color:blue;"&gt;typeof&lt;/span&gt;(&lt;span style="color:#2b91af;"&gt;ValidationAttribute&lt;/span&gt;), &lt;span style="color:blue;"&gt;true&lt;/span&gt;).OfType&amp;lt;&lt;span style="color:#2b91af;"&gt;ValidationAttribute&lt;/span&gt;&amp;gt;())&lt;br /&gt;               {&lt;br /&gt;                   &lt;span style="color:blue;"&gt;if &lt;/span&gt;(!attr.IsValid(txt.Text))&lt;br /&gt;                   {&lt;br /&gt;                       &lt;span style="color:green;"&gt;//this.Text = attr.ErrorMessage;&lt;br /&gt;                       &lt;/span&gt;&lt;span style="color:blue;"&gt;this&lt;/span&gt;.ErrorMessage = attr.ErrorMessage;                        &lt;br /&gt;                       &lt;span style="color:blue;"&gt;return false&lt;/span&gt;;&lt;br /&gt;                   }&lt;br /&gt;               }&lt;br /&gt;           }&lt;br /&gt;           &lt;span style="color:green;"&gt;//Verificamos si el control es un dropdownlist.&lt;br /&gt;           &lt;/span&gt;&lt;span style="color:blue;"&gt;else if &lt;/span&gt;(control &lt;span style="color:blue;"&gt;is &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;DropDownList&lt;/span&gt;)&lt;br /&gt;           {&lt;br /&gt;               &lt;span style="color:#2b91af;"&gt;DropDownList &lt;/span&gt;ddl = &lt;span style="color:blue;"&gt;this&lt;/span&gt;.FindControl(&lt;span style="color:blue;"&gt;this&lt;/span&gt;.ControlToValidate) &lt;span style="color:blue;"&gt;as &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;DropDownList&lt;/span&gt;;&lt;br /&gt;               &lt;span style="color:blue;"&gt;foreach &lt;/span&gt;(&lt;span style="color:#2b91af;"&gt;ValidationAttribute &lt;/span&gt;attr &lt;span style="color:blue;"&gt;in &lt;/span&gt;&lt;br /&gt;propInfo.GetCustomAttributes(&lt;span style="color:blue;"&gt;typeof&lt;/span&gt;(&lt;span style="color:#2b91af;"&gt;ValidationAttribute&lt;/span&gt;), &lt;span style="color:blue;"&gt;true&lt;/span&gt;).OfType&amp;lt;&lt;span style="color:#2b91af;"&gt;ValidationAttribute&lt;/span&gt;&amp;gt;())&lt;br /&gt;               {&lt;br /&gt;                   &lt;span style="color:blue;"&gt;if &lt;/span&gt;(!attr.IsValid(ddl.SelectedValue))&lt;br /&gt;                   {&lt;br /&gt;                       &lt;span style="color:blue;"&gt;this&lt;/span&gt;.Text = attr.ErrorMessage;&lt;br /&gt;                       &lt;span style="color:blue;"&gt;return false&lt;/span&gt;;&lt;br /&gt;                   }&lt;br /&gt;               }&lt;br /&gt;           }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;           &lt;span style="color:blue;"&gt;return true&lt;/span&gt;;&lt;br /&gt;       }&lt;/pre&gt;
&lt;p&gt;
&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;}

&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Una vez conluido este &amp;ldquo;Custom Validator&amp;rdquo; podemos hacer uso de este en nuestro formulario web, como se exibe a continuaci&amp;oacute;n:&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre class="code"&gt; &lt;span style="color:blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:maroon;"&gt;fieldset &lt;/span&gt;&lt;span style="color:red;"&gt;class&lt;/span&gt;&lt;span style="color:blue;"&gt;=&amp;quot;general-form&amp;quot;&amp;gt;&lt;br /&gt;      &amp;lt;&lt;/span&gt;&lt;span style="color:maroon;"&gt;h4&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;Registro de Personas&lt;span style="color:blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:maroon;"&gt;h4&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;br /&gt;       &amp;lt;&lt;/span&gt;&lt;span style="color:maroon;"&gt;asp&lt;/span&gt;&lt;span style="color:blue;"&gt;:&lt;/span&gt;&lt;span style="color:maroon;"&gt;ValidationSummary &lt;/span&gt;&lt;span style="color:red;"&gt;ID&lt;/span&gt;&lt;span style="color:blue;"&gt;=&amp;quot;vs&amp;quot; &lt;/span&gt;&lt;span style="color:red;"&gt;CssClass&lt;/span&gt;&lt;span style="color:blue;"&gt;=&amp;quot;error&amp;quot; &lt;/span&gt;&lt;span style="color:red;"&gt;runat&lt;/span&gt;&lt;span style="color:blue;"&gt;=&amp;quot;server&amp;quot; &lt;/span&gt;&lt;span style="color:red;"&gt;DisplayMode&lt;/span&gt;&lt;span style="color:blue;"&gt;=&amp;quot;BulletList&amp;quot; /&amp;gt;&lt;br /&gt;        &amp;lt;&lt;/span&gt;&lt;span style="color:maroon;"&gt;p&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;br /&gt;           &amp;lt;&lt;/span&gt;&lt;span style="color:maroon;"&gt;label &lt;/span&gt;&lt;span style="color:red;"&gt;for&lt;/span&gt;&lt;span style="color:blue;"&gt;=&amp;quot;txtName&amp;quot;&amp;gt;&lt;/span&gt;Nombre:&lt;span style="color:blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:maroon;"&gt;label&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;br /&gt;           &amp;lt;&lt;/span&gt;&lt;span style="color:maroon;"&gt;asp&lt;/span&gt;&lt;span style="color:blue;"&gt;:&lt;/span&gt;&lt;span style="color:maroon;"&gt;TextBox &lt;/span&gt;&lt;span style="color:red;"&gt;runat&lt;/span&gt;&lt;span style="color:blue;"&gt;=&amp;quot;server&amp;quot; &lt;/span&gt;&lt;span style="color:red;"&gt;ID&lt;/span&gt;&lt;span style="color:blue;"&gt;=&amp;quot;txtName&amp;quot; /&amp;gt;&lt;br /&gt;           &amp;lt;&lt;/span&gt;&lt;span style="color:maroon;"&gt;CustomDAVal&lt;/span&gt;&lt;span style="color:blue;"&gt;:&lt;/span&gt;&lt;span style="color:maroon;"&gt;DACustomVal &lt;/span&gt;&lt;span style="color:red;"&gt;ID&lt;/span&gt;&lt;span style="color:blue;"&gt;=&amp;quot;cvName&amp;quot; &lt;/span&gt;&lt;span style="color:red;"&gt;runat&lt;/span&gt;&lt;span style="color:blue;"&gt;=&amp;quot;server&amp;quot; &lt;/span&gt;&lt;span style="color:red;"&gt;&lt;br /&gt;             ControlToValidate&lt;/span&gt;&lt;span style="color:blue;"&gt;=&amp;quot;txtName&amp;quot; &lt;/span&gt;&lt;span style="color:red;"&gt;PropertyName&lt;/span&gt;&lt;span style="color:blue;"&gt;=&amp;quot;Name&amp;quot; &lt;/span&gt;&lt;span style="color:red;"&gt;SourceType&lt;/span&gt;&lt;span style="color:blue;"&gt;=&amp;quot;Objects.Person&amp;quot; /&amp;gt;&lt;br /&gt;        &amp;lt;/&lt;/span&gt;&lt;span style="color:maroon;"&gt;p&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;br /&gt;         &amp;lt;&lt;/span&gt;&lt;span style="color:maroon;"&gt;p&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;br /&gt;           &amp;lt;&lt;/span&gt;&lt;span style="color:maroon;"&gt;label &lt;/span&gt;&lt;span style="color:red;"&gt;for&lt;/span&gt;&lt;span style="color:blue;"&gt;=&amp;quot;txtApellido&amp;quot;&amp;gt;&lt;/span&gt;Apellido:&lt;span style="color:blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:maroon;"&gt;label&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;br /&gt;           &amp;lt;&lt;/span&gt;&lt;span style="color:maroon;"&gt;asp&lt;/span&gt;&lt;span style="color:blue;"&gt;:&lt;/span&gt;&lt;span style="color:maroon;"&gt;TextBox &lt;/span&gt;&lt;span style="color:red;"&gt;runat&lt;/span&gt;&lt;span style="color:blue;"&gt;=&amp;quot;server&amp;quot; &lt;/span&gt;&lt;span style="color:red;"&gt;ID&lt;/span&gt;&lt;span style="color:blue;"&gt;=&amp;quot;txtApellido&amp;quot; /&amp;gt;&lt;br /&gt;            &amp;lt;&lt;/span&gt;&lt;span style="color:maroon;"&gt;CustomDAVal&lt;/span&gt;&lt;span style="color:blue;"&gt;:&lt;/span&gt;&lt;span style="color:maroon;"&gt;DACustomVal &lt;/span&gt;&lt;span style="color:red;"&gt;ID&lt;/span&gt;&lt;span style="color:blue;"&gt;=&amp;quot;DACustomVal1&amp;quot; &lt;/span&gt;&lt;span style="color:red;"&gt;runat&lt;/span&gt;&lt;span style="color:blue;"&gt;=&amp;quot;server&amp;quot; &lt;/span&gt;&lt;span style="color:red;"&gt;&lt;br /&gt;              ControlToValidate&lt;/span&gt;&lt;span style="color:blue;"&gt;=&amp;quot;txtApellido&amp;quot; &lt;/span&gt;&lt;span style="color:red;"&gt;PropertyName&lt;/span&gt;&lt;span style="color:blue;"&gt;=&amp;quot;LastName&amp;quot; &lt;/span&gt;&lt;span style="color:red;"&gt;SourceType&lt;/span&gt;&lt;span style="color:blue;"&gt;=&amp;quot;Objects.Person&amp;quot; /&amp;gt;&lt;br /&gt;         &amp;lt;/&lt;/span&gt;&lt;span style="color:maroon;"&gt;p&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;  &lt;br /&gt;         &amp;lt;&lt;/span&gt;&lt;span style="color:maroon;"&gt;p&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;br /&gt;           &amp;lt;&lt;/span&gt;&lt;span style="color:maroon;"&gt;label &lt;/span&gt;&lt;span style="color:red;"&gt;for&lt;/span&gt;&lt;span style="color:blue;"&gt;=&amp;quot;txtEdad&amp;quot;&amp;gt;&lt;/span&gt;Edad:&lt;span style="color:blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:maroon;"&gt;label&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;br /&gt;           &amp;lt;&lt;/span&gt;&lt;span style="color:maroon;"&gt;asp&lt;/span&gt;&lt;span style="color:blue;"&gt;:&lt;/span&gt;&lt;span style="color:maroon;"&gt;TextBox &lt;/span&gt;&lt;span style="color:red;"&gt;runat&lt;/span&gt;&lt;span style="color:blue;"&gt;=&amp;quot;server&amp;quot; &lt;/span&gt;&lt;span style="color:red;"&gt;ID&lt;/span&gt;&lt;span style="color:blue;"&gt;=&amp;quot;txtEdad&amp;quot; /&amp;gt;&lt;br /&gt;           &amp;lt;&lt;/span&gt;&lt;span style="color:maroon;"&gt;CustomDAVal&lt;/span&gt;&lt;span style="color:blue;"&gt;:&lt;/span&gt;&lt;span style="color:maroon;"&gt;DACustomVal &lt;/span&gt;&lt;span style="color:red;"&gt;ID&lt;/span&gt;&lt;span style="color:blue;"&gt;=&amp;quot;DACustomVal2&amp;quot; &lt;/span&gt;&lt;span style="color:red;"&gt;runat&lt;/span&gt;&lt;span style="color:blue;"&gt;=&amp;quot;server&amp;quot; &lt;br /&gt;             &lt;/span&gt;&lt;span style="color:red;"&gt;ControlToValidate&lt;/span&gt;&lt;span style="color:blue;"&gt;=&amp;quot;txtEdad&amp;quot; &lt;/span&gt;&lt;span style="color:red;"&gt;PropertyName&lt;/span&gt;&lt;span style="color:blue;"&gt;=&amp;quot;Age&amp;quot; &lt;/span&gt;&lt;span style="color:red;"&gt;SourceType&lt;/span&gt;&lt;span style="color:blue;"&gt;=&amp;quot;Objects.Person&amp;quot; /&amp;gt;&lt;br /&gt;         &amp;lt;/&lt;/span&gt;&lt;span style="color:maroon;"&gt;p&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;br /&gt;         &amp;lt;&lt;/span&gt;&lt;span style="color:maroon;"&gt;p&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;br /&gt;           &amp;lt;&lt;/span&gt;&lt;span style="color:maroon;"&gt;label &lt;/span&gt;&lt;span style="color:red;"&gt;for&lt;/span&gt;&lt;span style="color:blue;"&gt;=&amp;quot;txtEmail&amp;quot;&amp;gt;&lt;/span&gt;Email:&lt;span style="color:blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:maroon;"&gt;label&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;br /&gt;           &amp;lt;&lt;/span&gt;&lt;span style="color:maroon;"&gt;asp&lt;/span&gt;&lt;span style="color:blue;"&gt;:&lt;/span&gt;&lt;span style="color:maroon;"&gt;TextBox &lt;/span&gt;&lt;span style="color:red;"&gt;runat&lt;/span&gt;&lt;span style="color:blue;"&gt;=&amp;quot;server&amp;quot; &lt;/span&gt;&lt;span style="color:red;"&gt;ID&lt;/span&gt;&lt;span style="color:blue;"&gt;=&amp;quot;txtEmail&amp;quot; /&amp;gt;&lt;br /&gt;           &amp;lt;&lt;/span&gt;&lt;span style="color:maroon;"&gt;CustomDAVal&lt;/span&gt;&lt;span style="color:blue;"&gt;:&lt;/span&gt;&lt;span style="color:maroon;"&gt;DACustomVal &lt;/span&gt;&lt;span style="color:red;"&gt;ID&lt;/span&gt;&lt;span style="color:blue;"&gt;=&amp;quot;DACustomVal3&amp;quot; &lt;/span&gt;&lt;span style="color:red;"&gt;runat&lt;/span&gt;&lt;span style="color:blue;"&gt;=&amp;quot;server&amp;quot; &lt;br /&gt;             &lt;/span&gt;&lt;span style="color:red;"&gt;ControlToValidate&lt;/span&gt;&lt;span style="color:blue;"&gt;=&amp;quot;txtEmail&amp;quot; &lt;/span&gt;&lt;span style="color:red;"&gt;PropertyName&lt;/span&gt;&lt;span style="color:blue;"&gt;=&amp;quot;Email&amp;quot; &lt;/span&gt;&lt;span style="color:red;"&gt;SourceType&lt;/span&gt;&lt;span style="color:blue;"&gt;=&amp;quot;Objects.Person&amp;quot; /&amp;gt;&lt;br /&gt;         &amp;lt;/&lt;/span&gt;&lt;span style="color:maroon;"&gt;p&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt; &lt;br /&gt;         &amp;lt;&lt;/span&gt;&lt;span style="color:maroon;"&gt;p&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;br /&gt;           &amp;lt;&lt;/span&gt;&lt;span style="color:maroon;"&gt;asp&lt;/span&gt;&lt;span style="color:blue;"&gt;:&lt;/span&gt;&lt;span style="color:maroon;"&gt;Button &lt;/span&gt;&lt;span style="color:red;"&gt;Text&lt;/span&gt;&lt;span style="color:blue;"&gt;=&amp;quot;Guardar&amp;quot; &lt;/span&gt;&lt;span style="color:red;"&gt;ID&lt;/span&gt;&lt;span style="color:blue;"&gt;=&amp;quot;btnSave&amp;quot; &lt;/span&gt;&lt;span style="color:red;"&gt;runat&lt;/span&gt;&lt;span style="color:blue;"&gt;=&amp;quot;server&amp;quot; &lt;/span&gt;&lt;span style="color:red;"&gt;CssClass&lt;/span&gt;&lt;span style="color:blue;"&gt;=&amp;quot;button&amp;quot; &lt;br /&gt;               &lt;/span&gt;&lt;span style="color:red;"&gt;Height&lt;/span&gt;&lt;span style="color:blue;"&gt;=&amp;quot;31px&amp;quot; &lt;/span&gt;&lt;span style="color:red;"&gt;Width&lt;/span&gt;&lt;span style="color:blue;"&gt;=&amp;quot;86px&amp;quot; /&amp;gt;&lt;br /&gt;         &amp;lt;/&lt;/span&gt;&lt;span style="color:maroon;"&gt;p&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;br /&gt; &amp;lt;/&lt;/span&gt;&lt;span style="color:maroon;"&gt;fieldset&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;
&lt;p&gt;
&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;

&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre class="code"&gt;&lt;span style="color:blue;"&gt; &amp;lt;&lt;/span&gt;&lt;span style="color:maroon;"&gt;CustomDAVal&lt;/span&gt;&lt;span style="color:blue;"&gt;:&lt;/span&gt;&lt;span style="color:maroon;"&gt;DACustomVal&amp;gt;&lt;/span&gt;  representa mi &amp;ldquo;Custom Validator&amp;rdquo; el cual asocia el control de ASP.NET con la propiedad del objeto.&amp;nbsp;&amp;nbsp; En este punto ya contamos con la validacion del lado del servidor, en este caso usamos un &amp;ldquo;Validation Summary&amp;rdquo; (El class hide evita que el texto se despligue al lado de los textbox, un issue que se puede manejar.).&amp;nbsp; Como la validaci&amp;oacute;n que hacemos es del lado del servidor, debemos hacer postback al servidor para que los validadores funciones, tal y como se muestra en la pantalla.&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/rcarreras/VS1_5F00_236F5B72.png"&gt;&lt;img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="VS[1]" alt="VS[1]" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/rcarreras/VS1_5F00_thumb_5F00_30A5BEB8.png" border="0" height="260" width="317" /&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Para que esta misma funcionalidad se aproveche en el lado del cliente y evitar un postback al servidor, se ha incluido en el metodo &amp;ldquo;OnPreRender&amp;rdquo; del &amp;ldquo;Custom Validator&amp;rdquo; algunas lineas de c&amp;oacute;digo que&amp;nbsp; itera sobre los controles del formulario y de forma dinamica incluye los validadores de .NET de acuerdo a los atributos definidos en cada una de las propiedades. &lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre class="code"&gt;&lt;span style="color:blue;"&gt;protected override void &lt;/span&gt;OnPreRender(&lt;span style="color:#2b91af;"&gt;EventArgs &lt;/span&gt;e)&lt;br /&gt;        {&lt;br /&gt;            &lt;span style="color:blue;"&gt;if &lt;/span&gt;(&lt;span style="color:blue;"&gt;this&lt;/span&gt;.EnableClientScript == &lt;span style="color:blue;"&gt;true&lt;/span&gt;) {&lt;br /&gt;&lt;br /&gt;                &lt;span style="color:green;"&gt;//Para que los validadores no escriban nada del lado del control, &lt;br /&gt;                //asignamos este valor a la propiedad text de cada validador.&lt;br /&gt;                &lt;/span&gt;&lt;span style="color:blue;"&gt;string &lt;/span&gt;emptyVal = &lt;span style="color:#a31515;"&gt;&amp;quot;&amp;amp;nbsp;&amp;quot;&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;                &lt;span style="color:green;"&gt;//Obtenemos la info del tipo, propiedades y del control.&lt;br /&gt;                &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;Type &lt;/span&gt;objType = &lt;span style="color:#2b91af;"&gt;Type&lt;/span&gt;.GetType(SourceType, &lt;span style="color:blue;"&gt;true&lt;/span&gt;, &lt;span style="color:blue;"&gt;true&lt;/span&gt;);&lt;br /&gt;                &lt;span style="color:#2b91af;"&gt;PropertyInfo &lt;/span&gt;propInfo = objType.GetProperty(PropertyName);&lt;br /&gt;                &lt;span style="color:#2b91af;"&gt;Control &lt;/span&gt;control = &lt;span style="color:blue;"&gt;this&lt;/span&gt;.FindControl(&lt;span style="color:blue;"&gt;this&lt;/span&gt;.ControlToValidate);&lt;br /&gt;&lt;br /&gt;                &lt;span style="color:blue;"&gt;foreach &lt;/span&gt;(&lt;span style="color:blue;"&gt;object &lt;/span&gt;attr &lt;span style="color:blue;"&gt;in &lt;/span&gt;propInfo.GetCustomAttributes(&lt;span style="color:blue;"&gt;false&lt;/span&gt;))&lt;br /&gt;                {&lt;br /&gt;                                       &lt;br /&gt;                    &lt;span style="color:blue;"&gt;if &lt;/span&gt;(attr &lt;span style="color:blue;"&gt;is &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;RequiredAttribute&lt;/span&gt;)&lt;br /&gt;                    {&lt;br /&gt;                        &lt;span style="color:#2b91af;"&gt;RequiredAttribute &lt;/span&gt;reqAttr   = (&lt;span style="color:#2b91af;"&gt;RequiredAttribute&lt;/span&gt;)attr;&lt;br /&gt;&lt;br /&gt;                        &lt;span style="color:green;"&gt;// Create requiredFieldValidator&lt;br /&gt;                        &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;RequiredFieldValidator &lt;/span&gt;rfVal = &lt;span style="color:blue;"&gt;new &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;RequiredFieldValidator&lt;/span&gt;();&lt;br /&gt;                        rfVal.ControlToValidate = &lt;span style="color:blue;"&gt;this&lt;/span&gt;.ControlToValidate;&lt;br /&gt;                        rfVal.ErrorMessage = reqAttr.ErrorMessage;&lt;br /&gt;                        rfVal.Text = emptyVal;&lt;br /&gt;                        rfVal.ID = &lt;span style="color:#2b91af;"&gt;String&lt;/span&gt;.Format(&lt;span style="color:#a31515;"&gt;&amp;quot;rfv_{0}&amp;quot;&lt;/span&gt;, PropertyName);                      &lt;br /&gt;                        rfVal.ValidationGroup = &lt;span style="color:blue;"&gt;this&lt;/span&gt;.ValidationGroup;&lt;br /&gt;&lt;br /&gt;                        &lt;span style="color:blue;"&gt;if &lt;/span&gt;(control &lt;span style="color:blue;"&gt;is &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;DropDownList&lt;/span&gt;)&lt;br /&gt;                            rfVal.InitialValue = &lt;span style="color:#a31515;"&gt;&amp;quot;-1&amp;quot;&lt;/span&gt;;&lt;br /&gt;                &lt;br /&gt;                        &lt;span style="color:blue;"&gt;this&lt;/span&gt;.Controls.Add(rfVal);&lt;br /&gt;                    }&lt;br /&gt;                    &lt;span style="color:blue;"&gt;else if &lt;/span&gt;(attr &lt;span style="color:blue;"&gt;is &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;StringLengthAttribute&lt;/span&gt;){&lt;br /&gt;                    &lt;br /&gt;                        &lt;span style="color:green;"&gt;//Si tenemos un atributo de maximo de caracteres le aplicamos ese atributo a la propiedad del texbox.&lt;br /&gt;                        &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;StringLengthAttribute &lt;/span&gt;slAttr = (&lt;span style="color:#2b91af;"&gt;StringLengthAttribute&lt;/span&gt;)attr;&lt;br /&gt;                      &lt;br /&gt;                        &lt;span style="color:blue;"&gt;if &lt;/span&gt;(&lt;span style="color:blue;"&gt;this&lt;/span&gt;.FindControl(&lt;span style="color:blue;"&gt;this&lt;/span&gt;.ControlToValidate) &lt;span style="color:blue;"&gt;is &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;TextBox&lt;/span&gt;){&lt;br /&gt;                            ((&lt;span style="color:#2b91af;"&gt;TextBox&lt;/span&gt;)&lt;span style="color:blue;"&gt;this&lt;/span&gt;.FindControl(&lt;span style="color:blue;"&gt;this&lt;/span&gt;.ControlToValidate)).MaxLength = slAttr.MaximumLength;                           &lt;br /&gt;                        }&lt;br /&gt;&lt;br /&gt;                    }&lt;br /&gt;                    &lt;span style="color:blue;"&gt;else if &lt;/span&gt;(attr &lt;span style="color:blue;"&gt;is &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;RegularExpressionAttribute&lt;/span&gt;){&lt;br /&gt;                    &lt;br /&gt;                        &lt;span style="color:#2b91af;"&gt;RegularExpressionAttribute &lt;/span&gt;rexAttr = (&lt;span style="color:#2b91af;"&gt;RegularExpressionAttribute&lt;/span&gt;)attr;&lt;br /&gt;                        &lt;span style="color:#2b91af;"&gt;RegularExpressionValidator &lt;/span&gt;rexVal = &lt;span style="color:blue;"&gt;new &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;RegularExpressionValidator&lt;/span&gt;();&lt;br /&gt;&lt;br /&gt;                        rexVal.ControlToValidate = &lt;span style="color:blue;"&gt;this&lt;/span&gt;.ControlToValidate;&lt;br /&gt;                        rexVal.EnableClientScript = &lt;span style="color:blue;"&gt;true&lt;/span&gt;;&lt;br /&gt;                        rexVal.ErrorMessage = rexAttr.ErrorMessage;&lt;br /&gt;                        rexVal.Text = emptyVal;&lt;br /&gt;                        rexVal.ValidationExpression = rexAttr.Pattern;&lt;br /&gt;                        rexVal.ID = &lt;span style="color:#2b91af;"&gt;String&lt;/span&gt;.Format(&lt;span style="color:#a31515;"&gt;&amp;quot;rexv_{0}&amp;quot;&lt;/span&gt;, PropertyName);                       &lt;br /&gt;                        rexVal.ValidationGroup = &lt;span style="color:blue;"&gt;this&lt;/span&gt;.ValidationGroup;&lt;br /&gt;&lt;br /&gt;                        &lt;span style="color:blue;"&gt;this&lt;/span&gt;.Controls.Add(rexVal);&lt;br /&gt;                    }&lt;br /&gt;                    &lt;span style="color:blue;"&gt;else if &lt;/span&gt;(attr &lt;span style="color:blue;"&gt;is &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;RangeAttribute&lt;/span&gt;)&lt;br /&gt;                    {&lt;br /&gt;&lt;br /&gt;                        &lt;span style="color:#2b91af;"&gt;RangeAttribute &lt;/span&gt;ranAttr = (&lt;span style="color:#2b91af;"&gt;RangeAttribute&lt;/span&gt;)attr;&lt;br /&gt;                        &lt;span style="color:#2b91af;"&gt;RangeValidator &lt;/span&gt;ranVal = &lt;span style="color:blue;"&gt;new &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;RangeValidator&lt;/span&gt;();&lt;br /&gt;&lt;br /&gt;                        ranVal.ErrorMessage = ranAttr.ErrorMessage;&lt;br /&gt;                        ranVal.Text = emptyVal;&lt;br /&gt;                        ranVal.ControlToValidate = &lt;span style="color:blue;"&gt;this&lt;/span&gt;.ControlToValidate;&lt;br /&gt;                        ranVal.ValidationGroup = &lt;span style="color:blue;"&gt;this&lt;/span&gt;.ValidationGroup;&lt;br /&gt;                        ranVal.ID = &lt;span style="color:#2b91af;"&gt;String&lt;/span&gt;.Format(&lt;span style="color:#a31515;"&gt;&amp;quot;ranv_{0}&amp;quot;&lt;/span&gt;, PropertyName);&lt;br /&gt;                        ranVal.EnableClientScript = &lt;span style="color:blue;"&gt;true&lt;/span&gt;;&lt;br /&gt;                        ranVal.MinimumValue = ranAttr.Minimum.ToString();&lt;br /&gt;                        ranVal.MaximumValue = ranAttr.Maximum.ToString();&lt;br /&gt;                        &lt;br /&gt;&lt;br /&gt;                        &lt;span style="color:blue;"&gt;switch &lt;/span&gt;(ranAttr.OperandType.Name) {&lt;br /&gt;                            &lt;span style="color:blue;"&gt;case &lt;/span&gt;&lt;span style="color:#a31515;"&gt;&amp;quot;Int32&amp;quot;&lt;/span&gt;:&lt;br /&gt;                                ranVal.Type = &lt;span style="color:#2b91af;"&gt;ValidationDataType&lt;/span&gt;.Integer;&lt;br /&gt;                                &lt;span style="color:blue;"&gt;break&lt;/span&gt;;&lt;br /&gt;                            &lt;span style="color:blue;"&gt;case &lt;/span&gt;&lt;span style="color:#a31515;"&gt;&amp;quot;Decimal&amp;quot;&lt;/span&gt;:&lt;br /&gt;                                ranVal.Type = &lt;span style="color:#2b91af;"&gt;ValidationDataType&lt;/span&gt;.Currency;&lt;br /&gt;                                &lt;span style="color:blue;"&gt;break&lt;/span&gt;;&lt;br /&gt;                            &lt;span style="color:blue;"&gt;case &lt;/span&gt;&lt;span style="color:#a31515;"&gt;&amp;quot;Double&amp;quot;&lt;/span&gt;:&lt;br /&gt;                                ranVal.Type = &lt;span style="color:#2b91af;"&gt;ValidationDataType&lt;/span&gt;.Double;&lt;br /&gt;                                &lt;span style="color:blue;"&gt;break&lt;/span&gt;;&lt;br /&gt;                            &lt;span style="color:blue;"&gt;case &lt;/span&gt;&lt;span style="color:#a31515;"&gt;&amp;quot;DateTime&amp;quot;&lt;/span&gt;:&lt;br /&gt;                                ranVal.Type = &lt;span style="color:#2b91af;"&gt;ValidationDataType&lt;/span&gt;.Date;&lt;br /&gt;                                &lt;span style="color:blue;"&gt;break&lt;/span&gt;;&lt;br /&gt;                            &lt;span style="color:blue;"&gt;default&lt;/span&gt;:&lt;br /&gt;                                ranVal.Type = &lt;span style="color:#2b91af;"&gt;ValidationDataType&lt;/span&gt;.String;&lt;br /&gt;                                &lt;span style="color:blue;"&gt;break&lt;/span&gt;;&lt;br /&gt;                        }&lt;br /&gt;&lt;br /&gt;                        &lt;span style="color:blue;"&gt;this&lt;/span&gt;.Controls.Add(ranVal);&lt;br /&gt;&lt;br /&gt;                    }&lt;br /&gt;                  &lt;br /&gt;                }                                   &lt;br /&gt;                  &lt;br /&gt;             }&lt;br /&gt;        &lt;br /&gt;            &lt;span style="color:blue;"&gt;base&lt;/span&gt;.OnPreRender(e);&lt;br /&gt;        }&lt;/pre&gt;
&lt;p&gt;
&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;

&lt;/p&gt;
&lt;div class="csharpcode"&gt;&amp;nbsp;&lt;/div&gt;
&lt;p&gt;

&lt;/p&gt;
&lt;p&gt;Con este c&amp;oacute;digo autom&amp;aacute;ticamente agregamos los controles necesarios para tener validaciones del lado del cliente incluyendo los validadores de: Requerido, Rango, RegularExpression y adicional a esto controlamos el m&amp;aacute;ximo de caracteres que puede recibir un textbox con el atributo &amp;ldquo;StringLengthAttribute&amp;rdquo;.&amp;nbsp; Al final el formulario mantiene el mismo aspecto pero llevando las validaciones al lado del cliente para evitar los molestos postback.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/rcarreras/VC1_5F00_1A22FA64.png"&gt;&lt;img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="VC[1]" alt="VC[1]" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/rcarreras/VC1_5F00_thumb_5F00_47E09D5C.png" border="0" height="262" width="330" /&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;Puede descargar el website completo desde &lt;a target="_blank" href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Components.UserFiles/00.00.00.54.33.Archivos+adjuntos/DataAnnotation.zip"&gt;Aqu&amp;iacute;&lt;/a&gt;, aunque est&amp;aacute; hecho en VS2010, ASP.NET 4.0 el c&amp;oacute;digo es totalmente compatible con VS2008 y .NET Framework 3.5 SP1.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=175163" width="1" height="1"&gt;</content><author><name>rcarreras</name><uri>http://geeks.ms/members/rcarreras/default.aspx</uri></author><category term="ASP.NET" scheme="http://geeks.ms/blogs/rcarreras/archive/tags/ASP.NET/default.aspx" /><category term="VS2010" scheme="http://geeks.ms/blogs/rcarreras/archive/tags/VS2010/default.aspx" /><category term="DataAnnotation" scheme="http://geeks.ms/blogs/rcarreras/archive/tags/DataAnnotation/default.aspx" /><category term=".NET 4.0" scheme="http://geeks.ms/blogs/rcarreras/archive/tags/.NET+4.0/default.aspx" /></entry><entry><title>Subiendo archivos asíncrono en asp.net con el control “AsyncFileUpload”</title><link rel="alternate" type="text/html" href="/blogs/rcarreras/archive/2009/10/04/subiendo-archivos-as-237-ncrono-en-asp-net-con-el-control-asyncfileupload.aspx" /><id>/blogs/rcarreras/archive/2009/10/04/subiendo-archivos-as-237-ncrono-en-asp-net-con-el-control-asyncfileupload.aspx</id><published>2009-10-05T01:10:00Z</published><updated>2009-10-05T01:10:00Z</updated><content type="html">&lt;p&gt;Recientemente se liber&amp;oacute; una nueva versi&amp;oacute;n del famoso &amp;ldquo;Ajax Control Toolkit&amp;rdquo;, adicional a los arreglos y estabilidad que exhibe el release, este incluye dos nuevos controles: SEADRAGON y ASYNCFILEUPLOAD de este ultimo dedicar&amp;eacute; este post.&lt;/p&gt;
&lt;p&gt;Para nadie es un secreto que uno de los dolores de cabeza de los desarrolladores que usan ASP.NET AJAX, espec&amp;iacute;ficamente los &amp;ldquo;UpdatePanels&amp;rdquo; es la limitaci&amp;oacute;n de poder incluir dentro de este, un control de &amp;ldquo;FileUpload&amp;rdquo; para la carga de archivos. En los buscadores y foros te daras cuenta que un gran numero de desarrolladores ha tenido que hacer implementaciones complejas, comprar control o desistir de hacer una carga de archivo as&amp;iacute;ncronas dentro del update panel. Para este problema los chicos del AJAX Control Toolkit desarrollaron el control &amp;ldquo;AsyncFileUpload&amp;rdquo; que es un control bien sencillo de implementar y adem&amp;aacute;s mantiene la caracter&amp;iacute;sticas de los ya conocidos controles del toolkit.&lt;/p&gt;
&lt;p&gt;Basicamente el control se define as&amp;iacute;:&lt;/p&gt;
&lt;pre class="code"&gt;&lt;span style="color:blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;toolkit&lt;/span&gt;&lt;span style="color:blue;"&gt;:&lt;/span&gt;&lt;span style="color:#a31515;"&gt;AsyncFileUpload &lt;/span&gt;&lt;span style="color:red;"&gt;ID&lt;/span&gt;&lt;span style="color:blue;"&gt;=&amp;quot;AsyncFileUpload1&amp;quot; &lt;/span&gt;&lt;span style="color:red;"&gt;runat&lt;/span&gt;&lt;span style="color:blue;"&gt;=&amp;quot;server&amp;quot; &lt;br /&gt;       &lt;/span&gt;&lt;span style="color:red;"&gt;OnClientUploadError&lt;/span&gt;&lt;span style="color:blue;"&gt;=&amp;quot;uploadError&amp;quot; &lt;br /&gt;       &lt;/span&gt;&lt;span style="color:red;"&gt;OnClientUploadComplete&lt;/span&gt;&lt;span style="color:blue;"&gt;=&amp;quot;uploadComplete&amp;quot; &lt;br /&gt;       &lt;/span&gt;&lt;span style="color:red;"&gt;UploaderStyle&lt;/span&gt;&lt;span style="color:blue;"&gt;=&amp;quot;Modern&amp;quot;  &lt;br /&gt;       &lt;/span&gt;&lt;span style="color:red;"&gt;ThrobberID&lt;/span&gt;&lt;span style="color:blue;"&gt;=&amp;quot;Throbber&amp;quot; &lt;/span&gt;&lt;span style="color:red;"&gt;UploadingBackColor&lt;/span&gt;&lt;span style="color:blue;"&gt;=&amp;quot;#CCFFFF&amp;quot; &lt;br /&gt;       &lt;/span&gt;&lt;span style="color:red;"&gt;CompleteBackColor&lt;/span&gt;&lt;span style="color:blue;"&gt;=&amp;quot;Aqua&amp;quot; /&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;p&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;Este control est&amp;aacute; compuesto por los siguientes:&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Eventos&lt;/b&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;span style="text-decoration:underline;"&gt;UploadedComplete&lt;/span&gt;: evento que ocurre en el servidor cuando la cargar del archivo ha sido satisfactorio. &lt;/li&gt;
&lt;li&gt;&lt;span style="text-decoration:underline;"&gt;UploadedFileError&lt;/span&gt;: evento que ocurre en el servidor cuando la carga del archivo ha generado alg&amp;uacute;n error. &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Propiedades&lt;/b&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;span style="text-decoration:underline;"&gt;CompleteBackColor&lt;/span&gt;: El color de fondo del control cuando la carga ha sido completada. &lt;/li&gt;
&lt;li&gt;&lt;span style="text-decoration:underline;"&gt;ContentType&lt;/span&gt;: Se obtiene el tipo de contenido (MIME Content Type) del archivo cargado. &lt;/li&gt;
&lt;li&gt;&lt;span style="text-decoration:underline;"&gt;ErrorBackColor&lt;/span&gt;: el color de fondo del control cuando la carga ha genrado un error. &lt;/li&gt;
&lt;li&gt;&lt;span style="text-decoration:underline;"&gt;Filename&lt;/span&gt;: se obtiene el nombre del archivo. &lt;/li&gt;
&lt;li&gt;&lt;span style="text-decoration:underline;"&gt;Hasfile&lt;/span&gt;: un boleano que indica si el control tiene archivo o no. &lt;/li&gt;
&lt;li&gt;&lt;span style="text-decoration:underline;"&gt;OnClientUploadError&lt;/span&gt;: el nombre de la funcion de Javascript que se ejecutar&amp;aacute; si falla la carga. &lt;/li&gt;
&lt;li&gt;&lt;span style="text-decoration:underline;"&gt;OnClientUploadComplete&lt;/span&gt;: el nombre de la funcion de Javascript que se ejecutar&amp;aacute; cuando se complete la carga. &lt;/li&gt;
&lt;li&gt;&lt;span style="text-decoration:underline;"&gt;PostedFile&lt;/span&gt;: se obtiene un objeto HttpPostedFile con acceso al archivo cargado. &lt;/li&gt;
&lt;li&gt;&lt;span style="text-decoration:underline;"&gt;ThrobberID&lt;/span&gt;: (debi&amp;oacute; ser ProgressImage) Es el ID del control que mostrar&amp;aacute; el progreso. &lt;/li&gt;
&lt;li&gt;&lt;span style="text-decoration:underline;"&gt;UploaderStyle&lt;/span&gt;: define la apariencia del control (Tradicional o Moderno). &lt;/li&gt;
&lt;li&gt;&lt;span style="text-decoration:underline;"&gt;UploadingBackColor&lt;/span&gt;: color de fondo del control cuando est&amp;aacute; cargando el archivo. &lt;/li&gt;
&lt;li&gt;&lt;span style="text-decoration:underline;"&gt;Width&lt;/span&gt;: define el largo del control. &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Metodos&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;SaveAS(archivo as string): Guarda el archivo pasandole como parametro la ruta y el nombre del archivo. &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;En la implementaci&amp;oacute;n que anexo en este post el HTML se observa de esta forma:&lt;/p&gt;
&lt;pre class="code"&gt;&lt;span style="color:blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;form &lt;/span&gt;&lt;span style="color:red;"&gt;id&lt;/span&gt;&lt;span style="color:blue;"&gt;=&amp;quot;form1&amp;quot; &lt;/span&gt;&lt;span style="color:red;"&gt;runat&lt;/span&gt;&lt;span style="color:blue;"&gt;=&amp;quot;server&amp;quot;&amp;gt;&lt;br /&gt;   &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;asp&lt;/span&gt;&lt;span style="color:blue;"&gt;:&lt;/span&gt;&lt;span style="color:#a31515;"&gt;ScriptManager &lt;/span&gt;&lt;span style="color:red;"&gt;ID&lt;/span&gt;&lt;span style="color:blue;"&gt;=&amp;quot;sm&amp;quot; &lt;/span&gt;&lt;span style="color:red;"&gt;runat&lt;/span&gt;&lt;span style="color:blue;"&gt;=&amp;quot;server&amp;quot; /&amp;gt;&lt;br /&gt;   &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;h1&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;br /&gt;       &lt;/span&gt;Carga de archivo as&amp;iacute;ncrona&lt;span style="color:blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;h1&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;br /&gt;   &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;div &lt;/span&gt;&lt;span style="color:red;"&gt;id&lt;/span&gt;&lt;span style="color:blue;"&gt;=&amp;quot;demoTitle&amp;quot;&amp;gt;&lt;br /&gt;       &lt;/span&gt;Demostraci&amp;oacute;n Control &amp;quot;AsyncFileUpload&amp;quot;&lt;br /&gt;   &lt;span style="color:blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;div&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;br /&gt;   &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;div &lt;/span&gt;&lt;span style="color:red;"&gt;id&lt;/span&gt;&lt;span style="color:blue;"&gt;=&amp;quot;uploadArea&amp;quot;&amp;gt;&lt;br /&gt;       &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;toolkit&lt;/span&gt;&lt;span style="color:blue;"&gt;:&lt;/span&gt;&lt;span style="color:#a31515;"&gt;AsyncFileUpload &lt;/span&gt;&lt;span style="color:red;"&gt;ID&lt;/span&gt;&lt;span style="color:blue;"&gt;=&amp;quot;AsyncFU&amp;quot; &lt;br /&gt;       &lt;/span&gt;&lt;span style="color:red;"&gt;runat&lt;/span&gt;&lt;span style="color:blue;"&gt;=&amp;quot;server&amp;quot; &lt;br /&gt;       &lt;/span&gt;&lt;span style="color:red;"&gt;OnClientUploadError&lt;/span&gt;&lt;span style="color:blue;"&gt;=&amp;quot;uploadError&amp;quot;&lt;br /&gt;       &lt;/span&gt;&lt;span style="color:red;"&gt;OnClientUploadComplete&lt;/span&gt;&lt;span style="color:blue;"&gt;=&amp;quot;uploadComplete&amp;quot; &lt;br /&gt;       &lt;/span&gt;&lt;span style="color:red;"&gt;UploaderStyle&lt;/span&gt;&lt;span style="color:blue;"&gt;=&amp;quot;Modern&amp;quot; &lt;br /&gt;       &lt;/span&gt;&lt;span style="color:red;"&gt;ThrobberID&lt;/span&gt;&lt;span style="color:blue;"&gt;=&amp;quot;Throbber&amp;quot;&lt;br /&gt;       &lt;/span&gt;&lt;span style="color:red;"&gt;UploadingBackColor&lt;/span&gt;&lt;span style="color:blue;"&gt;=&amp;quot;#CCFFFF&amp;quot; &lt;br /&gt;       &lt;/span&gt;&lt;span style="color:red;"&gt;CompleteBackColor&lt;/span&gt;&lt;span style="color:blue;"&gt;=&amp;quot;AliceBlue&amp;quot; /&amp;gt;&lt;br /&gt;       &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;div &lt;/span&gt;&lt;span style="color:red;"&gt;id&lt;/span&gt;&lt;span style="color:blue;"&gt;=&amp;quot;Throbber&amp;quot; &lt;/span&gt;&lt;span style="color:red;"&gt;runat&lt;/span&gt;&lt;span style="color:blue;"&gt;=&amp;quot;server&amp;quot; &lt;br /&gt;           &lt;/span&gt;&lt;span style="color:red;"&gt;style&lt;/span&gt;&lt;span style="color:blue;"&gt;=&amp;quot;&lt;/span&gt;&lt;span style="color:red;"&gt;display&lt;/span&gt;: &lt;span style="color:blue;"&gt;none&lt;/span&gt;;&lt;span style="color:blue;"&gt;&amp;quot;&amp;gt;&lt;br /&gt;           &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;img &lt;/span&gt;&lt;span style="color:red;"&gt;align&lt;/span&gt;&lt;span style="color:blue;"&gt;=&amp;quot;middle&amp;quot; &lt;/span&gt;&lt;span style="color:red;"&gt;alt&lt;/span&gt;&lt;span style="color:blue;"&gt;=&amp;quot;&amp;quot; &lt;/span&gt;&lt;span style="color:red;"&gt;src&lt;/span&gt;&lt;span style="color:blue;"&gt;=&amp;quot;indicator.gif&amp;quot; /&amp;gt;&lt;br /&gt;       &amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;div&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;br /&gt;   &amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;div&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;br /&gt;   &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;br &lt;/span&gt;&lt;span style="color:blue;"&gt;/&amp;gt;&lt;br /&gt;   &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;br &lt;/span&gt;&lt;span style="color:blue;"&gt;/&amp;gt;&lt;br /&gt;   &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;div&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;br /&gt;       &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;strong&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;Ultimo evento del lado del servidor:&lt;span style="color:blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;strong&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;div&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;br /&gt;   &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;div &lt;/span&gt;&lt;span style="color:red;"&gt;id&lt;/span&gt;&lt;span style="color:blue;"&gt;=&amp;quot;msgServerSide&amp;quot; &lt;/span&gt;&lt;span style="color:red;"&gt;runat&lt;/span&gt;&lt;span style="color:blue;"&gt;=&amp;quot;server&amp;quot;&amp;gt;&lt;br /&gt;   &amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;div&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;br /&gt;   &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;br &lt;/span&gt;&lt;span style="color:blue;"&gt;/&amp;gt;&lt;br /&gt;   &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;br &lt;/span&gt;&lt;span style="color:blue;"&gt;/&amp;gt;&lt;br /&gt;   &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;div&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;br /&gt;       &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;strong&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;Eventos del lado del cliente:&lt;span style="color:blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;strong&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;div&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;br /&gt;   &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;div &lt;/span&gt;&lt;span style="color:red;"&gt;id&lt;/span&gt;&lt;span style="color:blue;"&gt;=&amp;quot;msgClientSide&amp;quot; &lt;/span&gt;&lt;span style="color:red;"&gt;runat&lt;/span&gt;&lt;span style="color:blue;"&gt;=&amp;quot;server&amp;quot; &lt;/span&gt;&lt;span style="color:red;"&gt;style&lt;/span&gt;&lt;span style="color:blue;"&gt;=&amp;quot;&lt;/span&gt;&lt;span style="color:red;"&gt;display&lt;/span&gt;: &lt;span style="color:blue;"&gt;none&amp;quot;&amp;gt;&lt;br /&gt;   &amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;div&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;br /&gt;   &amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;form&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;p&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Estas funciones de javascript le permiten al control crear comportamientos y funcionalidades directamente en el cliente:&lt;/p&gt;
&lt;pre class="code"&gt;&lt;span style="color:blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;script &lt;/span&gt;&lt;span style="color:red;"&gt;type&lt;/span&gt;&lt;span style="color:blue;"&gt;=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;        function &lt;/span&gt;uploadError(sender, args) {&lt;br /&gt;            &lt;span style="color:blue;"&gt;var &lt;/span&gt;divmsg = $get(&lt;span style="color:#a31515;"&gt;&amp;quot;&amp;lt;%= msgClientSide.ClientID %&amp;gt;&amp;quot;&lt;/span&gt;);&lt;br /&gt;            divmsg.className = &lt;span style="color:#a31515;"&gt;&amp;quot;error&amp;quot;&lt;/span&gt;;&lt;br /&gt;            divmsg.style.display = &lt;span style="color:#a31515;"&gt;&amp;#39;block&amp;#39;&lt;/span&gt;;&lt;br /&gt;            divmsg.innerHTML = &lt;span style="color:#a31515;"&gt;&amp;#39;File: &amp;#39; &lt;/span&gt;+ args.get_fileName() +&lt;br /&gt;            &lt;span style="color:#a31515;"&gt;&amp;#39;&amp;lt;br/&amp;gt;&amp;#39; &lt;/span&gt;+ &lt;span style="color:#a31515;"&gt;&amp;#39;Error: &amp;#39;&lt;br /&gt;            &lt;/span&gt;+ args.get_errorMessage();&lt;br /&gt;&lt;br /&gt;        }&lt;br /&gt;        &lt;span style="color:blue;"&gt;function &lt;/span&gt;uploadComplete(sender, args) {&lt;br /&gt;            &lt;span style="color:blue;"&gt;var &lt;/span&gt;divmsg = $get(&lt;span style="color:#a31515;"&gt;&amp;quot;&amp;lt;%= msgClientSide.ClientID %&amp;gt;&amp;quot;&lt;/span&gt;);&lt;br /&gt;            divmsg.className = &lt;span style="color:#a31515;"&gt;&amp;quot;success&amp;quot;&lt;/span&gt;;&lt;br /&gt;            divmsg.style.display = &lt;span style="color:#a31515;"&gt;&amp;#39;block&amp;#39;&lt;/span&gt;;&lt;br /&gt;            divmsg.innerHTML = &lt;span style="color:#a31515;"&gt;&amp;#39;File: &amp;#39; &lt;/span&gt;+ args.get_fileName() + &lt;span style="color:#a31515;"&gt;&amp;#39;&amp;lt;br/&amp;gt;&amp;#39;&lt;br /&gt;             &lt;/span&gt;+ &lt;span style="color:#a31515;"&gt;&amp;#39;Length: &amp;#39; &lt;/span&gt;+ args.get_length() + &lt;span style="color:#a31515;"&gt;&amp;#39;bytes&amp;#39;&lt;/span&gt;;&lt;br /&gt;        }&lt;br /&gt;        &lt;br /&gt;    &lt;span style="color:blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;script&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;p&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Del lado del cliente manejamos los eventos inyectando scripts a trav&amp;eacute;s del scriptmanager.&lt;/p&gt;
&lt;pre class="code"&gt;&lt;span style="color:blue;"&gt;Protected Sub &lt;/span&gt;AsyncFU_UploadedComplete(&lt;span style="color:blue;"&gt;ByVal &lt;/span&gt;sender &lt;span style="color:blue;"&gt;As Object&lt;/span&gt;, _&lt;br /&gt;              &lt;span style="color:blue;"&gt;ByVal &lt;/span&gt;e &lt;span style="color:blue;"&gt;As &lt;/span&gt;AjaxControlToolkit.AsyncFileUploadEventArgs) _&lt;br /&gt;              &lt;span style="color:blue;"&gt;Handles &lt;/span&gt;AsyncFU.UploadedComplete&lt;br /&gt;&lt;br /&gt;    &lt;span style="color:blue;"&gt;Dim &lt;/span&gt;myScript = &lt;span style="color:#a31515;"&gt;&amp;quot;top.$get(&amp;#39;&amp;quot; &lt;/span&gt;&amp;amp; msgServerSide.ClientID &amp;amp; _&lt;br /&gt;   &lt;span style="color:#a31515;"&gt;&amp;quot;&amp;#39;).innerHTML = &amp;#39;Estatus: Satisfactorio &amp;lt;br/&amp;gt;  Archivo: &amp;quot; &lt;/span&gt;&amp;amp; e.filename &amp;amp; _&lt;br /&gt;   &lt;span style="color:#a31515;"&gt;&amp;quot;&amp;lt;br/&amp;gt; Tama&amp;ntilde;o: &amp;quot; &lt;/span&gt;&amp;amp; AsyncFU.FileBytes.Length.ToString() &amp;amp; &lt;span style="color:#a31515;"&gt;&amp;quot;&amp;#39;;&amp;quot;&lt;br /&gt;    &lt;/span&gt;ScriptManager.RegisterClientScriptBlock(&lt;span style="color:blue;"&gt;Me&lt;/span&gt;, &lt;span style="color:blue;"&gt;Me&lt;/span&gt;.GetType(), &lt;span style="color:#a31515;"&gt;&amp;quot;size&amp;quot;&lt;/span&gt;, myScript, &lt;span style="color:blue;"&gt;True&lt;/span&gt;)&lt;br /&gt;&lt;br /&gt;    &lt;span style="color:green;"&gt;&amp;#39;AsyncFU.SaveAs(&amp;quot;AQUI VA LA RUTA PARA GRABAR EL ARCHIVO&amp;quot;)&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color:blue;"&gt;End Sub&lt;br /&gt;&lt;br /&gt;Protected Sub &lt;/span&gt;AsyncFU_UploadedFileError(&lt;span style="color:blue;"&gt;ByVal &lt;/span&gt;sender &lt;span style="color:blue;"&gt;As Object&lt;/span&gt;, _&lt;br /&gt;              &lt;span style="color:blue;"&gt;ByVal &lt;/span&gt;e &lt;span style="color:blue;"&gt;As &lt;/span&gt;AjaxControlToolkit.AsyncFileUploadEventArgs) _&lt;br /&gt;              &lt;span style="color:blue;"&gt;Handles &lt;/span&gt;AsyncFU.UploadedFileError&lt;br /&gt;&lt;br /&gt;    &lt;span style="color:blue;"&gt;Dim &lt;/span&gt;myScript = &lt;span style="color:#a31515;"&gt;&amp;quot;top.$get(&amp;#39;&amp;quot; &lt;/span&gt;&amp;amp; msgServerSide.ClientID &amp;amp; _&lt;br /&gt;    &lt;span style="color:#a31515;"&gt;&amp;quot;&amp;#39;).innerHTML = &amp;#39;Error: &amp;quot; &lt;/span&gt;&amp;amp; e.statusMessage &amp;amp; &lt;span style="color:#a31515;"&gt;&amp;quot;&amp;#39;;&amp;quot;&lt;br /&gt;    &lt;/span&gt;ScriptManager.RegisterClientScriptBlock(&lt;span style="color:blue;"&gt;Me&lt;/span&gt;, &lt;span style="color:blue;"&gt;Me&lt;/span&gt;.GetType(), &lt;span style="color:#a31515;"&gt;&amp;quot;error&amp;quot;&lt;/span&gt;, myScript, &lt;span style="color:blue;"&gt;True&lt;/span&gt;)&lt;br /&gt;&lt;br /&gt;&lt;span style="color:blue;"&gt;End Sub&lt;/span&gt;&lt;/pre&gt;
&lt;p&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Desde &lt;a target="_blank" href="http://public.blu.livefilestore.com/y1pA9-HPqoEKjYfeCnJUvB6dWAlLF8vs3kngftHUbXZHOMc_DCzBaDQd31yjkl48HOPQ8aquKVS8l5xiYMeUo5CTA/AsynFileUpload.rar?download"&gt;aqu&amp;iacute;&lt;/a&gt;&lt;a target="_blank" href="http://public.blu.livefilestore.com/y1pA9-HPqoEKjYfeCnJUvB6dWAlLF8vs3kngftHUbXZHOMc_DCzBaDQd31yjkl48HOPQ8aquKVS8l5xiYMeUo5CTA/AsynFileUpload.rar?download"&gt; &lt;/a&gt;puedes descargar el proyecto que utiliza el control.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;&lt;span style="color:#808000;font-size:medium;"&gt;Conclusiones&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Pros&lt;/b&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Permite usar el control dentro de un Updatepanel. &lt;/li&gt;
&lt;li&gt;Se pueden manejar funcionalidades del lado del cliente. &lt;/li&gt;
&lt;li&gt;Soluciona en gran parte el problema de cargar de archivo as&amp;iacute;ncrono en asp.net. &lt;/li&gt;
&lt;li&gt;Si ocurre un error la ruta del archivo seleccionado persiste en el control. &lt;/li&gt;
&lt;li&gt;Permite tener acceso a diferente estado cuando se carga el archivo. &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;b&gt;Contra&lt;/b&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;No tiene la capacidad para m&amp;uacute;ltiples archivo. &lt;/li&gt;
&lt;li&gt;Por alguna raz&amp;oacute;n cuando seleccionas el archivo la carga se hace autom&amp;aacute;tica. &lt;/li&gt;
&lt;/ul&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=157371" width="1" height="1"&gt;</content><author><name>rcarreras</name><uri>http://geeks.ms/members/rcarreras/default.aspx</uri></author><category term="ASP.NET" scheme="http://geeks.ms/blogs/rcarreras/archive/tags/ASP.NET/default.aspx" /><category term="AsyncFileUpload" scheme="http://geeks.ms/blogs/rcarreras/archive/tags/AsyncFileUpload/default.aspx" /><category term="AJAX Control Toolkit" scheme="http://geeks.ms/blogs/rcarreras/archive/tags/AJAX+Control+Toolkit/default.aspx" /><category term="ASP.NET AJAX" scheme="http://geeks.ms/blogs/rcarreras/archive/tags/ASP.NET+AJAX/default.aspx" /></entry><entry><title>Configurando SQL Server 2008 para enviar emails (paso a paso)</title><link rel="alternate" type="text/html" href="/blogs/rcarreras/archive/2009/09/16/configurando-sql-server-2008-para-enviar-emails-paso-a-paso.aspx" /><id>/blogs/rcarreras/archive/2009/09/16/configurando-sql-server-2008-para-enviar-emails-paso-a-paso.aspx</id><published>2009-09-17T00:53:00Z</published><updated>2009-09-17T00:53:00Z</updated><content type="html">&lt;p&gt;Hoy en d&amp;iacute;a la mayor&amp;iacute;as de las aplicaciones hacen uso de los servicios de Exchange o SMTP para enviar correos electr&amp;oacute;nicos a los usuarios, en muchas ocasiones el env&amp;iacute;o del correo lo hacemos a trav&amp;eacute;s de la aplicaci&amp;oacute;n misma pero existen escenarios en donde es preferible hacer el env&amp;iacute;o de correos desde nuestro repositorio de datos.&lt;/p&gt;
&lt;p&gt;A continuaci&amp;oacute;n mostrar&amp;eacute; paso a paso como configurar el servicio de correos en SQL Server 2008, como asignar permisos a usuarios de base de datos para que utilicen el profile que hemos creado para el env&amp;iacute;o de correos.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Paso 1: Creaci&amp;oacute;n del &amp;ldquo;Profile&amp;rdquo; y el &amp;ldquo;Account&amp;rdquo;&lt;/strong&gt;, en el &amp;ldquo;Managment Studio&amp;rdquo; click derecho sobre &amp;ldquo;Database Mail&lt;/p&gt;
&lt;table width="500" cellpadding="2" cellspacing="0" border="0"&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td width="500" valign="top"&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/rcarreras/01_5F00_1E52DA6E.png"&gt;&lt;img height="321" width="424" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/rcarreras/01_5F00_thumb_5F00_08D0C56D.png" alt="0[1]" border="0" title="0[1]" style="border-bottom:0px;border-left:0px;display:inline;border-top:0px;border-right:0px;" /&gt;&lt;/a&gt; &lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width="500" valign="top"&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/rcarreras/11_5F00_594E1CD4.png"&gt;&lt;img height="420" width="484" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/rcarreras/11_5F00_thumb_5F00_68E9523F.png" alt="Paso 2" border="0" title="Paso 2" style="border-bottom:0px;border-left:0px;display:inline;border-top:0px;border-right:0px;" /&gt;&lt;/a&gt; &lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width="500" valign="top"&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/rcarreras/21_5F00_4AC6E4B2.png"&gt;&lt;img height="422" width="484" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/rcarreras/21_5F00_thumb_5F00_4751133E.png" alt="2[1]" border="0" title="2[1]" style="border-bottom:0px;border-left:0px;display:inline;border-top:0px;border-right:0px;" /&gt;&lt;/a&gt; &lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width="500" valign="top"&gt;Si es la primera vez que configura el servicio, entonces debes activarlo dando click en la opci&amp;oacute;n &amp;ldquo;yes&amp;rdquo;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/rcarreras/31_5F00_4B86FCD1.png"&gt;&lt;img height="98" width="424" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/rcarreras/31_5F00_thumb_5F00_23D05ADA.png" alt="3[1]" border="0" title="3[1]" style="border-bottom:0px;border-left:0px;display:inline;border-top:0px;border-right:0px;" /&gt;&lt;/a&gt; &lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width="500" valign="top"&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/rcarreras/41_5F00_436F0ED5.png"&gt;&lt;img height="426" width="484" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/rcarreras/41_5F00_thumb_5F00_79DC6E7F.png" alt="4[1]" border="0" title="4[1]" style="border-bottom:0px;border-left:0px;display:inline;border-top:0px;border-right:0px;" /&gt;&lt;/a&gt; &lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width="500" valign="top"&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/rcarreras/51_5F00_315EB749.png"&gt;&lt;img height="416" width="484" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/rcarreras/51_5F00_thumb_5F00_35D47669.png" alt="5[1]" border="0" title="5[1]" style="border-bottom:0px;border-left:0px;display:inline;border-top:0px;border-right:0px;" /&gt;&lt;/a&gt; &lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width="500" valign="top"&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/rcarreras/61_5F00_01DC0EB1.png"&gt;&lt;img height="424" width="484" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/rcarreras/61_5F00_thumb_5F00_5CFA85D2.png" alt="6[1]" border="0" title="6[1]" style="border-bottom:0px;border-left:0px;display:inline;border-top:0px;border-right:0px;" /&gt;&lt;/a&gt; &lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width="500" valign="top"&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/rcarreras/71_5F00_73B90BB4.png"&gt;&lt;img height="420" width="484" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/rcarreras/71_5F00_thumb_5F00_4949883F.png" alt="7[1]" border="0" title="7[1]" style="border-bottom:0px;border-left:0px;display:inline;border-top:0px;border-right:0px;" /&gt;&lt;/a&gt; &lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width="500" valign="top"&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/rcarreras/81_5F00_7DC998E0.png"&gt;&lt;img height="420" width="484" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/rcarreras/81_5F00_thumb_5F00_49752400.png" alt="8[1]" border="0" title="8[1]" style="border-bottom:0px;border-left:0px;display:inline;border-top:0px;border-right:0px;" /&gt;&lt;/a&gt; &lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width="500" valign="top"&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/rcarreras/91_5F00_799BAD1C.png"&gt;&lt;img height="420" width="484" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/rcarreras/91_5F00_thumb_5F00_336AA46F.png" alt="9[1]" border="0" title="9[1]" style="border-bottom:0px;border-left:0px;display:inline;border-top:0px;border-right:0px;" /&gt;&lt;/a&gt; &lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Paso 2: Enviar un Email&lt;/strong&gt;, despues que la configuracion esta hecha existen dos formas de probar nuestro servicio, el primero es desde la ventana &amp;ldquo;Send Test Email&amp;rdquo;&amp;nbsp; o ejecutando el procedure &amp;ldquo;sp_send_dbmail&amp;rdquo; veamos los ejemplos:&lt;/p&gt;
&lt;table width="500" cellpadding="2" cellspacing="0" border="0"&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td width="500" valign="top"&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/rcarreras/101_5F00_087EC838.png"&gt;&lt;img height="294" width="424" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/rcarreras/101_5F00_thumb_5F00_7681E8D0.png" alt="10[1]" border="0" title="10[1]" style="border-bottom:0px;border-left:0px;display:inline;border-top:0px;border-right:0px;" /&gt;&lt;/a&gt; &lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width="500" valign="top"&gt;El envio desde T-SQL es: &lt;br /&gt;
&lt;pre class="code"&gt;&lt;span style="color:blue;"&gt;EXEC &lt;/span&gt;msdb&lt;span style="color:gray;"&gt;.&lt;/span&gt;dbo&lt;span style="color:gray;"&gt;.&lt;/span&gt;&lt;span style="color:maroon;"&gt;sp_send_dbmail &lt;/span&gt;@profile_name&lt;span style="color:gray;"&gt;=&lt;/span&gt;&lt;span style="color:red;"&gt;&amp;#39;BlogProfile&amp;#39;&lt;/span&gt;&lt;span style="color:gray;"&gt;,
    &lt;/span&gt;@recipients&lt;span style="color:gray;"&gt;= &lt;/span&gt;&lt;span style="color:red;"&gt;&amp;#39;prueba@dominio.com&amp;#39;&lt;/span&gt;&lt;span style="color:gray;"&gt;,
    &lt;/span&gt;@subject&lt;span style="color:gray;"&gt;= &lt;/span&gt;&lt;span style="color:red;"&gt;&amp;#39;Mensaje de Prueba&amp;#39;&lt;/span&gt;&lt;span style="color:gray;"&gt;,
    &lt;/span&gt;@body&lt;span style="color:gray;"&gt;= &lt;/span&gt;&lt;span style="color:red;"&gt;&amp;#39;Este es el cuerpo del mensaje y escribo un texto de prueba.&amp;#39;&lt;/span&gt;&lt;/pre&gt;
&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;La lista completa de parametros que recibe este &amp;ldquo;Store Procedure&amp;rdquo; puedes conseguirlo desde &lt;a target="_blank" href="http://mce_host/controlpanel/blogs/posteditor.aspx/EXEC%20msdb.dbo.sp_send_dbmail%20@profile_name=&amp;#39;BlogProfile&amp;#39;,"&gt;aqu&amp;iacute;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Paso 3: Asingaci&amp;oacute;n de Permisos&lt;/strong&gt;, Sucede que esta configuraci&amp;oacute;n y la prueba ls hice con un usuario &amp;ldquo;sysadmin&amp;rdquo;, pero ni necesitamos que cualquier usuario en nuestra base de datos utilice este &amp;ldquo;Profile&amp;rdquo; para enviar email debemos de otorgarle el permiso ejecutando este script:&lt;/p&gt;
&lt;pre class="code"&gt;&lt;span style="color:blue;"&gt;USE &lt;/span&gt;msdb
&lt;span style="color:blue;"&gt;GO
EXEC &lt;/span&gt;&lt;span style="color:maroon;"&gt;sp_adduser &lt;/span&gt;@loginame&lt;span style="color:gray;"&gt;=&lt;/span&gt;&lt;span style="color:red;"&gt;&amp;#39;AQUI VA EL USERNAME&amp;#39;&lt;/span&gt;&lt;span style="color:gray;"&gt;, &lt;/span&gt;&lt;br /&gt;@grpname&lt;span style="color:gray;"&gt;=&lt;/span&gt;&lt;span style="color:red;"&gt;&amp;#39;DatabaseMailUserRole&amp;#39;
&lt;/span&gt;&lt;span style="color:blue;"&gt;GO
&lt;/span&gt;&lt;/pre&gt;
&lt;p&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;El administrador de base de datos puede monitorear los mensajes enviados a traves de las siguientes vistas o tablas que estan en la base de datos &amp;ldquo;MSDB&amp;rdquo;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;sysmail_allitems : verifica todos los items enviados.&lt;/li&gt;
&lt;li&gt;sysmail_faileditems:&amp;nbsp; los correos que han fallado.&lt;/li&gt;
&lt;li&gt;sysmail_event_log: El log de eventos de los emails.&lt;/li&gt;
&lt;li&gt;sysmail_mailattachments: la vista de los attachments.&lt;/li&gt;
&lt;li&gt;entre otros.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;** Puedes seguirme en &lt;a target="_blank" href="http://twitter.com/ronnycarreras"&gt;twitter&lt;/a&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=155986" width="1" height="1"&gt;</content><author><name>rcarreras</name><uri>http://geeks.ms/members/rcarreras/default.aspx</uri></author><category term="SQL" scheme="http://geeks.ms/blogs/rcarreras/archive/tags/SQL/default.aspx" /><category term="SQL Server 2008" scheme="http://geeks.ms/blogs/rcarreras/archive/tags/SQL+Server+2008/default.aspx" /></entry><entry><title>Subiendo y tocando videos en ASP.NET</title><link rel="alternate" type="text/html" href="/blogs/rcarreras/archive/2009/09/08/subiendo-y-tocando-videos-en-asp-net.aspx" /><id>/blogs/rcarreras/archive/2009/09/08/subiendo-y-tocando-videos-en-asp-net.aspx</id><published>2009-09-08T18:41:00Z</published><updated>2009-09-08T18:41:00Z</updated><content type="html">&lt;p&gt;Hace unos d&amp;iacute;as un compa&amp;ntilde;ero me pidi&amp;oacute; que le ayudara a incluir la funcionalidad de cargar y ver video en un portal de venta de veh&amp;iacute;culo, los requerimientos eran los siguientes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Permitir al usuario cargar al portal diferentes tipos de video, espec&amp;iacute;ficamente los m&amp;aacute;s populares AVI, WMV, MPG, MP4. &lt;/li&gt;
&lt;li&gt;Hacer encoding de los videos cargados para reducir su tama&amp;ntilde;o considerablemente a fin de que usuarios con poco ancho de banda puedan ver los videos. &lt;/li&gt;
&lt;li&gt;Una vez cargado el video, permitir al usuario ver el video convertido. &lt;/li&gt;
&lt;li&gt;El video cargado por el usuario no puede exceder los 50MB. &lt;/li&gt;
&lt;li&gt;El t&amp;iacute;pico requerimiento, que los componentes involucrados no alteren los costos del proyecto. &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Haciendo una vista r&amp;aacute;pida de los requerimientos no parece dif&amp;iacute;cil desarrollar este feature, pero la realidad es que aunque es muy popular ver video en los website no es tan f&amp;aacute;cil como parece. Primero porque hay pocos componentes gratuitos para estos fines, segundo la documentaci&amp;oacute;n para hacer esta tarea no es tan abundante en internet (por eso me anime a publicar este articulo) y tercero hacer el encoding en l&amp;iacute;nea hace la tare un poco mas dif&amp;iacute;cil.&lt;/p&gt;
&lt;p&gt;Para desarrollar estos requerimientos utilic&amp;eacute; las siguientes herramientas:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Visual Studio 2008 (tambien puedes usar Visual Web Developer 2008). &lt;/li&gt;
&lt;li&gt;ASP.NET &lt;/li&gt;
&lt;li&gt;&lt;a target="_blank" href="http://ffmpeg.org/"&gt;FFmpeg&lt;/a&gt; (para hacer encoding de los videos) la documentaci&amp;oacute;n la puede encontrar &lt;a target="_blank" href="http://ffmpeg.org/ffmpeg-doc.html"&gt;Aqu&amp;iacute;&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;&lt;a target="_blank" href="http://flowplayer.org/index.html"&gt;Flowplayer&lt;/a&gt; (para ver los videos convertidos a flv) la documentacion la puede encontrar &lt;a target="_blank" href="http://flowplayer.org/demos/index.html"&gt;Aqu&amp;iacute;&lt;/a&gt; &lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;El &amp;ldquo;Website Project&amp;rdquo; creado contiene los directorios:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Player: contiene los archivos utilizados para visualizar un video. &lt;/li&gt;
&lt;li&gt;Videos: almacena los videos, tanto el original cargado por el usuario, asi como tambien el convertido a flv. &lt;/li&gt;
&lt;li&gt;ffmpeg.exe: el ejecutable utilizado para hacer el encoding a los videos. &lt;/li&gt;
&lt;li&gt;Dos paginas que detallaremos a continuacion. &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;La primera p&amp;aacute;gina &amp;ldquo;UploadVideo.aspx&amp;rdquo; se encarga de permitirle al usuario cargar su propio video, esta se compone del HTML especificado m&amp;aacute;s abajo.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;form&lt;/span&gt; &lt;span class="attr"&gt;id&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;form1&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;runat&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;server&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;h1&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
        Video Website - Upload Videos&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;h1&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;div&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;asp:FileUpload&lt;/span&gt; &lt;span class="attr"&gt;ID&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;videoFile&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;runat&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;server&amp;quot;&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;
        &lt;span class="attr"&gt;&amp;amp;nbsp;&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;asp:Button&lt;/span&gt; &lt;span class="attr"&gt;ID&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;btnUpload&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;runat&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;server&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;Text&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;Upload video&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;OnClick&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;btnUpload_Click&amp;quot;&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;
        &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;br&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;div&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;asp:Label&lt;/span&gt; &lt;span class="attr"&gt;ID&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;lblErrorVideo&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;runat&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;server&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;EnableViewState&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;False&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;CssClass&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;redbold&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;asp:Label&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;form&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;p&gt;

&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Si tiene experiencia cargando archivo desde ASP.NET sabr&amp;aacute;s que por defecto no se pueden cargar archivos que excedan los 4MB por lo que debemos de modificar el web.config de nuestro web.config, espec&amp;iacute;ficamente debajo del tag &amp;lt;system.web&amp;gt; de esta forma:&lt;/p&gt;
&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;system.web&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;httpRuntime&lt;/span&gt; &lt;span class="attr"&gt;maxRequestLength&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;51200&amp;quot;&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;p&gt;

&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;El atributo &amp;ldquo;&lt;span class="attr"&gt;&lt;span style="color:#ff0000;"&gt;maxRequestLength&lt;/span&gt;&lt;/span&gt;&amp;rdquo; se especifica en KB.&lt;/p&gt;
&lt;p&gt;Lo interesante de esta p&amp;aacute;gina ocurre en su code behind, observemos:&lt;/p&gt;
&lt;p&gt;Variables globales utilzadas en el codigo (esto puede venir del web.config o del cualquier otra configuraci&amp;oacute;n).&lt;/p&gt;
&lt;div class="csharpcode"&gt;
&lt;pre class="alt"&gt;    &lt;span class="rem"&gt;//Ruta en donde se van a guardar los videos.&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;    &lt;span class="kwrd"&gt;string&lt;/span&gt; videoOriginalPath = &lt;span class="str"&gt;&amp;quot;~/Videos/Original/&amp;quot;&lt;/span&gt;;&lt;/pre&gt;
&lt;pre class="alt"&gt;    &lt;span class="kwrd"&gt;string&lt;/span&gt; videoConvertedPath = &lt;span class="str"&gt;&amp;quot;~/Videos/Converted/&amp;quot;&lt;/span&gt;;&lt;/pre&gt;
&lt;pre&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre class="alt"&gt;    &lt;span class="rem"&gt;//Variables utilizadas para manejar los nombres.&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;    &lt;span class="kwrd"&gt;string&lt;/span&gt; videoTmpName = &lt;span class="kwrd"&gt;string&lt;/span&gt;.Empty;&lt;/pre&gt;
&lt;pre class="alt"&gt;    &lt;span class="kwrd"&gt;string&lt;/span&gt; flv = &lt;span class="str"&gt;&amp;quot;.flv&amp;quot;&lt;/span&gt;;&lt;/pre&gt;
&lt;pre&gt;    &lt;span class="kwrd"&gt;string&lt;/span&gt; videoConvertedName = &lt;span class="kwrd"&gt;string&lt;/span&gt;.Empty;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;

&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;El c&amp;oacute;digo que ejecuta el evento Click del button Upload se encarga de validar la extensiones permitidas (l&amp;iacute;nea 6), que el archivo no exceda los 50MB (l&amp;iacute;nea 13)&amp;nbsp; y en la l&amp;iacute;nea 26 se hace el encoding y si todo resulta bien, entonces direccionamos a la p&amp;aacute;gina de visualizaci&amp;oacute;n de videos.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;div class="csharpcode"&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   1:  &lt;/span&gt; &lt;span class="kwrd"&gt;protected&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; btnUpload_Click(&lt;span class="kwrd"&gt;object&lt;/span&gt; sender, EventArgs e)&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;   2:  &lt;/span&gt;    {&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   3:  &lt;/span&gt;        HttpPostedFile file = videoFile.PostedFile;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;   4:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   5:  &lt;/span&gt;        &lt;span class="rem"&gt;//Validamnos la extension del archivo&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;   6:  &lt;/span&gt;        &lt;span class="kwrd"&gt;if&lt;/span&gt; (!ValidateVideoExtension(file.FileName))&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   7:  &lt;/span&gt;        {&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;   8:  &lt;/span&gt;            lblErrorVideo.Text = &lt;span class="str"&gt;&amp;quot;La extension del archivo no es permitido.&amp;quot;&lt;/span&gt;;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   9:  &lt;/span&gt;            &lt;span class="kwrd"&gt;return&lt;/span&gt;;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;  10:  &lt;/span&gt;        }&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  11:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;  12:  &lt;/span&gt;        &lt;span class="rem"&gt;//Verificamos el tamano del archivo de que no exceda los 50MB.&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  13:  &lt;/span&gt;        &lt;span class="kwrd"&gt;if&lt;/span&gt; (file.InputStream.Length &amp;gt; 52428800)&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;  14:  &lt;/span&gt;        {&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  15:  &lt;/span&gt;            lblErrorVideo.Text = &lt;span class="str"&gt;&amp;quot;El video no puede exceder los 50MB&amp;quot;&lt;/span&gt;;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;  16:  &lt;/span&gt;            &lt;span class="kwrd"&gt;return&lt;/span&gt;;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  17:  &lt;/span&gt;        }&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;  18:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  19:  &lt;/span&gt;        &lt;span class="rem"&gt;//Guardamos el video&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;  20:  &lt;/span&gt;        &lt;span class="kwrd"&gt;string&lt;/span&gt; saveAs = Server.MapPath(videoOriginalPath);&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  21:  &lt;/span&gt;        videoTmpName = Guid.NewGuid().ToString();&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;  22:  &lt;/span&gt;        &lt;span class="kwrd"&gt;string&lt;/span&gt; originalVideo = saveAs + videoTmpName + &lt;span class="kwrd"&gt;new&lt;/span&gt; FileInfo(file.FileName).Extension;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  23:  &lt;/span&gt;        file.SaveAs(originalVideo);&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;  24:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  25:  &lt;/span&gt;        &lt;span class="rem"&gt;//Hacemos el Encondding del video&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;  26:  &lt;/span&gt;        &lt;span class="kwrd"&gt;if&lt;/span&gt; (EncodingVideo(originalVideo)){&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  27:  &lt;/span&gt;            Response.Redirect(&lt;span class="str"&gt;&amp;quot;MyVideos.aspx?Id=&amp;quot;&lt;/span&gt; + videoConvertedName);&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;  28:  &lt;/span&gt;        }&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  29:  &lt;/span&gt;        &lt;span class="kwrd"&gt;else&lt;/span&gt; {&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;  30:  &lt;/span&gt;            lblErrorVideo.Text = &lt;span class="str"&gt;&amp;quot;Error convirtiendo el video, intente nuevamente&amp;quot;&lt;/span&gt;;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  31:  &lt;/span&gt;        }&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;  32:  &lt;/span&gt;    }&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;

&lt;/p&gt;
&lt;p&gt;&amp;nbsp; &lt;/p&gt;
&lt;p&gt;La funcion &amp;ldquo;ValidateVideoExtension&amp;rdquo; se l&amp;iacute;mita a verificar la extensi&amp;oacute;n del archivo cargado:&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;div class="csharpcode"&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   1:  &lt;/span&gt; &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;bool&lt;/span&gt; ValidateVideoExtension(&lt;span class="kwrd"&gt;string&lt;/span&gt; filename)&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;   2:  &lt;/span&gt;    {        &lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   3:  &lt;/span&gt;        FileInfo info = &lt;span class="kwrd"&gt;new&lt;/span&gt; FileInfo(filename);&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;   4:  &lt;/span&gt;        &lt;span class="kwrd"&gt;switch&lt;/span&gt; (info.Extension.ToLower())&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   5:  &lt;/span&gt;        {&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;   6:  &lt;/span&gt;            &lt;span class="kwrd"&gt;case&lt;/span&gt; &lt;span class="str"&gt;&amp;quot;.mpg&amp;quot;&lt;/span&gt;:&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   7:  &lt;/span&gt;            &lt;span class="kwrd"&gt;case&lt;/span&gt; &lt;span class="str"&gt;&amp;quot;.wmv&amp;quot;&lt;/span&gt;:&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;   8:  &lt;/span&gt;            &lt;span class="kwrd"&gt;case&lt;/span&gt; &lt;span class="str"&gt;&amp;quot;.avi&amp;quot;&lt;/span&gt;:&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   9:  &lt;/span&gt;            &lt;span class="kwrd"&gt;case&lt;/span&gt; &lt;span class="str"&gt;&amp;quot;.mp4&amp;quot;&lt;/span&gt;:&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;  10:  &lt;/span&gt;                &lt;span class="kwrd"&gt;return&lt;/span&gt; &lt;span class="kwrd"&gt;true&lt;/span&gt;;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  11:  &lt;/span&gt;            &lt;span class="kwrd"&gt;default&lt;/span&gt;:&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;  12:  &lt;/span&gt;                &lt;span class="kwrd"&gt;return&lt;/span&gt; &lt;span class="kwrd"&gt;false&lt;/span&gt;;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  13:  &lt;/span&gt;        }&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;  14:  &lt;/span&gt;    }&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;

&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;En la funci&amp;oacute;n &amp;ldquo;EncodingVideo&amp;rdquo; hacemos uso de la Clase &amp;ldquo;Process&amp;rdquo; bajo el namespace &amp;ldquo;System.Diagsnotics&amp;rdquo;, esta clase nos permite hacer ejecucion de procesos locales o remotos, en este caso la ejecuci&amp;oacute;n del ffmpeg.exe.&amp;nbsp; En la l&amp;iacute;nea 8 se espec&amp;iacute;fican los parametros utilizados para el encoding,&amp;nbsp; la definicion de estos par&amp;aacute;metros se encuentran en la &lt;a target="_blank" href="http://ffmpeg.org/documentation.html"&gt;documentaci&amp;oacute;n del ffmpeg&lt;/a&gt;,&amp;nbsp; un metodo que es imprescindible para este proceso en linea es &amp;ldquo;encoding.WaitForExit()&amp;rdquo; el cual espera a que el proceso concluya.&amp;nbsp; debajo el codigo de esta funci&amp;oacute;n.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;div class="csharpcode"&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   1:  &lt;/span&gt; &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;bool&lt;/span&gt; EncodingVideo(&lt;span class="kwrd"&gt;string&lt;/span&gt; originalVideo)&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;   2:  &lt;/span&gt;    {&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   3:  &lt;/span&gt;        &lt;span class="kwrd"&gt;bool&lt;/span&gt; &lt;span class="kwrd"&gt;value&lt;/span&gt; = &lt;span class="kwrd"&gt;false&lt;/span&gt;;        &lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;   4:  &lt;/span&gt;        &lt;span class="kwrd"&gt;string&lt;/span&gt; saveAs = Server.MapPath(videoConvertedPath);&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   5:  &lt;/span&gt;        videoConvertedName = videoTmpName + flv;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;   6:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   7:  &lt;/span&gt;        &lt;span class="rem"&gt;//Parametros que se le pasaran al ejecutable para fines de encoding.&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;   8:  &lt;/span&gt;        &lt;span class="kwrd"&gt;string&lt;/span&gt; args = &lt;span class="str"&gt;@&amp;quot; -i &amp;quot;&lt;/span&gt; + originalVideo + &lt;span class="str"&gt;&amp;quot; -b 200 -r 24 -s 320x240 -deinterlace -ab 64k &amp;quot;&lt;/span&gt; + saveAs + videoConvertedName;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   9:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;  10:  &lt;/span&gt;        &lt;span class="rem"&gt;//Hacemos uso de la clase proxy la cual nos provee acceso directo al ejecutable.&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  11:  &lt;/span&gt;        &lt;span class="kwrd"&gt;using&lt;/span&gt; (Process enconding = &lt;span class="kwrd"&gt;new&lt;/span&gt; Process())&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;  12:  &lt;/span&gt;        {            &lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  13:  &lt;/span&gt;            enconding.StartInfo.WorkingDirectory = Server.MapPath(&lt;span class="str"&gt;&amp;quot;~/&amp;quot;&lt;/span&gt;);&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;  14:  &lt;/span&gt;            enconding.StartInfo.FileName = Server.MapPath(&lt;span class="str"&gt;&amp;quot;ffmpeg.exe&amp;quot;&lt;/span&gt;);&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  15:  &lt;/span&gt;            enconding.StartInfo.Arguments = args;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;  16:  &lt;/span&gt;            enconding.StartInfo.UseShellExecute = &lt;span class="kwrd"&gt;false&lt;/span&gt;;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  17:  &lt;/span&gt;            enconding.StartInfo.CreateNoWindow = &lt;span class="kwrd"&gt;true&lt;/span&gt;;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;  18:  &lt;/span&gt;            enconding.StartInfo.RedirectStandardOutput = &lt;span class="kwrd"&gt;false&lt;/span&gt;;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  19:  &lt;/span&gt;            enconding.Start();&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;  20:  &lt;/span&gt;            &lt;span class="rem"&gt;//Como es un proceso en linea debemos esperar a que termine para mostrar el video sino el player dar&amp;aacute; un error de FileNotFound.&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  21:  &lt;/span&gt;            enconding.WaitForExit();&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;  22:  &lt;/span&gt;            &lt;span class="kwrd"&gt;value&lt;/span&gt; = &lt;span class="kwrd"&gt;true&lt;/span&gt;;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  23:  &lt;/span&gt;        }&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;  24:  &lt;/span&gt; &lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  25:  &lt;/span&gt;        &lt;span class="kwrd"&gt;return&lt;/span&gt; &lt;span class="kwrd"&gt;value&lt;/span&gt;;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;  26:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  27:  &lt;/span&gt;      }&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;

&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Una vez concluido el proceso de &amp;ldquo;Encoding&amp;rdquo; tendremos en la carpeta /Videos/Converted/ el video flv, el cual mostraremos en la segunda p&amp;aacute;gina llamada &amp;ldquo;MyVideo.aspx&amp;rdquo;, el cual llamaremos pasandole por Querystrings el nombre del video a mostrar.&amp;nbsp; El HTML es este:&lt;/p&gt;
&lt;div class="csharpcode"&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;   1:  &lt;/span&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;head&lt;/span&gt; &lt;span class="attr"&gt;runat&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;server&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;   2:  &lt;/span&gt;    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;title&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;My Videos Zone&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;title&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;   3:  &lt;/span&gt;    &lt;span class="rem"&gt;&amp;lt;!-- Hacemos referencia de la libreria que contiene el flowPlayer --&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;   4:  &lt;/span&gt;    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;script&lt;/span&gt; &lt;span class="attr"&gt;src&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;Player/flowplayer-3.1.3.min.js&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;type&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;text/javascript&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;script&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;   5:  &lt;/span&gt;&amp;lt;/head&amp;gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;   6:  &lt;/span&gt;&amp;lt;body&amp;gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;   7:  &lt;/span&gt;  &amp;lt;h1&amp;gt;Video Website - My Video Zone&amp;lt;/h1&amp;gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;   8:  &lt;/span&gt;    &amp;lt;form id=&lt;span class="str"&gt;&amp;quot;frmMain&amp;quot;&lt;/span&gt; runat=&lt;span class="str"&gt;&amp;quot;server&amp;quot;&lt;/span&gt;&amp;gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;   9:  &lt;/span&gt;    &amp;lt;div&amp;gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;  10:  &lt;/span&gt;        &amp;lt;script type=&lt;span class="str"&gt;&amp;quot;text/javascript&amp;quot;&lt;/span&gt;&amp;gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;  11:  &lt;/span&gt;            flowplayer(&lt;span class="str"&gt;&amp;quot;player&amp;quot;&lt;/span&gt;, &lt;span class="str"&gt;&amp;quot;player/flowplayer-3.1.3.swf&amp;quot;&lt;/span&gt;);&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;  12:  &lt;/span&gt;        &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;script&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;  13:  &lt;/span&gt;        &lt;span class="rem"&gt;&amp;lt;!-- player container--&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;  14:  &lt;/span&gt;        &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;a&lt;/span&gt;  &lt;span class="attr"&gt;id&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;player&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;runat&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;server&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;style&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;display: block; width: 320px;&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;  15:  &lt;/span&gt;            height: 240px;&amp;quot;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;  16:  &lt;/span&gt;            &lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;  17:  &lt;/span&gt;            &lt;span class="rem"&gt;&amp;lt;!-- Utilizado para colocar una mascara y evitar que el player toque el video automatico. --&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;  18:  &lt;/span&gt;            &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;img&lt;/span&gt; &lt;span class="attr"&gt;src&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;Player/flow_eye.jpg&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;alt&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;My Video Player&amp;quot;&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt; &lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;  19:  &lt;/span&gt;        &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;a&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;  20:  &lt;/span&gt;        &lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;  21:  &lt;/span&gt;    &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;div&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;  22:  &lt;/span&gt;    &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;form&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;  23:  &lt;/span&gt;&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;body&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;

&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;En la l&amp;iacute;nea 4 se hace referencia a la libreria de &lt;a target="_blank" href="http://flowplayer.org/demos/index.html"&gt;FlowPlayer&lt;/a&gt;, l&amp;iacute;nea 10 se coloca el player, l&amp;iacute;nea 14 el link sobre cual video hace referencia el player, este se asignar&amp;aacute; en el code behind de la siguiente manera:&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;div class="csharpcode"&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   1:  &lt;/span&gt; &lt;span class="kwrd"&gt;protected&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; Page_Load(&lt;span class="kwrd"&gt;object&lt;/span&gt; sender, EventArgs e)&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;   2:  &lt;/span&gt;    {&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   3:  &lt;/span&gt;        &lt;span class="kwrd"&gt;if&lt;/span&gt; (Request[&lt;span class="str"&gt;&amp;quot;Id&amp;quot;&lt;/span&gt;] != &lt;span class="kwrd"&gt;string&lt;/span&gt;.Empty)&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;   4:  &lt;/span&gt;        {&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   5:  &lt;/span&gt;            &lt;span class="kwrd"&gt;string&lt;/span&gt; video = &lt;span class="str"&gt;&amp;quot;~/Videos/Converted/&amp;quot;&lt;/span&gt; + Request[&lt;span class="str"&gt;&amp;quot;Id&amp;quot;&lt;/span&gt;].ToString();&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;   6:  &lt;/span&gt;            player.HRef = video;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   7:  &lt;/span&gt;        }&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;   8:  &lt;/span&gt;    }&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;

&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;El resultado es genial un archivo WMV de 25MB puede ser reducido a 666KB, el proyecto en ejecuci&amp;oacute;n se veria&lt;/p&gt;
&lt;p&gt;de esta forma&lt;/p&gt;
&lt;table width="500" cellpadding="2" cellspacing="0" border="0"&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td width="250" valign="top"&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/rcarreras/Upload1_5F00_045A18BD.gif"&gt;&lt;img height="105" width="240" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/rcarreras/Upload1_5F00_thumb_5F00_20A75ADD.gif" alt="Upload[1]" border="0" title="Upload[1]" style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" /&gt;&lt;/a&gt; &lt;/td&gt;
&lt;td width="250" valign="top"&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/rcarreras/ViewVideo1_5F00_4AA75905.gif"&gt;&lt;img height="199" width="240" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/rcarreras/ViewVideo1_5F00_thumb_5F00_21501107.gif" alt="ViewVideo[1]" border="0" title="ViewVideo[1]" style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" /&gt;&lt;/a&gt; &lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;El codigo fuente puede ser descardo desde &lt;a target="_blank" href="http://cid-9b98bf3b8ff56d64.skydrive.live.com/self.aspx/Public/BlogPost/WebsiteVideos/VideosWebsite.zip"&gt;Aqu&amp;iacute;&lt;/a&gt;: &lt;/p&gt;
&lt;p&gt;Technorati Tags: &lt;a rel="tag" href="http://technorati.com/tags/ASP.NET"&gt;ASP.NET&lt;/a&gt;,&lt;a rel="tag" href="http://technorati.com/tags/FFmpeg"&gt;FFmpeg&lt;/a&gt;,&lt;a rel="tag" href="http://technorati.com/tags/FlowPlayer"&gt;FlowPlayer&lt;/a&gt;,&lt;a rel="tag" href="http://technorati.com/tags/Visual+Studio"&gt;Visual Studio&lt;/a&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=155490" width="1" height="1"&gt;</content><author><name>rcarreras</name><uri>http://geeks.ms/members/rcarreras/default.aspx</uri></author><category term="FlowPlayer" scheme="http://geeks.ms/blogs/rcarreras/archive/tags/FlowPlayer/default.aspx" /><category term="FFmpeg" scheme="http://geeks.ms/blogs/rcarreras/archive/tags/FFmpeg/default.aspx" /><category term="ASP.NET" scheme="http://geeks.ms/blogs/rcarreras/archive/tags/ASP.NET/default.aspx" /></entry></feed>