ASP.NET 4.0 Web Forms Routing

Una de las novedades que podemos encontrar en ASP.NET 4.0 es el enrutado de Web Forms, para exponer URL limpias y orientadas a SEOSearch Engine Optimization

Para utilizar el enrutamiento en nuestras aplicaciones ASP.NET 4.0 con web forms, únicamente tenemos que modificar nuestro fichero Global.asax para habilitar el enrutado al iniciar la aplicación.

public static void RegisterRoutes(System.Web.Routing.RouteCollection routes)
{  
  routes.MapPageRoute("WebFormRoute", "WebForm/{DatoEntrada}", 
      "~/WebForm.aspx");
}

void Application_Start(object sender, EventArgs e) 
{
   RegisterRoutes(RouteTable.Routes);
}

El método RouteCollection.MapPageRoute permite definir las rutas para las aplicaciones de formularios Web Forms.

Parámetros:

  • Nombre de la ruta
  • Modelo
  • Ruta física de la página.

Una vez que nuestra aplicación ya admite el enrutado podemos utilizar esta funcionalidad de diferentes maneras.

1. De forma declarativa:

Utilizando RouteParameter con nuestros DataSources.

2. De forma Imperativa:

 3. Con soporte de PostBacks:

  • Response.RedirectToRoute()
  • Response.RedirectToRoutePermanent()

4. Recuperación de Parámetros enviados en la petición:

Con la colección RouteData.

De esta sencilla manera podemos empezar a familiarizarnos con las rutas utilizadas por las aplicaciones MVC y facilitar el paso de nuestras aplicaciones a este modelo de una manera más natural.

Anuncio publicitario

Cargar Controles de Usuario dinámicamente ASP.NET AJAX

En respuesta a la consulta de Julitogtu generada en los foros de MSDN, he generado un ejemplo práctico de su consulta. Ya que le aconsejé la utilización de controles de usuarios generados dinámicamente en detrimento de los famosos iframes.

Pero esta generación se complica especialmente si quieres cargar estos controles con llamadas asíncronas, por el hecho de que estos controles se generan en el servidor.

Lo primero que tenemos que hacer es tener los controles de usuario bien organizados para poderlos utilizar desde el cliente con llamadas a métodos de Página o servicios web, de esta manera evitaremos todo el tráfico que genera los updatePanels.

Yo he generado tres controles de usuarios distintos para probar diferentes posibilidades que nos podemos encontrar en la vida real.

  • Un formulario: Encontraremos los típicos controles asp.net para introducir los datos de un formulario.
  • Login: Dentro de este control tendremos otro ASP.NET para la creación de usuarios registrados.
  • Grid: Control de usuarios donde mostraremos los datos de una base de datos con un GridView. Sigue leyendo

Cancelar peticiones ASP.NET AJAX

ASP_NET-AJAX 

Para plantear la cancelación de una llamada asíncrona realizada con ASP.NET AJAX primero tenemos que tener en cuenta como hemos realizado esta petición, para realizar esta acción podemos elegir entre dos opciones diferenciadas.

  1. El control UpdatePanel que encapsula las peticiones web de forma asíncrona.
  2. Las llamadas a Métodos de Páginas o Servicios web desde el cliente.

1. UpdatePanel

Si hemos elegido la primera opción, cualquier control que realice una petición al servidor será controlada por el ScriptManager y podremos utilizar este mismo control para cancelar la tarea del cliente.

Para poder habilitar la cancelación al cliente usaré una barra de progreso la cual informará al usuario que se esta realizando una tarea y además tendrá un botón para poder cancelar este proceso.

Centrar UpdateProgress en un UpdatePanel ( JQuery )

Lo único que necesitamos es que el botón de la barra de progreso llame a una función javascript, que será la encargada de anular la petición. Sigue leyendo

Buscar en un TreeView con Autocomplete y JQuery

Para que una aplicación web tenga un interfaz de usuario fácil de utilizar y facilitemos su usabilidad no hay más remedio que pasar por un lenguaje script y por eso cada vez que tengo la oportunidad me gusta hacer alguna práctica con JavaScript y en este caso utilizando la librería JQuery que facilita nos facilita mucho esta tarea.

La excusa que utilizo hoy para hacer este ejemplo es una petición en los foros MSDN para hacer una búsqueda de texto en un TreeView y poder seleccionar posteriormente el nodo que coincida con esta selección.

Para esto voy a utilizar un plugin de Jquery que provee a los inputs la extensión de mostrar un autoComplete donde se mostraran los textos de los nodos que coincidan con el texto introducido en el input.

Para las referencias a las librerías Jquery utilizare CDN para aprovechar sus beneficios y no tener obligatoriamente las librerías en nuestro proyecto. Sigue leyendo

GridView Custom Edit

Este año ha sido mucho más productivo de lo que me esperaba y el que comienza parece que me va a deparar nuevos retos personales que espero sean lo más positivos posible.

Para empezar con buen pie y no cejar en mis artículos técnicos, hoy haré un nuevo ejemplo práctico para personalizar un control GridView, permitir editar sus elementos con JavaScript y enviar al servidor de manera asíncrona solo las modificaciones realizadas.

Realmente cada vez existen más controles que nos permiten mejorar la experiencia de usuario y potencian usabilidad de los usuarios. Pero con un poco de tiempo es posible dar este toque a los controles con los que trabajamos cotidianamente.

Para comenzar esta práctica crearemos un nuevo proyecto web y cargaremos una grid con la base de datos NorthWind que no puede faltar en cualquier ejemplo que utilice una base de datos SQL.

Para poder editar la grid lo que tenemos que hacer primero es marcar las celdas que se podrán editar con una propiedad llamada «editable»,  guardar el nombre del registro para tenerlo a mano a la hora de guardar las modificaciones y agregar el evento onmousedown para que llame a la función javaScript de edición tanto en IE como en Firefox. Sigue leyendo

Jquery – la potencia sin control no sirve de nada !!

Yo soy de esos programadores web que están disfrutando con las bondades que nos ofrece JQuery desde su aparición. Esta librería nos simplifica enormemente nuestros desarrollos con JavaScript y los hace mucho más productivos.

Pero hasta ahora realmente no había aprovechado todo su potencial y es precisamente en  esta situación cuando me ha defraudado un poco.

Me explico:

He querido tratar todo un interfaz de usuario con JQuery para optimizar la presentación y evitar las idas y venidas de la página para consultar los datos. Para eso recupero la información para rellenar un control, desde mi capa de datos utilizando un método de página y formato Json, de esta manera se evita enviar la información innecesaria de la página.

Estos datos tienen una estructura mas o menos compleja o al menos más compleja que una simple tabla, porque se tiene que representar en diferentes niveles. Sigue leyendo

¿Existe la columna con DataReader?

En mi empresa desde un principio hemos utilizado una herramienta propia para generar la capa de lógica de negocios, adaptada  al 100% a nuestras necesidades  y que ha ido creciendo con el tiempo. Eso nos ha beneficiado en tener controlado en todo momento nuestros objetos de negocio y nos ha evitado tener que hacer un salto obligatorio para utilizar alguno de los ORM que existen en el mercado, como puede ser: Entity Framework, NHibernate, etc.

Nuestra capa de acceso a datos “DAL” encapsula toda la lógica de conexiones a datos independientemente del proveedor y hay una de las funciones que retorna un lector de datos para poder personalizar la lectura de los datos desde la capa de lógica de Negocios.

/// <summary>
/// Ejecuta el comando creado y retorna el lector.
/// </summary>
/// <returns>El resultado de la consulta.</returns>
public DbDataReader EjecutarConsulta(string cmd, CommandType tipo)
{
   this.comando.CommandText = cmd;
   this.comando.CommandType = tipo;
   this.Conectar();
   return this.comando.ExecuteReader();
}

Eso facilita la carga del objeto de negocio y optimiza la lectura.

DbDataReader reader = null;
Using (Dal dal = new Dal())
{
  string command = "select id, nombre, descripcion from productos";
  reader = dal.EjecutarConsulta(command, CommandType.Text);
  while (reader.Read())
  {
    ...

Pero uno de los problemas habituales que nos encontraremos con el objeto DataReader es que si no nos gusta leer los datos por posición, como es mi caso y preferimos controlar la columna que deseamos leer. Nos podemos encontrar con el horrible error que no se encuentra la columna que estamos intentando leer.

Ya podemos intentar validar si el objeto es null, pero no funciona:

O si el dato está vacio:

Para poder validar si la columna que estamos consultando existe podemos tener una función en nuestro DAL que valide esta situación utilizando el propio esquena de la tabla:

public bool ValidarColumna( DbDataReader reader, string nombreColumna)
{
   reader.GetSchemaTable().DefaultView.RowFilter =
     "ColumnName= '"  + nombreColumna + "'";

   return (reader.GetSchemaTable().DefaultView.Count > 0);
}

Finalmente cuando queramos hacer la consulta de los datos utilizaremos el validador para evitar errores no controlados en el acceso a datos.

using (Dal dal = new Dal())
{
   string command = @"select id, nombre, descripcion
       from productos";

    reader = dal.EjecutarConsulta(command, CommandType.Text);

    while (reader.Read())
    {
      ProductoData produc = new ProductoData();
      produc.ID = (dal.ValidarColumna(reader, "ID")
        && reader["ID"] != DBNull.Value)?(int)reader["ID"]:0;

      produc.Nombre = (dal.ValidarColumna(reader, "Nombre")
        && reader["Nombre"] != DBNull.Value)
        ?reader["Nombre"].ToString():string.Empty;

      listaProductos.Add(produc);
    }
}

Es una forma un poco rebuscada, pero no conozco ninguna otra forma de verificar esta información.

Espero que os sea útil.

 

 

Ejemplo inyección XSS + Material

Toda una experiencia el paso por el CodeCamp y una de las sesiones fue mi introducción a las buenas prácticas para defenderse de los
ataques XSS.

Un tema como este es difícil concentrarlo en 60 minutos y se me quedaron muchos ejemplos en el tintero.

Para empezar podéis bajaros la presentación y la web de pruebas que realicé para poder probar las diferentes técnicas XSS en el siguiente link.

streaming Material streaming Video streaming PPT

Ahora terminaré uno de los ejemplos que me parece muy interesante y no pude realizar por falta del valioso tiempo.

Ejemplo de XSS indirecto para robar la información del usuario:

1.URL vulnerable al ataque:

A la url se le pasa el nombre de la revista y el la foto.

2. La página:

Muestra la información directamente sin validar los datos y es vulnerable a la inyección de código script y HTML.

3. Fichero JS:

Como el ataque que planteamos es bastante elaborado necesitaríamos introducir muchos texto en la url, y por ese motivo
utilizaremos un recurso externo como un fichero JS para realizar el ataque. Sigue leyendo

Consultar un recurso Https con error en el certificado

Han habido varias consultas en el foro MSDN sobre como poder consultar un recurso web aunque el servidor que utiliza el protocolo https tenga el certificado caducado.

En esta entrada pondré un ejemplo muy simple que se puede utilizar para este menester.

Lo primero que he realizado es un proyecto web que utiliza una clase para enviar una petición xml, por ejemplo si quisiera consumir un servicio web XML en php que no dispone de una descripción pública del interfaz “WSD

La clase se llama Conector y utiliza un método estático que utiliza la clase HttpWebResponse para hacer la petición Http y devuelve el resultado obtenido de la petición como un string. Sigue leyendo

ScriptReferenceProfiler Bug con el nuevo release de AjaxControlToolkit

Ya no hay duda de la gran utilidad que nos proporciona la nueva opción CompositeScript de nuestro ScriptManager para combinar scripts y la utilidad ScriptReferenceProfile para conocer los scripts que tenemos que referenciar. Si queréis más información sobre este tema podéis consultar la entrada de José Manuel Alarcón o la de Chalalo Land sobre el tema.

Pero esta utilidad que hace más óptimas nuestras aplicaciones webs, me ha provocado estar un par de días desesperado buscando un error que me estaba volviendo loco y no había manera de poder solucionar.

Os pondré en antecedentes sobre el entorno y el posterior error:

Me encontraba yo realizando una aplicación web con Visual Studio 2008 y el framework 3.5, esta solución también utilizaba los controles ASP.NET AJAX y JQuery.

Y no se me ocurre otra cosa que en medio del desarrollo actualizar las librerías de AJAXControlToolKit para utilizar los nuevos controles incluidos en la nueva versión AJAX Control Toolkit (May 2009 Release).

Iluso de mi, creía que como el proyecto hace referencia a los asemblies independientemente de la versión, solo tendría que actualizar y todo funcionaría a la primera XD. Sigue leyendo