ASP.Net AJAX, pero… Problemas de navegación (Back Button)

Imagino que todos se habrán enfrentado al mismo dilema al comenzar a desarrollar una aplicación Ajax con UpdatePannels.

Las 2 preguntas más frecuentes son:

  1. Si uso UpdatePannels, pierdo el control de la navegación? , es decir, El usuario nunca podrá volver atras, y la pagina siempre será la misma solo que cambia su contenido?
  2. El usuario no tendrá la posibilidad de acceder en un futuro (Bookmark) a una página que ha sido producto de alguna interacción con Ajax?

La respuesta es SI, pero NO.

SI por que al utilizar un UpdatePanel el browser nunca se dará cuenta que estamos mostrando otro contenido por que lo que esta haciendo internamente el UpdatePanel es cambiar el HTML del lado del cliente como todos sabemos.

y NO, por que existe un tipo llamado Nikhil Kothari que se ha encargado de desarrollar un control para que podamos hacer esto.

En las versiones anteriores de ASP.NET Ajax (CTP y RC) ya había desarrollado éste control, pero los que lo conociamos estabamos esperando el mismo para la RTM.

Recien acabo de mirar su Blog y Sorpresa! ya ha publicado en éste post la versión actualizada, que ademas incluye dos controles adicionales:

  • StyledUpdatePanel
  • AnimatedUpdatePanel

Además pueden ver un video, que por cierto esta hecho con WPF/E, donde se muestra visualmente como funciona el control.

Espero que esto les sea de utilidad si ya les han criticado sus aplicaciones Ajax por no poder volver atras :)

Primeros pasos con .NET 3.0

Estoy comenzando a ponerme al tanto de todo lo nuevo que esta surgiendo en temas de deasarrollo en plataforma Microsoft, y como todos ya deben haber escuchado por ahi, lo nuevo es:

  • .NET Framework 3.0
    • WCF (Windows Comunication Foundation)
    • WPF (Windows Presentation Foundation)
    • WWF (Windows WorkFlow Foundation)
    • CardSpace

Por el momento estoy instalando todo lo necesario para comenzar a estudiar el tema sobre Windows XP y el motivo principal de este post es sobre la instalación de estas extensiones para poder comenzar.

  1. Descargar e instalar la nueva version del .NET Framework 3.0 RTM , si estan utilizando Windows Vista no hace falta ya que lo trae integrado.
  2. Descargar e instalar Windows Vista SDK aunque su nombre diga que es para vista debemos instalarlo igualmente en XP veremos que cuando comenzamos a instalar veremos que el instalador nos dirá que sirve tambien para Windows XP (SP2). Este punto es importante para que al intentar instalar el punto no nos aparezca el mensaje:
    “Setup has detected that recommended components are missing. To get an integrated documentation experience for Visual Studio 2005 extensions for .NET Framework 3.0 (WCF_WPF) November 2006 CTP you must have MSDN documentation for Visual Studio 2005 SDK installed. It is recommended that you install the MSDN documentation for Visual Studio 2005 and restart setup.”
    “Setup has detected that recommended components are missing. To get an integrated documentation experience for Visual Studio 2005 extensions for .NET Framework 3.0 (WCF_WPF) November 2006 CTP you must have MSDN documentation for Visual Studio 2005 and the .NET Framework 3.0 documentation from Windows SDK installed. It is recommended that you install the MSDN documentation for Visual Studio 2005 and the .NET framework 3.0 documentation from the Windows SDK and restart setup.”
  3. Descargar e instalar las extensiones de Visual Studio para WCF y WPF incluso si estan utilizando Windows Vista
  4. Descargar e instalar las extensiones de Visual Studio para WWF
  5. Para verificar que todo ha ido bien, abrimos Visual Studio 2005, y en “Crear nuevo proyecto”, deberiamos tener un nuevo nodo “.NET Framework 3.0″ tanto para VB, como para C# y al darle click a la derecha tendremos nuestro template para crear una nueva aplicación de tipo WPF.

Espero que les haya servido.

ASP.NET Ajax 1.0 Final Release

Ha llegado la hora!, y despues de tener que sufrir con las  Betas y el Release Candite, esperando la versión final, aquí la tenemos recien salida del horno.

  1. ASP.Net Ajax Version 1.0 Final (Gratuita)
  2. El ya conocido AjaxControlToolkit  (Release 10123 Production) el cual soluciona unos 75 bugs reportados por la comunidad y algunos controles nuevos como Calendar, MaskedEdit y los tan esperados Tabs.
  3. El “ASP.NET 2.0 AJAX Futures January CTP” que son nuevas utilidades que aun estan en desarrollo.

Aquí les dejo los links:

  • ASP.NET AJAX Home Page
  • ASP.NET AJAX Control Toolkit
  • ASP.NET 2.0 AJAX Futures January CTP
  • MySQL Visual Studio Plugin

    Plugin interesante para integrar en nuestro Visual Studio 2005, conexiones con bases de datos mySQL, lo cual nos brinda la posibilidad de administrar:

    • Estructura de tablas
    • Registros de nuestras tablas
    • Stored Procedures
    • Vistas
    • Funciones
    • UDF’s

    Es necesario tener instalado el .NET Connector en nuestro GAC (Global Asssembly Cache), para eso debemos descargar el Windows Source and Binaries (ZIP) y luego el instalador para el Plugin.

    Luego simplemente abrimos nuestro Visual Studio y en el Server Explorer > Data Connections, hacemos click con el botón derecho “Add new connection…” , botón Change para cambiar el DataSource y seleccionamos MySQL Database.

    Nos encontramos entonces con una pantalla similar a ésta, y lo unico que queda por hacer es indicarle cúal es nuestro servidor, el usuario y contraseña para conectarnos.

    Y listo, ya podemos disfrutar de la integración de MySQL en nuestro entorno de desarrollo de Visual Studio 2005

    .NET Connector v5.0.3 GA/Production for MySQL

    Se ha liberado la nueva versión del .NET Connector para MySQL, pueden encontrarla aquí.

    Para el que aún no conoce esta herramienta, es un DRIVER que nos permite conectar a una base de datos de MySQL desde nuestras aplicaciones .NET.

    Ademas en esta la página se incluyen otros Conectores para utilizar con otras tecnologías como ser ODBC / J / MXJ y PHP.

    Algunas de las mejoras y BUG Fixes que trae esta nueva versión la pueden encontrar en este BLOG, a mi particularmente me ha servido para solucionar un problema que tenía en aplicación que estoy desarrollando actualmente y es justamente el  Bug #23905 Stored procedure usages is not thread safe .

    Me encontré con este problema al intentar testear la aplicación web con la herramienta de Microsoft Web Application Stress Tool (WAST), notando así que al ejecutar multiples Threads se generaban errores al llamar a los Stored Procedures.

    Web Application Stress Tool (WAST)

    Herramienta gratuíta e indispensable para testear performance en nuestros proyectos WEB . Esto nos va a servir, entre otras cosas, para:

    • Testeos de Performance
    • Saber como reaccionan nuestras aplicaciones frente a multiples Threads / Consultas
    • Decidir el planeamiento para el host de nuestras aplicaciones

    Pueden descargarse la aplicacion desde este link en Microsoft así como tambien la documentacón básica para comenzar a utilizarla.

    Esta aplicación nos ofrece multiples opciones, pero cabe destacar la posibilidad de exportar los resultados de los analisis a CSV para luego realizar gráficos estadisticos etc…

    Primera versión de Web Client Software Factory (WCSF)

    El 13 de Enero, Mariano Szklanny de Southworks nos comenta que ya se ha liberado la primera versión de Web Client Software Factory  la cuál ya esta disponible para descargar desde aquí.

    ésta es otra de las tantas “guias” que nos ofrece la gente de Microsoft para hacernos la vida mas facil y mas ordenada. Lo interesante de todo esto, es que estos CRANEOS se juntan para analizar y definir cúales son los casos mas comunes a los que nos podemos enfrentar a la hora de diseñar y producir nuestras aplicaciones y la mejor forma para llevarlas a cabo.

    Durante ésta mañana, comenzaré a ponerme al dia con todo ésto.

    FCKEditor submite contenido vacío dentro de UpdatePanel en FireFox.

    En el ultimo proyecto que estoy desarrollando, me encontré con la necesidad de utilizar un edior WYSIWYG  (What you see is what you get) y he optado por FCKEditor. Un completisimo editor, que incluye muchas funcionalidades, entre algunas:

    • Inserción de imagenes, con un Server Browser que permite subir imagenes a nuestra aplicación.
    • Insercion de archivos en flash.
    • Previsualización
    • Posibilidad de maximizar el contenido que estamos editando.
    • Asignacion de archivo de estilos, y previsualización de los mismos en tiempo real.
    • Integración, para ASP.NET, ColdFusion, ASP, Java, PHP y otros…
    • Y muchas cosas mas…

    Pero bueno, vamos al problema que me he encontrado:

    Al insertar este control en un UpdatePanel de ASP.Net Ajax en intentar submitir los cambios en FireFox, se pierden el texto ingreado en el control.

    Para que esto no suceda, como indican en la FCKEditor Wiki debemos registrar un Script en nuestra pagina, y añadir un atributo onclick, en nuestro control que se encarga de enviar los datos.

    Para ello, crearemos un Script y lo guardaremos por ejemplo en /FCKEditor/editor/js/FCKHack.js con las siguientes lineas de código:

    // Some Class function MyFCKClass() { this.UpdateEditorFormValue = function() { for ( i = 0; i < parent.frames.length; ++i ) if ( parent.frames[i].FCK ) parent.frames[i].FCK.UpdateLinkedField(); } } // instantiate the class var MyFCKObject = new MyFCKClass();

    Luego en nuestra pagina, añadiremenos las siguientes lineas en el Page_Load:

    protected void Page_Load(object sender, EventArgs e) { if (!Page.IsPostBack) { if (!Page.ClientScript.IsClientScriptBlockRegistered("FCKAjaxHack")) { Page.ClientScript.RegisterClientScriptBlock(this.GetType(), "FCKAjaxHack", String.Format(@"<script type=""text/javascript"" src='{0}'></script>", ResolveUrl("~/FCKEditor/editor/js/FCKHack.js"))); } } string sFCKHack = @" if (eval('(typeof(MyFCKObject) != \'undefined\')')) { MyFCKObject.UpdateEditorFormValue(); return true; } else { return true; }"; cmd.Attributes.Add("onclick", sFCKHack); }

    Donde cmd  en este caso es el botón que se encarga de submitir la página.

    Fuentes:
    http://forums.asp.net/1513800/ShowThread.aspx#1513800
    http://wiki.fckeditor.net/Troubleshooting#head-c83215c3393542ddc261fb2b7a64b60a41253d76

    Windows Live Writer (Beta)

    Ayer estuve luchando un poquito con el WordPress intentando buscar algún plugin interesante para escribir mis posts. Sobretodo para poder incluir en ellos código "tabulado y coloreado".

    Despues de varios intentos de plugins se me vino a la memoria que, Angel Java Lopez hábia comentado en un post hace unos dias la existencia del nuevo Microsoft Live Writer una aplicacion de escritorio pensada para escribir posts y publicarlos en diferentes Blogs Engines.

    Los motores de Blogs soportados, son Windows Live Spaces, Blogger, LiveJournal, TypePad, WordPress , entre otros.

    La verdad es que me quede asombrado, al instalarlo, y al intentar publicar mi primer post por la sencillez y facilidad. Y la poca por no decir NADA tarea de configuración necesaria para poder postear en mi nuevo WordPress.

    Ademas de todas las funcionalidades que se nos suelen venir a la cabeza al pensar en un programa de estas caracteristicas, éste incluye una opción para añadir Mapas a nuestros posts utilizando Windows Live Local el cuál viene integrado, Ver Mapa de Ejemplo.

    La primer impresión al utilizarlo fue un poco decepcionante, ya que lo que buscaba principalmente era poder insertar codigo, como les cuento en primer párrafo. Pero… buscando un poquito por internet, me encontre con este Plugin, que justamente hace eso, y la verdad que lo hace de maravillas. Fue el primero que encontré pero ahora que estoy escribiendo esto para mencionar la URL me he encontrado con este otro y tal vez luego lo pruebe.

    Cabe destacar, que además de la aplicación, también se incluye el Windows Live Writer SDK , el que nos permitirá añadirle funcionalidad, programando nuestras propias mejoras.

    Aquí les dejo un ScreenShoot para que vean como es la UI. Y de paso pruebo la insención de Imágenes con Thumbnails. Saludos!

    Tamaño de columnas en GridView

    Hoy me he dado cuenta al intentar utilizar los CSS Friendly Adapters para un GridView que en la Version 1.0 Final, no brinda la posibilidad de setearle por medio de estilos el tamaño de cada columna.

    Lo primero que se me ocurrió fue agregarle a cada BoundField el atributo HeaderStyle-Width pensando que el adaptador me iba a agregar el width por cada columna, pero no fue así.

    Ya me habia puesto a mirar el codigo del archivo GridViewAdapter.cs, pero como no estaba muy inspirado, me puse a buscar un poco en la web, donde me encontre con este thread. En el cual me he encontrado con la solución.

    Resumiendo un poco el post, lo que debemos hacer es añadir un par de lineas al método WriteRows del archivo GridViewAdapter.cs, el cual lo adjunto al final de este post.

    Lo que logramos es que al setear el atributo HeaderStyle-CssClass de cada BoundField del GridView, el Adapter agrege un class a cada <TH> de nuestra tabla, para que luego por medio de CSS podemos encontrar la columna y setearle su tamaño.

    Además podemos añadir también un atributo ItemStyle-CssClass el cuál nos permitirá añadirle un class a cada una de nuestras <TD> , por ejemplo, para configurar la alineación del contenido de las columnas. En el siguiente ejemplo no incluyo esta opción pero el comportamiento es el mismo, incluso podriamos asignarle el mismo nombre de clase que para el <TH>.

    Un ejemplo puede ser:

    <asp:GridView ID="grdNews" runat="server" AutoGenerateColumns="false"> <Columns> <asp:BoundField HeaderText="ID" DataField="NewsLanguageID" HeaderStyle-CssClass="NewsID" /> <asp:BoundField HeaderText="Titulo" DataField="Title" HeaderStyle-CssClass="NewsTitle" /> </Columns> </asp:GridView>

    Lo que nos generaría un HTML similar a este:

    <div class="AspNet-GridView"> <table cellpadding="0" cellspacing="0" summary=""> <thead> <tr> <th class="NewsID" scope="col">ID</th> <th class="NewsTitle" scope="col">Titulo</th> </tr> </thead> <tbody> <tr> <td>1</td> <td>Titulo Novedades 1</td> </tr> <tr class="AspNet-GridView-Alternate"> <td>3</td> <td>Titulo Novedades 2</td> </tr> </tbody> </table> </div>

    Y luego en la hoja de estilos, algo así como:

    .AspNet-GridView .NewsID { width:50%; } .AspNet-GridView .NewsTitle { width:50%; }

    A continuacion adjunto el método completo y el codigo agregado que se encuentra despues del comentario ” — Añadido —

    private void WriteRows(HtmlTextWriter writer, GridView gridView, GridViewRowCollection rows, string tableSection) { if (rows.Count > 0) { writer.WriteLine(); writer.WriteBeginTag(tableSection); writer.Write(HtmlTextWriter.TagRightChar); writer.Indent++; foreach (GridViewRow row in rows) { writer.WriteLine(); writer.WriteBeginTag("tr"); string className = GetRowClass(gridView, row); if (!String.IsNullOrEmpty(className)) { writer.WriteAttribute("class", className); } // Uncomment the following block of code if you want to add arbitrary attributes. /* foreach (string key in row.Attributes.Keys) { writer.WriteAttribute(key, row.Attributes[key]); } */ writer.Write(HtmlTextWriter.TagRightChar); writer.Indent++; foreach (TableCell cell in row.Cells) { DataControlFieldCell fieldCell = cell as DataControlFieldCell; if ((fieldCell != null) && (fieldCell.ContainingField != null)) { DataControlField field = fieldCell.ContainingField; if (!field.Visible) { cell.Visible = false; } if ((field.ItemStyle != null) && (!String.IsNullOrEmpty(field.ItemStyle.CssClass))) { if (!String.IsNullOrEmpty(cell.CssClass)) { cell.CssClass += " "; } cell.CssClass += field.ItemStyle.CssClass; } // ----------------------------- // -------- Añadido ------------ // ----------------------------- if (tableSection == "thead") { if ((field.HeaderStyle != null) && (!String.IsNullOrEmpty(field.HeaderStyle.CssClass))) { if (!String.IsNullOrEmpty(cell.CssClass)) { cell.CssClass += " "; } cell.CssClass += field.HeaderStyle.CssClass; } } else { if ((field.ItemStyle != null) && (!String.IsNullOrEmpty(field.ItemStyle.CssClass))) { if (!String.IsNullOrEmpty(cell.CssClass)) { cell.CssClass += " "; } cell.CssClass += field.ItemStyle.CssClass; } } // ----------------------------- // ----------------------------- } writer.WriteLine(); cell.RenderControl(writer); } writer.Indent--; writer.WriteLine(); writer.WriteEndTag("tr"); } writer.Indent--; writer.WriteLine(); writer.WriteEndTag(tableSection); } }

    « Entradas anterioresEntradas siguientes »