Tutorial: utilizar el servicio de dominio en aplicaciones ASP.NET

ASP.NET proporciona un control DomainSourceControl que puede ser utilizado por controles enlazados a datos, como el control GridView, para tener acceso a la base de datos y permitir al usuario realizar operaciones CRUD (creación, lectura, actualización y eliminación).

Es importante observar que el servicio de dominio permite desasociar una aplicación del modelo de base de datos concreto. Esto proporciona la ventaja de centrarse en la lógica de negocios y en la creación de código fácilmente transferible a un modelo diferente.

El servicio de dominio de WCF RIA Services proporciona un patrón para escribir lógica de aplicación que se ejecuta en el servidor y controla el acceso a los datos en consultas, cambios y operaciones personalizadas. También proporciona compatibilidad de extremo a extremo para tareas comunes como validación de datos, autenticación y roles integrando aplicaciones cliente de Silverlight y de servidor ASP.NET.

En este tutorial se muestra cómo tener acceso a una base de datos de una página web de ASP.NET utilizando el servicio de dominio de RIA Services . Aunque este tutorial describe el servicio de dominio en ASP.NET, el uso del servicio no se limita a las aplicaciones ASP.NET. Este tutorial no aborda la integración de aplicaciones de servidor ASP.NET con aplicaciones cliente de Silverlight.

Este tutorial contiene los procedimientos siguientes:

  • Crear una aplicación web ASP.NET

  • Utilizar el servicio de dominio

  • Probar el servicio de dominio

Requisitos previos

Este tutorial y los demás tutoriales presentados en la documentación de RIA Services requieren la instalación y configuración correctas de varios programas de requisitos previos, como Visual Studio 2010 y Silverlight Developer Runtime y SDK, además de WCF RIA Services y el kit de herramientas de WCF RIA Services. También requieren la instalación y configuración de SQL Server 2008 R2 Express con Advanced Services, así como la instalación de las bases de datos OLTP y LT de AdventureWorks.

Los temas del nodo Requisitos previos para WCF RIA Services proporcionan instrucciones detalladas para el cumplimiento de cada uno de estos requisitos previos. Siga las instrucciones proporcionadas en ellos antes de realizar este tutorial para asegurarse de encontrar el menor número de problemas posibles al trabajar en este tutorial de RIA Services .

Crear una aplicación web ASP.NET

Para utilizar el servicio de dominio, debe crear una aplicación web ASP.NET capaz de interactuar con una base de datos. A continuación se muestran los pasos que debe realizar:

  • Crear una aplicación web. Proporciona el entorno para el uso del servicio de dominio.

  • Agregar una base de datos a la aplicación. Permite elegir la base de datos para una aplicación web.

  • Crear el modelo de base de datos. Permite crear el modelo que contiene las entidades de base de datos como tipos CLR. Estos son los tipos utilizados por el servicio de dominio para interactuar con la base de datos. Puede utilizar el modelo de datos de ADO.NET Entity Framework o LINQ to SQL.

En el procedimiento siguiente se muestra cómo crear una aplicación web ASP.NET.

Para crear una aplicación web ASP.NET

  1. En Visual Studio 2010, haga clic en el menú Archivo, en Nuevo y, a continuación, en Proyecto.

    Se muestra el cuadro de diálogo Nuevo proyecto.

  2. En Plantillas instaladas, expanda Visual C# o Visual Basic y, a continuación, seleccione Web.

  3. En la lista de plantillas, seleccione Aplicación web vacía de ASP.NET.

  4. Asigne al proyecto el nombre UsingDomainService, especifique una ubicación y, a continuación, haga clic en Aceptar.

  5. Compile la aplicación.

En el procedimiento siguiente se muestra cómo agregar una base de datos a la aplicación. Esta base de datos contiene la tabla a la que se tendrá acceso para su visualización y edición.

Para agregar la base de datos a la aplicación web

  1. En el Explorador de soluciones, haga clic con el botón secundario en el nombre del proyecto, seleccione Agregar, haga clic en Agregar carpeta ASP.NET y, a continuación, en App_Data.

    De este modo se agrega la carpeta App_Data al proyecto.

  2. Haga clic con el botón secundario en la carpeta App_Data, haga clic en Agregar y, a continuación, haga clic en Elemento existente.

    Se mostrará el cuadro de diálogo Agregar elemento existente.

  3. Especifique la ubicación del archivo de base de datos AdventureWorksLT (AdventureWorksLT_Data.mdf).

    La siguiente ilustración muestra el cuadro de diálogo Agregar elemento existente.

    Cliente de servicio de dominio de ASP.NET: cuadro de diálogo Agregar elemento existente

  4. Haga clic en Agregar.

    Con ello se crea una copia del archivo de base de datos en el proyecto. Para obtener más información, vea Conectar con la base de datos AdventureWorksLT utilizando un archivo .MDF.

En el procedimiento siguiente se muestra cómo crear el modelo de datos que contiene las clases que representan las tablas de base de datos. En este tutorial, utilizará un modelo de datos de ADO.NET Entity Framework. Sin embargo, también puede utilizar un modelo de datos de LINQ to SQL.

Para crear el modelo de datos

  1. En el Explorador de soluciones, haga clic con el botón secundario en el nombre del proyecto, haga clic en Agregar y, a continuación, haga clic en Nuevo elemento.

    Se abrirá el cuadro de diálogo Agregar nuevo elemento.

  2. En Plantillas instaladas, seleccione Datos.

  3. En la lista de plantillas, seleccione Entity Data Model de ADO.NET.

  4. Asigne al modelo de base de datos el nombre AdventureWorksLT.edmx y, a continuación, haga clic en Agregar.

    Se muestra el Asistente para Entity Data Model.

  5. En la pantalla Elegir contenido de Model, seleccione Generar desde la base de datos.

    La siguiente ilustración muestra el cuadro de diálogo Elegir contenido de Model.

    Cliente de servicio de dominio de ASP.NET: cuadro de diálogo Elegir contenido del modelo

  6. Haga clic en Siguiente.

  7. En la pantalla Elegir la conexión de datos, en ¿Qué conexión de datos debe usar la aplicación para conectarse a la base de datos?, seleccione AdventureWorksLT_Data.mdf en la lista desplegable.

  8. Asegúrese de que esté activada la casilla Guardar configuración de conexión de entidad en Web.Config como. Puede dejar el nombre predeterminado de la cadena de conexión.

    La siguiente ilustración muestra el cuadro de diálogo Elegir la conexión de datos.

    Cliente de servicio de dominio de ASP.NET: cuadro de diálogo Elegir conexión de datos

  9. Haga clic en Siguiente.

    El asistente muestra una página en la que puede especificar qué objetos de base de datos desea incluir en el modelo.

  10. En la pantalla Elegir los objetos de base de datos, seleccione el nodo Tablas para seleccionar todas las tablas de la base de datos.

    La siguiente ilustración muestra el cuadro de diálogo Elegir los objetos de base de datos.

    Cliente de servicio de dominio de ASP.NET: cuadro de diálogo Elegir objetos de base de datos

  11. Asegúrese de que esté activada la casilla Incluir columnas de clave externa en el modelo. Puede dejar el espacio de nombres del modelo predeterminado.

  12. Haga clic en Finalizar.

    Se muestra ADO.NET Entity Data Model Designer. Ha creado el modelo de datos que representa la base de datos AdventureWorksLT.

  13. Cierre el diseñador.

  14. Compile la aplicación.

    Esto hace que la clase de contexto AdventureWorksLT_DataEntities esté disponible para el servicio de dominio en el procedimiento siguiente.

Utilizar el servicio de dominio

Este procedimiento describe los pasos que se deben seguir para utilizar el servicio de dominio en una aplicación ASP.NET. Estos pasos son los siguientes:

  • Agregar una clase de servicio de dominio al proyecto. Con ello se crea la clase que permite a la aplicación realizar las operaciones de base de datos CRUD y, muy importante, permite incluir la lógica de negocios. Esta clase funciona en el nivel de servidor o en el nivel intermedio.

  • Crear la lógica de negocios. Incluirá su código (lógica de negocios) en la clase de servicio de dominio.

  • Declarar el control DomainDataSource. Realizará esta acción en un marcado de la página para que el usuario pueda interactuar con la base de datos. Este control funciona en el nivel de cliente o en el nivel de presentación.

En el procedimiento siguiente se muestra cómo agregar el servicio de datos de dominio al proyecto.

Para agregar la clase de servicio de dominio al proyecto

  1. En el Explorador de soluciones, haga clic con el botón secundario en el nombre del proyecto, haga clic en Agregar y, a continuación, haga clic en Nuevo elemento.

  2. En Plantillas instaladas, seleccione Web.

  3. En la lista de plantillas, seleccione DomainService Class.

  4. Asigne al archivo el nombre AdventureWorksDomainService.cs o AdventureWorksDomainService.vb y, a continuación, haga clic en Agregar.

    Se muestra el cuadro de diálogo Agregar nueva clase de servicio de dominio. El cuadro Nombre de la clase de servicio de dominio contiene el nombre que especificó.

  5. Active la casilla Habilitar acceso de cliente.

  6. En la lista desplegable Clases DataContext/ObjectContext disponibles, seleccione AdventureWorksLT_DataEntities (Entity Framework). Si la lista desplegable está vacía, no compiló la aplicación. Salga del cuadro de diálogo Agregar nueva clase de servicio de dominio, compile la aplicación y repita los pasos anteriores. 

  7. En la lista Entidades, seleccione la tabla Product.

  8. Para la tabla Product, active la casilla Habilitar edición.

  9. Active la casilla Generar clases asociadas para metadatos.

    La siguiente ilustración muestra el cuadro de diálogo Agregar nueva clase de servicio de dominio.

    Cliente de servicio de dominio de ASP.NET: cuadro de diálogo Agregar nueva clase de servicio de dominio

  10. Haga clic en Aceptar.

    Se crean la clase AdventureWorksDomainService y el archivo de metadatos relacionado. La clase contiene los métodos que permiten operaciones CRUD de base de datos. Puede modificar tanto la clase como los archivos de metadatos para incluir su lógica de negocios. En el procedimiento siguiente se mostrará un ejemplo simple. Observe que las referencias de proyecto se han actualizado para contener los ensamblados necesarios y el archivo Web.config se ha actualizado para contener todos los elementos de configuración necesarios.

  11. En el menú Archivo, haga clic en Guardar todo.

En el procedimiento siguiente se muestra cómo personalizar la clase AdventureWorksDomainService y el archivo de metadatos relacionado para incluir su lógica de negocios. La personalización es muy simple, pero le da una idea de las modificaciones que puede realizar.

Para crear la lógica de negocios

  1. En el Explorador de soluciones, abra el archivo AdventureWorksDomainService.cs o AdventureWorksDomainService.vb.

  2. Modifique el método UpdateProduct para incluir lógica de validación del campo ListPrice, como se muestra en el código siguiente. Asimismo, actualice el campo ModifiedDate utilizando la fecha actual.

    public void UpdateProduct(Product currentProduct)
    {
      if ((currentProduct.EntityState == EntityState.Detached))
      {
        // Custom logic: set a lower limit for the price.
        if (currentProduct.ListPrice < 5)
          throw new ValidationException("The list price must be >= 5.");
        this.ObjectContext.Products.AttachAsModified(currentProduct,
           this.ChangeSet.GetOriginal(currentProduct));
        // Custom logic: set the date to the current value.
        currentProduct.ModifiedDate = DateTime.Today;
      }
    }
    
    Public Sub UpdateProduct(ByVal currentProduct As Product)
      If (currentProduct.EntityState = EntityState.Detached) Then
        ' Custom logic: set a lower limit for the price.
        If currentProduct.ListPrice < 5 Then
          Throw New ValidationException("The list price must be >= 5.")
        End If
        Me.ObjectContext.Products.AttachAsModified(currentProduct, _
          Me.ChangeSet.GetOriginal(currentProduct))
        ' Custom logic: set the date to the current value.
        currentProduct.ModifiedDate = DateTime.Today
      End If
    End Sub
    

    Cuando se produce un error en la validación, se produce una excepción y se envía un mensaje de error a la página que se va a mostrar al usuario.

  3. Modifique el método GetProducts para establecer la lógica de ordenación para que Entity Framework funcione correctamente, como se muestra en el código siguiente.

    public IQueryable<Product> GetProducts()
    {
      return this.ObjectContext.Products.OrderBy(p => p.ProductID);
    } 
    
    Public Function GetProducts() As IQueryable(Of Product)
      Return Me.ObjectContext.Products.OrderBy(Function(p) p.ProductID)
    End Function
    
  4. Guarde y cierre el archivo.

  5. En el Explorador de soluciones, abra el archivo AdventureWorksDomainService.metadata.cs o AdventureWorksDomainService.metadata.vb.

  6. Agregue el atributo Required a la entidad de campo de datos Color, como se muestra en el código siguiente.

    Con este atributo, obliga al campo de datos a no estar vacío cuando lo permita la base de datos. Si el usuario escribe una cadena vacía, se emite un error.

    [Required(AllowEmptyStrings=false, 
      ErrorMessage="Color is required")]
    public string Color{ get; set; }
    
    <Required(AllowEmptyStrings:=False, ErrorMessage:="Color is required")> _
    Public Property Color As String
    
  7. Guarde y cierre el archivo de metadatos.

  8. Compile la aplicación.

En el procedimiento siguiente se muestra cómo declarar el control DomainDataSource en un marcado de página para que el usuario pueda interactuar con la base de datos.

Para declarar el control DomainDataSource en una página

  1. En el Explorador de soluciones, haga clic con el botón secundario en el nombre del proyecto, haga clic en Agregar y, a continuación, haga clic en Nuevo elemento.

  2. En Plantillas instaladas, haga clic en Web.

  3. En la lista de plantillas, seleccione Web Forms.

  4. Asigne al archivo el nombre Default.aspx y, a continuación, haga clic en Agregar.

  5. Abra Default.aspx en la Vista de diseño.

  6. Desde el grupo General o Datos del Cuadro de herramientas agregue un control DomainDataSource a la página.

    Aparecerá DomainDataSource con el menú Tareas de DomainDataSource abierto.

    Si el control no está en la lista, haga clic en el menú Herramientas y, a continuación, en Elegir elementos del cuadro de herramientas. En el cuadro de diálogo Elegir elementos del cuadro de herramientas, haga clic en la pestaña Componentes de .NET Framework, active la casilla DomainDataSource y, a continuación, haga clic en Aceptar.

  7. En el menú Tareas de DomainDataSource, haga clic en Configurar origen de datos.

    Se muestra el asistente Configurar origen de datos.

  8. En la pantalla Elegir un servicio de dominio, en la lista Tipo de servicio de dominio, seleccione la clase que creó en UsingDomainService.AdventureWorksDomainService.

    La siguiente ilustración muestra la pantalla Elegir un servicio de dominio.

    Cliente de servicio de dominio de ASP.NET: cuadro de diálogo Elegir servicio de dominio

  9. Haga clic en Siguiente.

  10. En la pantalla Configurar acceso a datos, seleccione el método IQueryable<Product> GetProducts().

  11. Active las casillas Habilitar inserciones, Habilitar actualizaciones y Habilitar eliminaciones.

    La siguiente ilustración muestra la pantalla Configurar acceso a datos.

    Cliente de servicio de dominio de ASP.NET: cuadro de diálogo Elegir acceso a dominio

  12. Haga clic en Finalizar.

  13. En el cuadro de herramientas, agregue un control GridView a la página desde la pestaña Datos.

    Aparecerá GridView con el menú Tareas de GridView abierto.

  14. En el menú Tareas de GridView, en la lista Elegir origen de datos, seleccione DomainDataSource1.

    Este es el identificador del control DomainDataSource que creó en pasos anteriores.

  15. En el menú Tareas de GridView, haga clic en Editar columnas.

    Se muestra el cuadro de diálogo Campos.

  16. Desactive la casilla Generar campos automáticamente.

  17. En el recuadro Campos seleccionados elimine todos los campos excepto Name, Color, ListPrice y ModifiedDate.

  18. Haga clic en Aceptar.

  19. Opcionalmente, en el menú Tareas de GridView, habilite paginación, ordenación y selección activando las casillas relacionadas.

  20. Guarde el archivo y cambie a la vista Código fuente.

  21. Seleccione el control GridView.

  22. En la ventana Propiedades, establezca la propiedad DataKeyNames en la siguiente lista separada por comas de todas las columnas que no se muestran: ProductID, ProductNumber, StandardCost, Size, Weight, ProductCategoryID, ProductModelID, SellStartDate, SellEndDate, DiscontinuedDate, ThumbNailPhotoFileName, rowguid.

    Esto lo necesita el control DomainDataSource para realizar las operaciones CRUD.

  23. Establezca la propiedad AutoGenerateEditButton en True para habilitar la edición y eliminación de filas de tabla.

  24. En la vista Código fuente, reemplace el elemento Columns por el marcado siguiente.

    Utilizando las plantillas personalizadas, este marcado habilita la validación de los valores de los campos de datos Color y ListPrice antes de devolverse al servidor en postback. También crea un control LinkButton de eliminación que solicita el permiso de usuario antes de que se realice la eliminación de una fila.

      <Columns>
        <asp:TemplateField>
          <ItemTemplate>
            <asp:LinkButton ID="LinkButton1"  CommandName="Delete" Text="Delete"
              ForeColor="#333333"  OnClientClick='return confirm("Are you sure you want to delete this row?");'/>
          </ItemTemplate>
        </asp:TemplateField>
    
        <asp:CommandField ShowSelectButton="True" />
        <asp:BoundField DataField="Name" HeaderText="Name" SortExpression="Name" />
        <asp:TemplateField>
          <HeaderTemplate>Color</HeaderTemplate>
          <ItemTemplate>
            <%# Eval("Color") %>
          </ItemTemplate>
          <EditItemTemplate>
            <asp:TextBox ID="ColorID"  Text='<%# Bind("Color") %>'/>
            <cc1:DomainValidator ID="DomainValidator2"   DataField="Color"/>
          </EditItemTemplate>
        </asp:TemplateField>
    
        <asp:TemplateField>
          <HeaderTemplate>ListPrice</HeaderTemplate>
          <ItemTemplate>
            <%# Eval("ListPrice")%>
          </ItemTemplate>
          <EditItemTemplate>
            <asp:TextBox ID="ListPriceID"  Text='<%# Bind("ListPrice") %>'/>
            <cc1:DomainValidator ID="DomainValidator3"  DataField="ListPrice"/>
           </EditItemTemplate>
         </asp:TemplateField>
    
         <asp:BoundField DataField="ModifiedDate" HeaderText="ModifiedDate" SortExpression="ModifiedDate" />
      </Columns>
    
  25. Delante del control GridView, agregue el marcado siguiente para permitir que se muestren los errores de validación:

    <asp:ValidationSummary ID="ValidationSummary1"  />
    <cc1:DomainValidator  ControlToValidate="GridView1"/>
    
  26. Guarde el archivo Default.aspx.

  27. Compile la aplicación.

Probar el servicio de dominio

En este procedimiento se muestra cómo probar las capacidades del servicio de dominio mediante el uso del control GridView. Este procedimiento comprueba lo siguiente:

  • La interacción con la base de datos, mediante la lógica de negocios personalizada, funciona conforme a lo esperado.

  • ASP.NET realiza los cambios realizados por el usuario en los campos de base de datos.

  • ASP.NET muestra los mensajes de los errores generados por la lógica personalizada.

Probar el servicio de dominio

  1. En el Explorador de soluciones, haga clic con el botón secundario en la página Default.aspx y seleccione Ver en el explorador.

    El explorador muestra una página que contiene la tabla Product.

  2. En cualquier fila, haga clic en Editar y modifique el valor de la columna ListPrice especificando un valor menor que 5.

  3. En la misma fila, haga clic en Actualizar.

    Se muestra un error personalizado que indica que el valor del campo debe ser mayor o igual que 5.

  4. En la misma fila, especifique un valor mayor que 5 para la columna ListPrice.

  5. En la misma fila, haga clic en Actualizar.

    ASP.NET actualiza los campos de datos ListPrice y ModifiedDate en la base de datos.

  6. En cualquier fila, haga clic en Editar y modifique el valor de la columna Color escribiendo una cadena vacía.

  7. En la misma fila, haga clic en Actualizar.

    ASP.NET muestra un error de validación personalizado.

  8. En la misma fila, especifique un valor que no sea una cadena vacía para la columna Color.

  9. En la misma fila, haga clic en Actualizar.

    ASP.NET actualiza los campos de datos Color y ModifiedDate en la base de datos.

Vea también

Tareas

Agregar lógica de negocios al servicio de dominio

Conceptos

Crear soluciones de RIA Services