Exportar (0) Imprimir
Expandir todo
Expandir Minimizar

Administración de miembros y funciones de Microsoft ASP.NET 2.0 con IIS, 2 Parte: Implementación

Noviembre de 2005

Publicado: 30 de Enero de 2006

Peter Kellner
http://peterkellner.net/(en inglés)

Este artículo se aplica a:
Microsoft ASP.NET 2.0
Microsoft Visual Studio 2005
Servicios de Internet Information Server (IIS) de Microsoft

Resumen: en este artículo se describe el modo de mantener las bases de datos de pertenencia y funciones en un servidor IIS de producción mediante la creación de una aplicación de tres niveles de ASP.NET 2.0. (17 páginas impresas.)

Haga clic aquí para descargar el ejemplo de código de este artículo.

En esta página

Introducción Introducción
Tecnologías utilizadas Tecnologías utilizadas
La aplicación y el proyecto La aplicación y el proyecto
ObjectDataSource en detalle ObjectDataSource en detalle
El valor de devolución del método Select (colección de tipos) El valor de devolución del método Select (colección de tipos)
El método Select El método Select
Criterios de ordenación personalizados Criterios de ordenación personalizados
ObjectDataSource en GridView (control de datos) ObjectDataSource en GridView (control de datos)
Conclusión Conclusión

Introducción

Figura 1. El editor de pertenencia

El lanzamiento de Microsoft Visual Studio 2005 no ha traído consigo una solución "rápida" que permita mantener las bases de datos de pertenencia y funciones de Microsoft IIS. Este hecho supone un problema a la hora de mover la aplicación de un entorno de desarrollo a un servidor IIS de producción. La utilidad de configuración Web de ASP.NET que ofrece Microsoft sólo se puede ejecutar en un entorno de desarrollo, no de producción. Este artículo y su código asociado resuelven el problema mediante la implementación de una solución de tres niveles que permite administrar miembros y funciones con herramientas estándar de Microsoft ASP.NET. Como consecuencia, se podrá ejecutar en cualquier entorno de ASP.NET 2.0, incluido IIS. Se trata de una solución flexible que se puede agregar fácilmente a cualquier proyecto de sitio Web de ASP.NET 2.0 existente.

Sus niveles se definen del modo siguiente. El primer nivel, la página de ASP.NET (también conocida como capa de presentación), interactúa con dos objetos empresariales a través del origen de datos de objetos. Los objetos empresariales, por su parte, constituyen el nivel medio y contienen los miembros y las funciones. El tercer nivel, o servidor, consta de las API de administración de pertenencia y funciones que proporciona ASP.NET. Los objetos del nivel medio se pueden colocar fácilmente en cualquier proyecto de ASP.NET 2.0 y utilizarse directamente, sin apenas cambios.

En este artículo se describe en detalle la implementación del nivel medio, es decir, de los objetos de datos, así como del origen ObjectDataSource asociado a ellos. Posteriormente se explica el modo de utilizar estos objetos en un proyecto Web de ASP.NET que emplea Microsoft SQL Server Express 2005, integrado en Visual Studio 2005. No obstante, es necesario tener en cuenta que la API de pertenencia que ofrece Microsoft utiliza su propia tecnología de proveedor. Es por ello que la solución que se presenta en este artículo es independiente de la base de datos. La información de pertenencia y de funciones se podría obtener con la misma facilidad de LDAP, SQL Server u Oracle.

Tecnologías utilizadas

El origen ObjectDataSource

En primer lugar, hay dos instancias definidas del origen ObjectDataSource. Una es para los datos de pertenencia (nombres de usuario, fecha de creación, aprobación, etc.) y la otra para las funciones (administrador y amigos, entre otras). Ambos orígenes de datos se rellenan completamente con todos los métodos de acceso a datos, es decir, ambos disponen de funciones de miembro que realizan inserciones, actualizaciones, eliminaciones y selecciones. Las dos instancias de ObjectDataSource devuelven un tipo de lista genérico, por lo que los nombres de columna del control GridView se definen automáticamente como los nombres de valor de propiedad de ObjectDataSource. Asimismo, la solución dispone de ordenación personalizada, de modo que los usuarios pueden hacer clic en los encabezados de columna de GridView con el fin de ordenar los datos hacia adelante o hacia atrás, en función de sus necesidades.

SQL Server Express 2005 y web.config

SQL Server Express 2005 es el origen del proveedor de datos de las bases de datos de pertenencia y funciones. Para ello, se definen las entradas adecuadas en el archivo web.config. Más adelante en este artículo se describe brevemente el modo de configurar un proyecto nuevo desde el principio. La cadena de conexión de SQL Server Express 2005 no aparece en el archivo web.config, puesto que ya está definida en el archivo machine.config incluido de forma predeterminada en Microsoft .NET 2.0 Framework.

Compatibilidad con IIS (5.1 y 6.0)

La versión del servidor Web puede ser 5.1 ó 6.0. Para probar varios usuarios conectados a la aplicación Web, se debe utilizar IIS. El servidor Web de desarrollo integrado no permite mantener correctamente el estado de los distintos usuarios conectados. Aunque se podría haber intentado que la herramienta de configuración Web de ASP.NET funcionara con IIS, el trabajo de seguridad adicional necesario para ello no se ha llevado a cabo.

El control GridView

El control GridView se utiliza para presentar los datos de pertenencia y funciones. Como se mencionó anteriormente, debido a que se utiliza un tipo genérico para el origen ObjectDataSource, las columnas del control GridView reciben automáticamente el nombre de los valores de propiedad de ObjectDataSource. Sin el uso de tipos genéricos, los nombres de columna pasan a ser valores predeterminados sin significado, por lo que se deberían editar manualmente uno a uno.

La aplicación y el proyecto

El proyecto necesario para ejecutar esta utilidad es muy simple e independiente. Sus archivos, disponibles para descarga, contienen un ejemplo operativo completo. Debido a que los usuarios y las funciones no disponen de acceso directo a la base de datos, todo lo que se debe hacer es tomar los tres objetos de datos (MembershipDataObject.cs, MembershipUserSortable.cs y RoleDataObject.cs; consulte la figura 2).

Figura 2. Proyecto del editor de pertenencia

En la carpeta SamplePages hay varios ejemplos más que muestran el uso de los módulos mencionados anteriormente. Membership.aspx es el ejemplo que se muestra en la figura 1. Se puede utilizar para seleccionar, actualizar, insertar y eliminar miembros y funciones, así como para asignar funciones a miembros.

En el caso de las aplicaciones de ASP.NET 2.0 que ya disponen de un módulo de pertenencia en funcionamiento, la configuración ya realizada en estas páginas debería ser suficiente. Si estos archivos se copian directamente en un proyecto, funcionarán correctamente.

A continuación se muestra el modo de crear la solución a través de estos objetos en el caso de que sea la primera implementación de administración de pertenencia y funciones en la aplicación:

  • En Visual Studio 2005, cree un proyecto Web nuevo del tipo sitio Web de ASP.NET.

  • En el menú, haga clic en Sitio Web / Configuración de ASP.NET.

  • Siga los pasos del asistente (1 a 7) para crear varios usuarios y funciones de ejemplo. Se creará un archivo web.config válido en el proyecto actual con la información suficiente como para que la administración de miembros esté preparada y en funcionamiento. De forma predeterminada, utilizará la configuración de SQL Server Express 2005.

  • Incluya los tres archivos .cs en el proyecto y, a continuación, las páginas .aspx de ejemplo.

ObjectDataSource en detalle

La tecnología de ObjectDataSource permite crear un origen de datos cuyo comportamiento es muy similar al de SqlDataSource, es decir, expone interfaces que permiten seleccionar, actualizar, insertar y eliminar registros (u objetos similares) de un almacén de datos persistente (como una base de datos). En las secciones siguientes de este artículo se tratará el objeto (o archivo de clase) que ObjectDataSource utiliza para manipular la pertenencia. Su nombre en el proyecto es MembershipUserODS.cs.

La clase (MembershipUserODS)

Debido a que los datos se recuperan de la API de pertenencia de Microsoft, para resolver el problema se utiliza ObjectDataSource. El primer paso para ello consiste en crear una clase independiente que contenga MembershipUser de modo que se pueda asociar a ObjectDataSource. En el ejemplo que se incluye a continuación se muestra un conjunto típico de métodos que se deben implementar. En las secciones siguientes se describirá la implementación de la función de cada uno de los miembros. Aunque muchos de los detalles no se incluyen en el artículo, sí que forman parte del código fuente proporcionado con el mismo.

[DataObject(true)
public class MembershipUserWrapper {

  [DataObjectMethod(DataObjectMethodType.Select, true)]
  static public Collection<MembershipUserWrapper> GetMembers(string
       sortData) {
    return GetMembers(true, true, null, sortData); 
  }

  [DataObjectMethod(DataObjectMethodType.Insert, true)]
  static public void Insert(string UserName, bool isApproved,
string comment, DateTime lastLockoutDate, ...) {
  }
        
  [DataObjectMethod(DataObjectMethodType.Delete, true)]
  static public void Delete(object UserName, string Original_UserName){
    Membership.DeleteUser(Original_UserName, true);
  }
  
  [DataObjectMethod(DataObjectMethodType.Update, true)]
  static public void Update(string original_UserName,string email,...){ 
  }
}

La declaración de clase

La declaración de clase anterior tiene un carácter especial debido a la presencia del atributo [(DataObject(true)]. Este atributo indica al asistente para la creación de ObjectDataSource de Visual Studio 2005 que busque sólo los miembros que contengan dicho atributo a la hora de buscar objetos de datos en la clase de datos. Consulte el ejemplo en la sección en la que se muestra el punto en que esta clase se asigna a un componente del control GridView.

El método Insert

La información que se ofrece en cada una de las secciones implica el uso directo de la API de pertenencia de Microsoft. Éste es, por ejemplo, el aspecto detallado de un método Insert típico.

[DataObjectMethod(DataObjectMethodType.Insert,true)]
static public void Insert(string userName, string password,)
{
   MembershipCreateStatus status;
      Membership.CreateUser(userName, password,);
}

Esta clase Insert es polimórfica, es decir, puede haber varios métodos Insert para fines distintos. Por ejemplo, puede ocurrir que sea necesario decidir de forma dinámica si un usuario creado se debe o no aprobar en función de las circunstancias. Por ejemplo, es posible que un usuario nuevo creado en una pantalla de administración desee crear de forma predeterminada usuarios en estado aprobado, mientras que desde una pantalla de registro su estado sea no aprobado. Para ello, se necesita otro método Insert, con un parámetro adicional. Éste es el aspecto de un método Insert diseñado para cumplir esta función.

[DataObjectMethod(DataObjectMethodType.Insert,false)]
static public void Insert(string userName, string password, bool isApproved)
{
MembershipCreateStatus status;
   Membership.CreateUser(UserName, password,,
      isApproved, out status);
}

Al igual que los otros métodos enumerados, los ejemplos que se muestran no son en realidad los que se encontrarán en el código fuente asociado. Se trata tan sólo de ejemplos de uso típicos. En el código fuente se incluyen usos más completos y comentados.

El método Update

El método Update es una implementación muy directa de la API de pertenencia. Al igual que el método Insert, puede haber varias implementaciones de Update. Aquí sólo se muestra una de ellas. En el código disponible para descarga se pueden encontrar más implementaciones polimórficas de Update, entre las que se incluye una que sólo establece la propiedad isApproved (que se muestra en el ejemplo siguiente).

[DataObjectMethod(DataObjectMethodType.Update,false)]
static public void Update(string UserName,bool isApproved)
{
   bool dirtyFlag = false;
   MembershipUser mu = Membership.GetUser(UserName);
   if (mu.isApproved != isApproved)
   {
      dirtyFlag = true;
      mu.IsApproved = isApproved;
   }
   if (dirtyFlag == true)
   {
      Membership.UpdateUser(mu);
   }
}

El método Delete

El método Delete es el más simple de todos y toma un solo parámetro, UserName.

static public void Delete(string UserName)
{
   Membership.DeleteUser(UserName,true);
}

El método Select con un atributo Sort

El método Select (en este caso GetMembers) presenta varios componentes, cada uno de los cuales merece ser tratado en detalle. En primer lugar, se describe lo que devuelve, a continuación el método en sí y, por último, el modo en que ordena lo que devuelve.

El valor de devolución del método Select (colección de tipos)

El valor de devolución del método Select (también llamado Get) es una clase de colección genérica. Los tipos genéricos se utilizan porque el origen ObjectDataSource asociado en última instancia a la clase utiliza la reflexión para determinar los nombres y tipos de columna. Estos nombres y tipos están asociados a cada una de las filas de datos devueltas del mismo modo que SqlDataSource utiliza los metadatos de base de datos de una tabla o procedimiento almacenado para determinar los nombres de las columnas de cada una de las filas. Debido a que el tipo de devolución del método Select es MembershipUserWrapper, que hereda de MembershipUser, la mayoría de las propiedades de esta clase son las mismas que las asociadas a MembershipUser. Entre estas propiedades se incluyen:

  • ProviderUserKey

  • UserName

  • LastLockoutDate

  • CreationDate

  • PasswordQuestion

  • LastActivityDate

  • ProviderName

  • IsLockedOut

  • Email

  • LastLoginDate

  • IsOnline

  • LastPasswordChangedDate

  • Comment

Adelantándonos un poco en el tema que nos concierne, una característica muy útil de los valores de propiedad es que pueden ser de sólo lectura (sin método de establecimiento), de sólo escritura (sin método de lectura) y, por supuesto, de lectura y escritura. El asistente para la creación de ObjectDataSource reconoce esta característica y crea parámetros adecuados para que al procesar el control de datos (a través de ObjectDataSource), sólo se puedan editar los campos actualizables (lectura/escritura). Esto significa que, por ejemplo, no se puede modificar la propiedad UserName. Aunque puede que ahora esto no tenga demasiado sentido, lo tendrá más adelante al hablar con más detalle de ObjectDataSource y los componentes de datos.

El método Select

Al igual que los métodos Insert y Update, Select es un método polimórfico. Puede haber tantos métodos Select diferentes como escenarios distintos. Por ejemplo, puede resultar conveniente utilizar el método Select para seleccionar usuarios en función de si su estado es aprobado, no aprobado o ambos. Normalmente, existe un método Get que cuenta con el mayor número posible de parámetros asociados y que es al que llaman el resto de métodos Get. En nuestro caso, hay tres métodos Get: uno para recuperar todos los registros, otro para recuperar datos en función del estado de aprobación y un tercero para recuperar un registro individual en función de una cadena de selección. En el ejemplo siguiente, se llama al método que devuelve todos los usuarios. Si los dos valores booleanos se establecen como true, se devolverán todos los usuarios.

[DataObjectMethod(DataObjectMethodType.Select, true)]
static public List<MembershipData> GetMembers(string sortData)
{
   return GetMembers(true,true,null,null);
}

En el ejemplo siguiente se muestra un método Get más detallado, si bien aparece sólo su parte inicial. Entre los detalles del método que no aparecen se incluyen la finalización de las asignaciones de propiedad, el filtrado del estado de aprobación y el rechazo de los registros que no cumplen con los criterios, y la aplicación de los criterios de ordenación. Tras este ejemplo, encontrará más información sobre los criterios de ordenación. (Es necesario tener en cuenta que llamar a GetAllUsers en una base de datos con más de varios cientos de usuarios [hasta 500] se convertirá rápidamente en una operación costosa.)

[DataObjectMethod(DataObjectMethodType.Select, true)]
static public List<MembershipData> GetMembers(bool AllApprUsers, 
    bool AllNotApprUsers, string UserToFind, string sortData)
{
   List<MembershipData> memberList = new List<MembershipData>();
   MembershipUserCollection muc = Membership.GetAllUsers();
   foreach (MembershipUser mu in muc)
   {
      MembershipData md = new MembershipData();
      md.Comment = mu.Comment;
      md.CreationDate = mu.CreationDate;
            ...

Criterios de ordenación personalizados

Tenga en cuenta que, en el código anterior, se pasa una cadena de parámetros llamada sortData a GetMembers. Si en la declaración de ObjectDataSource se especifica SortParameterName como uno de los atributos, este parámetro se pasará automáticamente a todos los métodos Select. Su valor será el nombre especificado por el atributo SortExpression en la columna del control de datos. En este caso, el control de datos es GridView.

El método Comparer se invoca en función del parámetro sortName del método GetMembers. Dado que estas páginas Web de ASP.NET no tienen estado, es preciso asumir que la dirección del orden actual (hacia adelante o hacia atrás) se almacena en el estado de vista. Cada llamada invierte la dirección de la anterior. Es decir, la dirección cambia entre orden hacia adelante y orden hacia atrás cuando el usuario hace clic en el encabezado de la columna.

Una vez asumido que se utiliza el control GridView, el parámetro que se pasa a GetMembers(sortData) contiene los datos del atributo SortExpression de la columna de GridView. Al realizar una solicitud de ordenación hacia atrás, la palabra "DESC" se anexa al final de la cadena de ordenación. De este modo, por ejemplo, la primera vez que el usuario hace clic en la columna Email, el elemento sortData pasado a GetMembers será "Email". La segunda vez, en cambio, el parámetro sortData pasará a ser "Email DESC", luego "Email", luego "Email DESC", y así sucesivamente. Cabe mencionar también que la primera vez que se carga la página, el parámetro sortData se pasa como cadena de longitud cero (no nula). A continuación se muestra el mecanismo interno del método GetMembers que recupera y ordena los datos para que se devuelvan en el orden correcto.

[DataObjectMethod(DataObjectMethodType.Select, true)]
static public List<MembershipData> GetMembers(string sortData)
{
  List<MembershipData> memberList = new List<MembershipData>();
  MembershipUserCollection muc = Membership.GetAllUsers();
  List<MembershipUser> memberList = new List<MembershipUser>(muc);

  foreach (MembershipUser mu in muc)
  {
    MembershipData md = new MembershipData(mu);
    memberList.Add(md);
  }

  ... Code that implements Comparison

   memberList.Sort(comparison);
  
  return memberList;
}

En la sección siguiente, cuando se incorpore a un control GridView, quedará más claro.

La declaración de ObjectDataSource

El modo más fácil de declarar un origen ObjectDataSource es arrastrar y colocar uno de los controles de datos de la barra de herramientas después de crear una página de ASP.NET vacía con el asistente de Visual Studio 2005. Tras crear el origen ObjectDataSource, se podrá arrastrar una pequeña etiqueta en la esquina superior derecha del origen ObjectDataSource recién creado. A continuación, al hacer clic en Configurar origen de datos se abrirá un asistente que indica: "Configurar origen de datos - ObjectDataSource1" (consulte la figura 3).

Figura 3. Configuración del origen ObjectDataSource

Llegados a este punto, aparecen dos clases disponibles para asociarlas a un origen ObjectDataSource. MembershipUserODS es el tema principal de este artículo. RoleDataObject, por su parte, hace referencia prácticamente al mismo concepto, salvo por el hecho de que encapsula funciones de pertenencia. Asimismo, es necesario tener en cuenta que lo que se muestra en este artículo son tan sólo los objetos declarados con el atributo de clase especial [DataObject(true)] descrito en "La declaración de clase".

Tras elegir MembershipUserODS, aparecerá un cuadro de diálogo con cuatro fichas. En estas fichas se definirán los métodos a los que se llamará desde la clase MembershipUserODS. Por otro lado, se asociarán métodos Select, Update, Insert y Delete a las funciones de miembro de MembershipUserODS. En muchos casos, para cada una de estas funciones habrá varios métodos disponibles en la clase. Se deberá elegir el más adecuado en función del escenario de datos en cuestión. Las cuatro fichas se muestran en la figura 4. De forma predeterminada, en las fichas se rellenarán los miembros marcados con el atributo especial [DataObjectMethod(DataObjectMethodType.Select, false)]. No obstante, este atributo concreto es el predeterminado para Select. Si la expresión DataObjectMethodType.Select se cambia a DataObjectMethodType.Insert, DataObjectMethodType.Update y DataObjectMethodType.Delete pasarán a ser los valores predeterminados de las distintas fichas. El segundo parámetro, un valor booleano, indica que este método (que, si recordamos, se puede definir de manera polimórfica) es el predeterminado y que se debe utilizar en el control de fichas.

El método Select

Como se mencionó anteriormente en la sección en la que se describe la clase MembershipUserODS, la función GetMembers devuelve una clase de colección genérica. Esto permite que el control ObjectDataSourceMembershipUser definido aquí utilice la reflexión y determine los parámetros de llamada asociados a la llamada GetMembers. En este caso, los parámetros utilizados para llamar a GetMembers son returnAllApprovedUsers, returnAllNotApprovedUsers, userNameToFind y sortData. Tomando esto como base, la definición real del nuevo origen ObjectDataSource será la siguiente.

Figura 4. Asignación del método Select

<asp:ObjectDataSource ID="ObjectDataSourceMembershipUser"runat="server" 
    SelectMethod="GetMembers" UpdateMethod="Update" 
    SortParameterName="SortData"
    TypeName="MembershipUtilities.MembershipDataODS" 
    DeleteMethod="Delete" InsertMethod="Insert" >
    <SelectParameters>
      <asp:Parameter Name="returnAllApprovedUsers" Type="Boolean" />
      <asp:Parameter Name="returnAllApprovedUsers" Type="Boolean"/>
      <asp:Parameter Name="usernameToFind"         Type=" String" />
      <asp:Parameter Name="sortData"               Type=" String" />
    </SelectParameters>
    ...
    ...
</asp:ObjectDataSource>

El método Insert

El método Insert, en este caso, se asigna a la función de miembro Insert(). Tenga en cuenta que este método se llama sólo con dos parámetros: UserName y Password (consulte la figura 5). El número de parámetros debe ser igual al número de parámetros declarados en ObjectDataSource. A continuación se muestra la declaración de parámetros de ObjectDataSource. Existe una segunda función Insert Member definida que agrega un tercer parámetro: approvalStatus. Si la funcionalidad de este origen ObjectDataSource es incluir la función de inserción al establecer approvalStatus, se deberá seleccionar el otro método Insert de la lista desplegable. Esto supondría la inserción de los siguientes InsertParameters en la página .aspx. Si se elige el que presenta dos parámetros, el bloque no incluirá asp:Parameter con el nombre isApproved en él. Una vez más, es necesario recordar que este ejemplo puede no corresponderse con el código fuente adjunto y que se incluye aquí tan sólo a modo de ejemplo. El código fuente adjunto es bastante más completo.

Figura 5. Asignación del método Insert

<asp:ObjectDataSource ID="ObjectDataSourceMembershipUser"runat="server" 
    SelectMethod="GetMembers"UpdateMethod="GetMembers" 
    SortParameterName="SortData"
    TypeName="MembershipUtilities.MembershipDataObject" 
    DeleteMethod="Delete" InsertMethod="Insert">
    <InsertParameters>
        <asp:Parameter Name="userName" Type="String" />
        <asp:Parameter Name="password" Type="String" />
        <asp:Parameter Name="isApproved" Type="Boolean" />
    </InsertParameters>
    ...
</asp:ObjectDataSource>

Asimismo, se debe tener en cuenta que el uso de un método Insert con parámetros mínimos requerirá la definición de una contraseña predeterminada. En un sistema de producción, se trataría sin duda de una mala idea. Consulte el código fuente adjunto para ver un mejor ejemplo de cómo controlar las inserciones. En concreto, consulte la página Membership.aspx para conocer esta funcionalidad.

El método Update

El método Update, en este caso, se asigna a la función de miembro Update(). Este método se llama con varios parámetros: UserName, Email, isApproved y Comment (consulte la figura 6). Asimismo, existe otro método Update que dispone de todos los parámetros actualizables. Esto resulta de gran utilidad a la hora de crear un control que presente el mayor número posible de funciones de actualización. Al igual que Insert, se elige el método Update adecuado para este origen ObjectDataSource. Cuando el asistente finaliza, crea automáticamente UpdateParameters, como se muestra a continuación.

Figura 6. Asignación del método Update

<asp:ObjectDataSource ID="ObjectDataSourceMembershipUser"runat="server" 
    SelectMethod="GetMembers" InsertMethod="Insert"
    SortParameterName="SortData"
    TypeName="MembershipUtilities.MembershipUserODS" 
    UpdateMethod="Update" DeleteMethod="Delete">
    <UpdateParameters>
        <asp:Parameter Name="Original_UserName" />
        <asp:Parameter Name="email" Type="String" />
        <asp:Parameter Name="isApproved" Type="Boolean" />
        <asp:Parameter Name="comment" Type="String" />
    </UpdateParameters>
    ...
    ...
</asp:ObjectDataSource>

El método Delete

El método Delete, en este caso, se asigna a la función de miembro Delete(). Por supuesto, sólo se necesita un método Delete (consulte la figura 7). A continuación aparece la declaración del origen ObjectDataSource que admite este método Delete.

Figura 7. Asignación del método Delete

<asp:ObjectDataSource ID="ObjectDataSource1" runat="server" 
    SelectMethod="GetMembers" InsertMethod="Insert"
    SortParameterName="SortData"
    TypeName="MembershipUtilities.MembershipUserODS" 
    UpdateMethod="Update" DeleteMethod="Delete">
    <DeleteParameters>
        <asp:Parameter Name="UserName" />
        <asp:Parameter Name="Original_UserName" />
    </DeleteParameters>
    ...
</asp:ObjectDataSource>

La clase (RoleDataObject)

Al igual que ocurre con la pertenencia, las funciones se configuran con sus propios objetos DataObject. Debido a que no hay nada especial en cuanto a las funciones, en este artículo no se muestra información sobre su configuración. Si se comprende el modo en que se configuran los objetos DataObjects de pertenencia, no habrá problema en lo que respecta a la configuración de las funciones. En la pertenencia, el objeto de Microsoft C# que encapsula la API de pertenencia es MembershipDataObject.cs. La clase correspondiente que encapsula la API de funciones es RoleDataObject.cs.

ObjectDataSource en GridView (control de datos)

En las secciones anteriores de este artículo se han establecido las declaraciones de clase para los usuarios de pertenencia y las funciones. Asimismo, se ha colocado un objeto ObjectDataSource completo en una página de ASP.NET. El último paso consiste en crear la interfaz de usuario, también llamada nivel de usuario de la aplicación o capa de presentación. Debido a que gran parte del trabajo lo realizan los objetos creados, todo lo que se debe hacer es crear un control GridView simple y asociarlo al origen ObjectDataSource. Los pasos son los siguientes:

  • En el modo visual del diseñador de páginas de ASP.NET, arrastre y coloque el componente de datos GridView en la página asociada al origen ObjectDataSource creado anteriormente.

  • Habilite las funciones de selección, eliminación, actualización, inserción y ordenación.

En la figura 8 se muestra el cuadro de diálogo asociado a la configuración del control Gridview.

Figura 8. Configuración del control GridView

Es necesario mencionar igualmente que el elemento DataKeyNames del control GridView que aparece abajo se establece automáticamente. Esto se debe a que la clave principal se ha etiquetado en la clase MembershipUserSortable con el atributo [DataObjectField(true)], como se muestra a continuación. Observe también que debido a que UserName es una propiedad de la clase MembershipUser, fue preciso proporcionar una propiedad predeterminada en la clase que amplía MembershipUser. Dado que se trata de una propiedad de sólo lectura, sólo se declara un método Get. (UserName es virtual y público en MembershipUser.)

[DataObjectField(true)]
public override string UserName {
  get { return base.UserName;
}

Uno de los atributos del control GridView se debe establecer manualmente: la clave principal se debe definir en el control. Para ello, asocie el atributo DataKeyName a UserName. A continuación se muestra la declaración de GridView.

<asp:GridView ID="GridView1" DataKeyNames="UserName" runat="server" 
        AllowPaging="True" AutoGenerateColumns="False"
        DataSourceID="ObjectDataSourceMembershipUser"
        AllowSorting="True">
    <Columns>
    ...
    ...

Conclusión

En resumen, después de leer este artículo debe tener los conocimientos básicos necesarios para crear su propia aplicación de ASP.NET de tres niveles. Asimismo, ahora dispone de dos objetos que puede utilizar libremente para encapsular miembros y funciones. Puede, por ejemplo, utilizar el control DetailView y, en tan sólo unos minutos, crear una interfaz DetailView completa para los miembros que exploran, insertan, actualizan y eliminan miembros. Anímese a intentarlo.

En este artículo, se han omitido específicamente los detalles de las implementaciones de adición, actualización y eliminación de miembros y funciones. Si examina el código fuente, comprobará que he utilizado las API de un modo muy directo. Describir dichas llamadas en detalle no supondrá mayor ventaja, ya que estoy seguro de que si aún está leyendo este artículo, al igual que yo, estará conociendo este tema a medida que avanza.

Este año tuve la suerte de asistir al evento MS TechEd celebrado en Orlando y a la conferencia PDC que tuvo lugar en Los Ángeles, donde pude realizar numerosas preguntas al equipo de ASP.NET. En concreto, me gustaría agradecer a Brad Millington y Stefan Schackow su amabilidad al responder a todas mis cuestiones durante esas semanas, y a Jeff King y Brian Goldfarb por su ayuda en la mejora de este artículo. Se puede decir que este artículo es la forma que tengo de agradecerles su ayuda, ya que he contribuido en cierta medida a que no tengan que responder a tantas preguntas en el futuro.

Acerca del autor

Peter Kellner fundó 73rd Street Associates en 1990, donde elaboró con éxito sistemas de programación clínica universitaria, administración de compañías de seguros y administración de centros médicos "llave en mano" para más de 500 clientes de Estados Unidos. Diez años más tarde, en 2000, 73rd Street Associates fue adquirida por una compañía de seguros de gran envergadura y Peter dio una nueva orientación laboral a su vida como consultor de software independiente. Entre las tecnologías en las que se encuentra involucrado en este momento se encuentran ASP.NET, Oracle, Java, VOiP y pronto SQL Server. Cuando no está inmerso en su trabajo, Peter pasa la mayor parte de su tiempo libre montando en bicicleta. Ya ha visitado gran parte del mundo; recientemente, él y su esposa Tammy recorrieron Estados Unidos, desde California a Georgia, en tan sólo 27 días.

El sitio del blog de Peter es http://peterkellner.net/ (en inglés). Encontrará este artículo y el código publicado en la sección de descarga.

Mostrar:
© 2014 Microsoft