Tip: Problema con multiples etiquetas de FORM en una WebForm de ASP.NET

Posted by Gabriel on November 15th, 2009
.NET Logo

.NET Logo

Estoy trabajando en adaptar un diseño HTML/CSS a una aplicación existente de ASP.NET, en Webforms.

Ya estando casi todo lo visual adaptado, y viendose bien, me faltaba transformar una forma de log-in a mark-up de XML, para poder hacer el código de Login.

Como el usuario debía poder loggearse desde cualquier ASPX de la parte pública, decidi transformar los controles de log-in originales en un ASP.NET User Control (ASCX), para poder tener la logica de todo el log-in en un solo lugar, y poder reutilizar el User Control en todas las paginas publicas.

Cree el puro ASCX con el Markup, y abri la pagina en IE. Todo bien.

Convertí el <input type=”button”> a un <asp:ImageButton>Error, tengo que agregar la etiqueta de <form runat=server>.

Agregué la etiqueta, View in Browser, no mas error, pero todo el contenido del panel derecho se desplazó hacia abajo.

Despues de batallar como 1 hora con el problema, e intentar googlear, me topé con un artículo que tenía como título “Multiple forms causing strange CSS problem“. Pero yo no tengo multiples formas (eso creí), así que lo ignoré.

Despues de media hora de moverle…recordé que todo el problema empezó cuando agregué la etiqueta de <form runat=server> al ASPX. Regreso al mark-up del User Control (ASCX) y ahi estaba…no había borrado la etiqueta de <form> original al momento de pasar el HTML de la forma de log-in.

Borre la etiqueta de <form> del User Control, y listo…el diseño se ve bien otra vez.

Así que como moraleja….Tener mas de una etiqueta <form> en una ASP.NET Webform te genera problemas raros de CSS.

Cursos de Visual Studio 2010 y .NET Framework 4.0 gratis

Posted by Gabriel on October 21st, 2009
Channel 9 Logo

Channel 9 Logo

La gente de Channel 9, uno de los mejores sites para aprender de desarrollo y especificamente de .NET, acaba de abrir una sección nueva llamada Channel 9 Learning Center.

Para inaugurar la sección, publicaron dos cursos iniciales:

Visual Studio 2010 Logo

Visual Studio 2010 Logo

La calidad del contenido que este site genera es buenísima. Los videos siempre son interesantes, y las personas que conducen y son entrevistadas en los videos siempre es gente importante y muy conocedora de la industria.

Algunos de los temas del curso de Visual Studio 2010 son:

  • ASP.NET 4.0
  • Data Platform
  • Application Lifecycle Management
  • Windows Communication Foundation and Workflow
  • Managed Languages

Así que si no se quieren quedar obsoletos…vayan a aprovechar este material. Las mejoras en el .NET Framework 4.0 son muchas, y esta version implica cambio de CLR…así que hay mucho que aprender.

Como medir tiempo de ejecucion de codigo en C# y .NET

Posted by Gabriel on August 20th, 2009

Proximamente voy a hacer un comparativo de performance entre Entity Framework y Subsonic, así que se me ocurrió de una vez escribir este post sobre la manera correcta en que se debe medir el tiempo de ejecución de un cierto bloque de código utilizando C# y .NET.

La medición del tiempo se hace usando una instancia de la clase StopWatch, que se encuentra en el namespace de System.Diagnostics. La clase StopWatch provee un conjunto de métodos y propiedades que pueden ser usados para medir con alta precisión el tiempo transcurrido entre intervalos.

Los métodos disponibles sobre esta instancia serían:

  • Start() - inicia el contador a partir del último lapso. La cuenta es acumulativa, es decir, si se verifica la propiedad ElapsedMilliseconds después de 4 llamadas a los métodos de Start y Stop, el tiempo desplegado será el acumulado de los 4 intervalos.
  • Stop() - detiene momentaneamente el timer.
  • Reset() - reinicia los valores almacenados del timer

Las propiedades disponibles, que usaríamos para desplegar el tiempo que tomó alguna rutina, serían:

  • Elapsed - Regresa una instancia de tipo TimeSpan que determina el tiempo que ha transcurrido desde que se llamó al método Start() por primera vez.
  • ElapsedMilliseconds – Regresa un valor de tipo long que indica los milisegundos transcurridos desde la primera vez que se llamó al método Start().
  • ElapsedTicks - Regresa un valor de tipo long, que indica los Ticks que han pasado desde la primera vez que se llamó al método Start(). Nota importante respecto a esta propiedad: Los ticks de un StopWatch no son iguales a los ticks de un DateTime. En DateTime, cada tick representa un intervalo de 100 nanosegundos. En StopWatch, un tick representa un intervalo de tiempo equivalente a 1 segundo dividido entre la propiedad Frequency del StopWatch.
  • IsRunning - determina si el timer está activo y contando Ticks.

Las propiedades IsHighResolution y Frequency no son propias de una instancia StopWatch, sino de la clase StopWatch.

IsHighResolution indica si el timer utilizado está basado en un contador de performance de alta resolución. Esto depende del procesador/arquitectura de la computadora en la que está corriendo el código

Frequency representa el numero de StopWatch ticks por segundo.

Ahora, un poco de código de ejemplo:


Console.WriteLine(string.Format("IsHighResolution: {0}", Stopwatch.IsHighResolution ? "Yes" : "No"));
Console.WriteLine(string.Format("Frequency: {0}", Stopwatch.Frequency));
Console.WriteLine("----------------------");

var dos = "2";
var suma = 0;

//Medir int.Parse
var timer = Stopwatch.StartNew();

for (var i = 1; i <= 1000; i++)
{
suma += int.Parse(dos) * i;
}

timer.Stop();
Console.WriteLine(string.Format("Suma: {0}", suma));
Console.WriteLine(string.Format("Elapsed para int.Parse: {0}", timer.Elapsed));
Console.WriteLine(string.Format("ElapsedMilliseconds para int.Parse: {0}", timer.ElapsedMilliseconds));
Console.WriteLine(string.Format("ElapsedTicks para int.Parse: {0}", timer.ElapsedTicks));
Console.WriteLine("----------------------");

suma = 0;

//Medir Convert.ToInt32()
timer = Stopwatch.StartNew();

for (var i = 1; i <= 1000; i++)
{
suma += Convert.ToInt32(dos) * i;
}

timer.Stop();
Console.WriteLine(string.Format("Suma: {0}", suma));
Console.WriteLine(string.Format("Elapsed para Convert.ToInt32: {0}", timer.Elapsed));
Console.WriteLine(string.Format("ElapsedMilliseconds para Convert.ToInt32: {0}", timer.ElapsedMilliseconds));
Console.WriteLine(string.Format("ElapsedTicks para Convert.ToInt32: {0}", timer.ElapsedTicks));

da el siguiente resultado:

Midiendo intervalos de tiempo con la clase StopWatch

Midiendo intervalos de tiempo con la clase StopWatch

Como se puede apreciar, int.Parse es ligeramente más rapido que Convert.ToInt32().

De manera simplemente informativa…hay otra manera de medir intervalos de tiempo que mucha gente usa, y NO es correcto ni recomendable. Lo hacen asignando el valor de DateTime.Now a una variable de tipo DateTime y luego lo resta al valor de DateTime.Now en el momento que quieren dejar de medir.

Hay todavía otra manera similar al uso de DateTimes, que es usando la propiedad Environment.TickCount.Esto es incorrecto por tres razones:

1. Si existe una clase especializada para hacer esto en el framework, digase StopWatch, hay que usarla.
2. Environment.TickCount es signed (puede representar valores negativos también) lo cual implica que después de 25 dias, se va a entrar al rango negativo y se tendría que eliminar el bit del símbolo para poder hacer calculos correctos. Después de 50 dias, se llenarían todos los bits de la variable y la cuenta se reiniciaría. Ver discusión en StackOverflow.com donde se menciona esto.
3. En palabras del mismo Scott Hanselman, y mencionado en el mismo link de la razon #2: As an unrelated aside, if you DO use DateTime for Date-related math calculations, always use DateTime.UtcNow as DateTime.Now is susceptible to Daylight Savings Time…your calculations could be off by a hour, or worse, negative numbers.

Es decir, es muy facil que a la gente se le olvide que si va a cronometrar de esta manera, usar DateTimes para medir intervalos puede ser susceptible a los conocidos “horarios de verano”, que desfazan por temporadas el reloj por +- 1 hora. Cualquiera de las dos alternativas a StopWatch (DateTime o Environment.Ticks) es relativamente riesgosa para ser útil.

Links de Referencia:

Clase StopWatch @ MSDN

Tres buenos libros para aprender .NET y ASP.NET

Posted by Gabriel on August 8th, 2009

Ultimamente en el trabajo he entrevisando a varios desarrolladores candidatos a unirse a la empresa, que dicen han trabajado en proyectos relacionados con sitios de ASP.NET, pero que dificilmente podían explicar el ciclo de vida de una pagina en ASP.NET, o que no saben explicar exactamente que es el ViewState y otras features basicas de .NET en general.

Decidí escribir este post para recomendar estos tres libros, que creo que son los primeros que leí sobre .NET y que considero me dieron ventaja sobre otros candidatos al presentarme a alguna entrevista de trabajo. Estos libros son relativamente baratos y definitivamente pueden cambiar tu carrera. Si apenas vas empezando a aprender .NET o si simplemente quieres volverte un mejor programador, te recomiendo estos libros. Puede que sea una inversion al principio, pero los reviews de estos libros hablan por sí solos, y creo que el costo de estos se regresa inmediatamente al conseguir un trabajo gracias a lo aprendido por ellos.

Sams Teach Yourself ASP.NET 3.5 in 24 Hours

Sams Teach Yourself ASP.NET 3.5 in 24 Hours

El primer libro se llama Sams Teach Yourself ASP.NET 3.5 in 24 Hours. Lo que me gustó es que como el titulo del libro lo indica, dividen el contenido en lecciones cortas pero completas que puedes aprender en un dia.  Trata principalmente los conceptos básicos de .NET y ASP.NET. El autor es Scott Mitchell, tambien relacionado con el sitio 4GuysFromRolla.com que fue de los primeros en proporcionar articulos muy completos sobre .NET. El libro cuesta $23 USD en Amazon.

ASP.NET 2.0 Website Programming: Problem - Design - Solution (Programmer to Programmer)

ASP.NET 2.0 Website Programming: Problem - Design - Solution (Programmer to Programmer)

El segundo libro es ASP.NET 2.0 Website Programming: Problem – Design – Solution (Programmer to Programmer). Este libro enseña a diseñar sites de ASP.NET de principio a fin, desde la arquitectura general hasta las features más especificas de interfaz de usuario, y explica cada decision que se toma. Se tratan y explicas temas como el Provider Model, ASP.NET Membership, ASP.NET Health Monitoring, MasterPages,  Webparts, databound controls, etc. El proyecto/sitio que se desarrolla con las lecciones de este libro se llama The BeerHouse, una combinacion de CMS (Content Management System)  e E-Comerce, y es una solución tan bien diseñada que posteriormente se convirtió en un Starter Kit de ASP.NET, promocionado en el mismo site de ASP.NET de Microsoft. Muchos desarrolladores junior simplemente adoptan el estilo de desarrollo de la empresa para la cual trabajan, sin cuestionar o aprender la base sobre el por qué se hacen las cosas de esa manera, y este libro explica la razon de decisiones sobre aspectos como arquitectura de la aplicación, clases base, estrategias de Caching, etc. Definitivamente lean este libro, escrito excelentemente por Marco Bellinaso. Cuesta $26 dolares en Amazon.

ASP.NET 3.5 Unleashed

ASP.NET 3.5 Unleashed

ASP.NET 3.5 Unleashed es el último libro, y es como la biblia (1920 páginas) de ASP.NET. Siempre que necesitaba hacer algo muy específico en ASP.NET y no sabía como, en este libro lo encontraba. Este libro cuesta un poco mas, $40 dolares, pero como dije al principio, los reviews hablan por si solos.


Copyright © 2007 Gabriel Rodriguez Plancarte. All rights reserved.