Información general sobre la plantilla de página y la técnica scaffolding de datos dinámicos de ASP.NET
Actualización: noviembre 2007
Una tarea repetitiva en el desarrollo de software es mostrar y modificar datos. Los datos dinámicos de ASP.NET le permiten crear aplicaciones controladas por datos con poco o nada de código. El mecanismo de scaffolding es una característica importante de los datos dinámicos que le permite generar rápidamente estas aplicaciones.
Este tema contiene:
Scaffolding
Plantillas de la página
Scaffolding
Scaffolding es un mecanismo que aprovecha la eficacia y funcionalidad del marco de trabajo de página ASP.NET existente y lo mejora mostrando dinámicamente páginas basadas en el modelo de datos sin necesidad de una página física en segundo plano.
Las ventajas de utilizar el mecanismo de scaffolding son las siguientes:
Poco o nada de código para crear una aplicación web controlada por datos.
Un tiempo de desarrollo rápido.
Las páginas son completamente funcionales. Incluyen todas las operaciones de base de datos (ver, insertar, modificar y eliminar) y también funcionalidades de ordenación y paginación.
Una validación de datos integrada basada en el esquema de base de datos.
Se crean filtros automáticos para cada clave externa o campo booleano.
Los datos dinámicos utilizan el enrutamiento de direcciones URL para comparar y controlar las solicitudes. El mecanismo de scaffolding deduce la vista y la tabla que desea ver un usuario de la dirección URL solicitada. La ventaja de utilizar el mecanismo de enrutamiento es que la dirección URL solicitada no tiene porqué coincidir con la ruta de acceso física de la aplicación.
Habilitar el mecanismo de scaffolding
De forma predeterminada, el mecanismo de scaffolding está desactivado. El mecanismo de scaffolding se debería habilitar con cuidado porque supone un riesgo para la seguridad debido a que puede exponer todo el modelo de datos a las capacidades de presentación, modificación, inserción y eliminación.
Puede utilizar los siguientes enfoques para habilitar el mecanismo de scaffolding:
Habilitar en el registro del contexto de datos.
Utilizando el atributo ScaffoldTableAttribute.
Utilizando el atributo ScaffoldColumnAttribute.
Debe registrar el contexto de datos que utilizará las características de los datos dinámicos, aun cuando no vaya a utilizar el mecanismo de scaffolding. Este registro se realiza en el archivo global.asax mediante el método RegisterContext. El método RegisterContext acepta un objeto ContextConfiguration como un parámetro. Para habilitar el mecanismo de scaffolding a la vez que se registra el contexto de datos, establezca la propiedad ScaffoldAllTables del objeto ContextConfiguration en true. Esto habilitará el mecanismo de scaffolding para todo el modelo de datos. En otras palabras, expondrá todas las tablas del modelo de datos a las capacidades de presentación, modificación, inserción y eliminación. Si debe ocultar algunas tablas del mecanismo de scaffolding, puede realizarlo mediante el atributo ScaffoldTableAttribute.
El ejemplo siguiente muestra cómo habilitar el mecanismo de scaffolding para todas las tablas del modelo de datos a la vez que se registra el contexto de datos de la base de datos AdventureWorksLT.
model.RegisterContext(GetType(AdventureWorksLTDataContext), _
New ContextConfiguration() With {.ScaffoldAllTables = True})
model.RegisterContext(typeof(AdventureWorksLTDataContext),
new ContextConfiguration() { ScaffoldAllTables = true });
Si desea tener más control sobre qué tablas se exponen, puede utilizar el atributo ScaffoldTableAttribute para habilitar o deshabilitar el mecanismo de scaffolding para una tabla determinada. En lugar de exponer todo el modelo de datos y ocultar las tablas que desee, puede exponer únicamente las que necesite la aplicación. Para aplicar el atributo ScaffoldTableAttribute, debe crear una clase parcial que tenga el mismo nombre que la clase de entidad del modelo de datos y, a continuación, aplicar el atributo a la clase parcial.
En el ejemplo siguiente se muestra cómo habilitar el mecanismo de scaffolding para una tabla individual.
Imports System.ComponentModel.DataAnnotations
<ScaffoldTable(True)> _
Partial Public Class Product
End Class
using System.ComponentModel.DataAnnotations;
[ScaffoldTable(true)]
public partial class Product {
}
Si desea tener más control sobre qué campos de datos se exponen, puede utilizar el atributo ScaffoldColumnAttribute para habilitar o deshabilitar el mecanismo de scaffolding para un campo de datos determinado.
De forma predeterminada, los datos dinámicos no muestran todos los campos de datos. A continuación se enumeran algunas reglas importantes que utilizan los datos dinámicos para mostrar o no un campo de datos:
Si se aplica un atributo ScaffoldColumnAttribute al campo de datos, se muestra dicho campo de datos. Esta regla invalida todas las reglas siguientes.
Si se aplica un atributo UIHintAttribute al campo de datos, se muestra dicho campo de datos. Esta regla invalida todas las reglas siguientes.
Si un campo de datos es un campo de clave externa, no se muestra dicho campo de datos. Esto se produce porque los datos dinámicos controlan los campos de clave externa de manera diferente y normalmente no muestran el valor del campo de clave externa.
Si el campo de datos se genera automáticamente en la base de datos, no se muestra dicho campo de datos. Normalmente este tipo de campo no contiene información pertinente. Asegúrese de que aplica el atributo UIHintAttribute al campo de datos, si éste se debe mostrar.
Si el valor de la propiedad IsCustomProperty es true, no se muestra el campo de datos.
Para aplicar el atributo ScaffoldColumnAttribute, debe crear una clase de metadatos asociada en la que aplicará el atributo ScaffoldColumnAttribute al campo de datos y debe crear una clase parcial que tenga el mismo nombre que la clase de entidad del modelo de datos. A continuación, debe asociar estas dos clases aplicando el atributo MetadataTypeAttribute a la clase parcial.
En el ejemplo siguiente se muestra cómo ocultar campos de datos concretos, PasswordHash y PasswordSalt, del mecanismo de scaffolding.
Imports System.ComponentModel.DataAnnotations
<MetadataType(GetType(Customer_Metadata))> _
Partial Public Class Customer
End Class
Public Class Customer_Metadata
<ScaffoldColumn(False)> _
Public PasswordHash As Object
<ScaffoldColumn(False)> _
Public PasswordSalt As Object
End Class
using System.ComponentModel.DataAnnotations;
[MetadataType(typeof(Customer_Metadata))]
public partial class Customer
{
}
public class Customer_Metadata
{
[ScaffoldColumn(false)]
public object PasswordHash;
[ScaffoldColumn(false)]
public object PasswordSalt;
}
Plantillas de la página
El mecanismo de scaffolding de datos dinámicos ASP.NET utiliza plantillas para proporcionar vistas de datos predeterminadas. Las plantillas son páginas ASP.NET normales, lo cual significa que se puede modificar las plantillas, el aspecto y el comportamiento de las páginas generadas por la aplicación web.
Al crear una aplicación de datos dinámicos ASP.NET, la plantilla de proyecto agrega una carpeta DynamicData al proyecto. La tabla siguiente enumera las plantillas de página proporcionadas por los datos dinámicos en la carpeta DynamicData\PageTemplates:
Nombre de la plantilla de página |
Descripción |
---|---|
Details.aspx |
Proporciona una vista detallada de una única fila de la base de datos. Usa un control DetailsView para mostrar los datos. Es la plantilla predeterminada que se utiliza para la operación de selección. |
Edit.aspx |
Proporciona una interfaz para editar una única fila de una tabla de base de datos. Utiliza un control DetailsView para modificar los datos. Es la plantilla predeterminada que se utiliza para la operación de edición. |
Insert.aspx |
Proporciona una interfaz para insertar una única fila en una tabla de base de datos. Utiliza un control DetailsView para insertar datos. Es la plantilla predeterminada que se utiliza para la operación de inserción. |
List.aspx |
Muestra una lista de filas de una tabla de base de datos. Proporciona controles DropDownList para filtrar datos de cada clave externa o columnas booleanas y capacidades de ordenación y paginación. Utiliza un control GridView para la lista de filas. Es la plantilla predeterminada que se utiliza para la operación de presentación. |
ListDetails.aspx |
Muestra una lista de filas de una tabla de base de datos. Proporciona controles DropDownList para filtrar datos de cada clave externa o columnas booleanas y capacidades de ordenación y paginación. La plantilla utiliza un control GridView para la lista de filas y un control DetailsView para la fila seleccionada y para insertar un nuevo registro. Es una plantilla que presenta una funcionalidad "todo en uno". De forma predeterminada no se utiliza, pero puede cambiar la configuración en el archivo Global.asax para utilizar esta plantilla en su lugar. |
Todas las plantillas predeterminadas proporcionadas por los datos dinámicos tienen en común las siguientes características:
Utilizan una página maestra denominada Site.master que se encuentra en la carpeta raíz. La página maestra define hojas de estilos y un encabezado básico, y también incluye un control ScriptManager para habilitar la funcionalidad AJAX en el sitio web. Para fines de depuración, puede que desee desactivar las actualizaciones parciales de la página, estableciendo la propiedad EnablePartialRendering del control ScriptManager en false. Para obtener más información, vea Agregar funcionalidad AJAX y de cliente.
Cada una de las plantillas de página contiene un control UpdatePanel para habilitar la representación parcial sin devolución de datos. Para obtener más información, vea Sintaxis declarativa del control de servidor web UpdatePanel.
Cada una de las plantillas de página también contiene un control DynamicDataManager para agregar comportamiento dinámico a los controles enlazados a datos y de origen de datos presentes en la plantilla.
Personalizar las plantillas de página
Los datos dinámicos le permiten personalizar las plantillas proporcionadas. Hay dos maneras de realizarlo:
Personalizar las plantillas de página integradas.
Personalizar el diseño de una determinada tabla.
Puede personalizar las plantillas de página integradas cambiando las páginas situadas en la carpeta DynamicData\PageTemplates. Los cambios que realiza en esta ubicación afectan al aspecto y comportamiento de las páginas generadas que están utilizando el mecanismo de scaffolding en la aplicación web.
Es posible utilizar el mecanismo de scaffolding y crear páginas personalizadas para tablas específicas. Para hacerlo, debe crear una carpeta bajo la carpeta DynamicData\CustomPages que tenga el mismo nombre que tabla de entidad en el modelo de datos. Bajo esta nueva carpeta, agregue una página con el mismo nombre que la plantilla de página que se utiliza globalmente. Por ejemplo, si desea crear una página de detalles específica para una tabla, denomine la página como Details.aspx. Puede utilizar la plantilla de página integrada como punto de partida para su página personalizada. Para obtener un ejemplo, vea Cómo: Personalizar el diseño de una tabla individual mediante una plantilla de página personalizada.
Personalizar las rutas
Como se mencionó anteriormente, los datos dinámicos utilizan el enrutamiento ASP.NET para comparar y controlar las solicitudes URL. Las rutas se definen en el archivo global.asax. De forma predeterminada, los datos dinámicos utilizan una plantilla de página diferente para cada operación (mostrar, seleccionar, modificar e insertar). La funcionalidad de eliminación se muestra en las páginas Lista y Detalles, porque no es necesaria una plantilla de página específica para la operación de eliminación.
Puede personalizar las rutas para mostrar direcciones URL diferentes, pero también puede utilizarlas para especificar plantillas de página diferentes, para ello, quite la extensión de archivo de la dirección URL o incluso pase parámetros utilizando las rutas en lugar de los valores de la cadena de consulta. Para obtener más información acerca de las rutas, vea Enrutamiento de ASP.NET.
En el ejemplo siguiente se muestra cómo especificar las rutas para utilizar únicamente una plantilla de página para todas las operaciones. La primera ruta habilita todas las operaciones en una página para una tabla determinada. La segunda ruta permite a una página navegar a los detalles de un registro, por ejemplo navegar a una tabla de relaciones si se tiene un campo de clave externa.
routes.Add(New DynamicDataRoute("{table}/ListDetails.aspx") With { _
.Action = PageAction.List, _
.ViewName = "ListDetails", _
.Model = model})
routes.Add(New DynamicDataRoute("{table}/ListDetails.aspx") With { _
.Action = PageAction.Details, _
.ViewName = "ListDetails", _
.Model = model})
routes.Add(new DynamicDataRoute("{table}/ListDetails.aspx")
{
Action = PageAction.List,
ViewName = "ListDetails",
Model = model
});
routes.Add(new DynamicDataRoute("{table}/ListDetails.aspx")
{
Action = PageAction.Details,
ViewName = "ListDetails",
Model = model
});
También puede crear rutas concretas para tablas concretas, especificando una plantilla de página diferente que la utilizada por el resto de las tablas. Las rutas se analizan en el orden en que se definen. Primero debe definir las rutas más concretas y, a continuación, definir las genéricas.
En el ejemplo siguiente se muestra cómo especificar una plantilla de página diferente para la tabla Products de la base de datos AdventureWorks y, a continuación, definir una genérica para las otras tablas de la base de datos.
routes.Add(New DynamicDataRoute("Products/{action}.aspx") With { _
.ViewName = "ListDetails", _
.Table = "Products", _
.Model = model})
routes.Add(New DynamicDataRoute("{table}/{action}.aspx") With { _
.Constraints = New RouteValueDictionary( _
New With {.Action = "List|Details|Edit|Insert"}), _
.Model = model})
routes.Add(new DynamicDataRoute("Products/{action}.aspx")
{
ViewName = "ListDetails",
Table = "Products",
Model = model
});
routes.Add(new DynamicDataRoute("{table}/{action}.aspx")
{
Constraints = new RouteValueDictionary(
new { action = "List|Details|Edit|Insert" }),
Model = model
});