• No results found

si te fijas bien en las UrL de las páginas autogeneradas por Dynamic Data, verás que se corresponden con rutas análogas a las siguientes:

http://localhost:xxxx/DynamicDataEjemplo/Products/List.aspx http://localhost:xxxx/DynamicDataEjemplo/Products/Edit. aspx?ProductID=1

http://localhost:xxxx/DynamicDataEjemplo/Customers/Insert.aspx

Puedes comprobar que ninguna de estas rutas existe en nuestra aplicación. es decir, apuntan a carpetas y archivos imaginarios.

en realidad son rutas ficticias que la infraestructura de asP.NeT se encarga de redirigir a recursos reales en el servidor para procesarlas. en este caso las rutas ficticias apuntan a las plantillas asPX que hemos visto en los apartados anteriores. con esta técnica de enrutado conseguimos un doble objetivo:

Los usuarios obtienen rutas fáciles de recordar para efectuar operaciones 1.

con las entidades.

a través de la propia ruta se le pasa información de contexto a las plantillas 2.

para que sepan con qué entidad deben trabajar y qué acción van a efectuar, ya que en la propia UrL tiene el nombre de la entidad, la acción y, si procede, la clave primaria del registro.

Las rutas se definen en Global.asax, en el mismo evento RegisterRoutes que utilizamos en el apartado 4 de este capítulo. si vuelves sobre el mismo verás que, por defecto, viene ya una ruta definida con el siguiente código:

routes.Add(New DynamicDataRoute(“{table}/{action}.aspx”) With { .Constraints = New RouteValueDictionary(New With {.Action = “List|Details|Edit|Insert”}), .Model = DefaultModel})

Lo que se hace aquí es añadir una nueva ruta ficticia para que asP.NeT la inter- prete y se la asigne a Dynamic Data para trabajar. el constructor de la ruta dinámica toma como parámetro una cadena en la que se marca con comodines la información que ésta contendrá. en este caso se indica que las rutas, siempre consideradas desde la raíz de la aplicación, tendrán la siguiente forma:

como podemos comprobar esto se corresponde con las rutas que he puesto de ejemplo en el párrafo anterior, que servían respectivamente para listar un producto, editarlo y para insertar un nuevo cliente (fíjate en cómo llevan el nombre de la entidad y la acción en la UrL).

También junto con el constructor se ajustan algunas restricciones de ámbito para de la ruta a través de la clase RouteValueDictionary:

Action

: define las acciones sobre entidades a las que responderá esta ruta. en este caso se han incluido todas las posibles, o sea, listar, ver detalles, editar e insertar.

Model

: el modelo de metadatos que se gestionará con esta ruta. Podemos tener más de uno. en nuestro ejemplo usamos el que habíamos definido al principio.

Tables

: no está presente en la línea de ejemplo, pero nos permite establecer qué tablas en concreto del modelo se van a gestionar con esta ruta. si no lo indicamos se usa para todas las tablas contenidas en el modelo. Luego veremos un ejemplo.

La ruta la podemos construir a nuestra voluntad. Por ejemplo, vamos a cambiar la ruta por defecto para que sea un poco más estilo resT (http://es.wikipedia.org/ wiki/REST). cambia la definición de la ruta por esta cadena:

{action}/{table}

Y deja lo demás igual. ejecuta la aplicación.

Figura 9.- Nuevas rutas estilo rEST para las páginas dinámicas

a partir de ahora verás como las rutas han cambiado por completo y que ni siquiera llevan una extensión .aspx ni apuntan a páginas ficticias concretas. son más

fáciles de recordar todavía para los usuarios pues éstos sólo tienen que saber qué acción quieren efectuar y sobre qué tabla.

el manejo de rutas es una técnica muy potente y podemos hacer muchas otras cosas.

recordarás que entre las plantillas existía una llamada “ListDetails.aspx” que en realidad no se estaba usando en ningún lado. cuando la mencioné dije que era una página “todo en uno” ya que en ella teníamos todo lo necesario para gestionar una entidad: listado, creación, edición y borrado. Pues vamos a usarla en lugar de las páginas individuales que hemos venido usando hasta ahora.

convierte en un comentario la definición de la ruta que acabamos de hacer y des- comenta la siguiente ruta que encontrarás ya preparada en el evento RegisterRoutes en el ejemplo descargable:

routes.Add(New DynamicDataRoute(“{table}/Mantenimiento”) With { _ .Action = PageAction.List, _

.ViewName = “ListDetails”, _ .Model = DefaultModel })

ejecuta la aplicación. verás que la página generada para cada entidad tiene todo lo necesario para gestionarla por completo, ya que desde la misma página -y estilo aJaX- podemos editar, crear, borrar y ver el detalle de cualquier registro de cual- quier tabla de nuestro modelo. Y lo mejor de todo es que para que un usuario acceda al mantenimiento de cualquier tabla lo único que tiene que hacer es poner el nombre de la misma seguido de la palabra “Mantenimiento”, por ejemplo:

http://localhost/DynamicDataEjemplo/Suppliers/Mantenimiento

¡No está nada mal! ¿verdad?

en este caso hemos indicado sólo el comando pageAction.List ya que con la plantilla que hemos seleccionado todos los comandos se gestionan desde esa página. Por eso tampoco tenemos la acción especificada en la ruta.

Las rutas se pueden utilizar para definir nuestras propias plantillas de trabajo para las entidades. Por ejemplo, imagina que creamos una plantilla propia que hace la edición de las entidades de algún modo especial y queremos usarla en lugar de las estándar. si a la plantilla le hemos llamado “MisDetalles.aspx” y la tenemos en la carpeta “DynamicData”, junto con la demás, podemos definir la ruta de esta manera:

routes.Add(New DynamicDataRoute(“{table}/Mantenimiento”) With { _ .Action = PageAction.List, _

.ViewName = “MisDetalles”, _ .Model = model})

es decir, sólo cambiamos el modelo de la vista y ya funcionaría. en el proyecto demo descargable se ha incluido este ejemplo también.

es posible crear plantillas específicas para tablas concretas. Para eso está la carpeta “DynamicData/customPages”. Para crear plantillas especiales para una en- tidad debemos crear una subcarpeta dentro de “customPages” con el nombre de la tabla en la base de datos e incluir dentro las plantillas específicas que necesitemos. serían plantillas normales, como las que hay en la raíz, pero se usarían sólo para esa entidad. si falta alguna acción se seguiría usando la plantilla por defecto.

en el proyecto de ejemplo descargable de la Web he personalizado las plantillas que se usarán con la tabla de productos, que están en la carpeta “DynamicData/ customPages/Products”. De esta forma al entrar en cualquier acción de los productos se usarán estas plantillas en lugar de las predeterminadas.