Lista de Artículos Pagina de Inicio
- Año III  







El acceso a Datos en ASP.NET Whidbey (Parte 3 / 3)

Juan Manuel A. Herrera Pastor / juan_herrera(at)informatizate(dot)net / Febrero 23 del 2005.

GRUPO GESFOR OSMOS PERU S.A. Ing. Informatico
Microsoft Certified Professional
Microsoft Certified Solution Developer
Microsoft Certified Application Developer
Microsoft Certified Solution Developer for .NET
Microsoft Certified Database Administrator (MCDBA)



WebServiceDataSource

Actualmente, no hay un control WebServiceDataSource, pero el control ObjectDataSource puede consumir un Servicio Web de la misma manera que consume una capa de acceso a datos. Aquí tenemos la capa de acceso a datos usada en el ejemplo anterior convertida a un Servicio Web:

< %@ webservice language="VB" class="NorthwindService" %>

Imports System
Imports System.Web.Services
Imports System.Xml.Serialization
Imports System.Data
Imports System.Data.SqlClient
Imports System.Configuration

Public Class NorthwindService

   < WebMethod()> _
    Public Function GetCustomers() As DataSet
        Dim cn As New SqlConnection( _
            ConfigurationSettings.ConnectionStrings( _
                "northwindConnection"))
        Dim da As New SqlDataAdapter( _
            "select customerid, companyname from customers", cn)
        Dim ds As New DataSet
        da.Fill(ds, "Customers")
        Return ds
    End Function

   < WebMethod()> _
    Public Function GetOrders(ByVal customerID As String) As DataSet
        Dim cn As New SqlConnection( _
            ConfigurationSettings.ConnectionStrings( _
                "northwindConnection"))
        Dim da As New SqlDataAdapter( _
            "select * from orders where customerid=@customerid", cn)
        da.SelectCommand.Parameters.Add("@customerid", _
            SqlDbType.NVarChar, 5)
        da.SelectCommand.Parameters("@customerid").Value = customerID
        Dim ds As New DataSet
        da.Fill(ds, "Orders")
        Return ds
    End Function

End Class
    


El código anterior muestra como la capa de acceso a datos fue convertida a un Servicio Web. Se mostrará como el control ObjectDataSource puede ser usado para consumir un Servicio Web. Asumiremos que la referencia Web ha sido añadida al Sitio, y que la clase proxy del Servicio Web se llama NorthwindWeb, entonces el control ObjectDataSource puede ser modificado para consumir el servicio web como sigue a continuación:

< asp:objectdatasource 
id="ObjectDataSource2" 
runat="server" 
typename="NorthwindWeb.NorthwindService"
selectmethod="GetOrders">
< selectparameters>
< asp:controlparameter 
name="customerID" 
propertyname="SelectedValue" 
type="String"
defaultvalue="" 
controlid="DropDownList1">
< /asp:controlparameter>
< /selectparameters>
< /asp:objectdatasource>
    


Note que el único cambio está en el atributo typename. En vez de apuntar a DAL.Customers, el control ObjectDataSource hace referencia a la clase proxy NorthwindWeb.NorthwindService. Con este cambio, ahora la página Web consulta un Servicio Web para obtener una lista de clientes y mostrarlos en el control DropDownList. Cuando el usuario selecciona un cliente, la página consulta otra vez el Servicio Web, y obtiene las órdenes del cliente. Todo esto, es hecho declarativamente.


DataSetDataSource

Si tenemos un archivo XML, podemos usar el control DataSetDataSource para consumir estos datos. Solo deberiamos establecer la propiedad DataFile con la ruta del archivo XML. Otros controles como DropDownList o el GridView entonces pueden ligarse al control DataSetDataSource.


XmlDataSource

Realmente XML sobresale representando a los datos semiestructurados o en jerarquía. En este caso, es mejor utilizar un control XmlDataSource. Cuando configuramos un control XmlDataSource, podemos especificar la ruta del archivo XML que debería consumir. También podemos especificar el esquema que debería ser usado para validar el archivo XML. Además podemos indicar la ruta del archivo de estilos XSLT si el archivo XML requiere de una transformación. Finalmente, podemos especificar una expresión XPATH para seleccionar un nodo específico. La documentación MSDN contiene varios ejemplos del control XmlDataSource, y sólo para propósito de ilustración, he preparado el siguiente documento XML basado en uno de estos ejemplos:

< ?xml version="1.0" standalone="yes"?>
< bookstore>
  < genre name="fiction">
    < book ISBN="10-000000-001">
      < title>The Iliad and The Odyssey
      < price>12.95
      < comments>
        < userComment rating="4">
           Best translation I've read.
        < /userComment>
        < userComment rating="2">
           I like other versions better.
        < /userComment>
      < /comments>
    < /book>
    < book ISBN="10-000000-999">
      < title>Anthology of World Literature
      < price>24.95
      < comments>
         < userComment rating="3">
          Needs more modern literature.
        < /userComment>
        < userComment rating="4">
          Excellent overview of world literature.
        < /userComment>
      < /comments>
    < /book>
  < /genre>
  < genre name="nonfiction">
    < book ISBN="11-000000-002">
      < title>Computer Dictionary
      < price>24.95
      < comments>
        < userComment rating="3">A valuable resource.
      < /comments>
    < /book>
    < book ISBN="11-000000-003">
      < title>Cooking on a Budget
      < price>23.95
      < comments>
        < userComment rating="4">Delicious!
      < /comments>
    < /book>
  < /genre>
< /bookstore>
    


Con este archivo XML se mostrará las características del control XmlDataSource. Los datos de este archivo XML no se pueden mostrar directamente en un control GridView, pero si a través del un control TreeView. Por defecto, el control TreeView muestra los elementos del archivo XML:


Figure 9. Un control TreeView ligado a un archivo XML


Tipicamente, necesitaremos mostrar información más significativa a partir del archivo XML. El control TreeView provee métodos mediante los cuales se especifica cómo cada nodo es mostrado. Por ejemplo, podemos establecer que el elemento bookstore debería ser mostrado usando el texto estático "Books". Así tenemos:

< bindings>
    < asp:treenodebinding 
        value="Books" 
        datamember="bookstore" 
        depth="0" 
        text="Books">
    < /asp:treenodebinding>
< /bindings>
    


Para un elemento como genre (género), en vez de un texto estático, probablemente querremos mostrar la información del género, el cual es listada en un atributo de este elemento:

< genre name="fiction">
    


En este caso un objeto treenodebinding también es creado, pero esta vez usaremos el atributo TextField para indicar que el valor del atributo "name" debería ser mostrado:

< asp:treenodebinding
    datamember="genre" 
    textfield="name" 
    depth="1">
< /asp:treenodebinding>
    


El mismo procedimiento puede ser usado para el elemento book de manera que el atributo ISBN sea mostrado. El resultado es mostrado en la siguiente figura:


Figura 10. Añadiendo el ISBN

El control TreeView también contiene un número de propiedades que nos permiten personalizar su apariencia. Por ejemplo, si establecemos la propiedad ImageSet a XP_Explorer, el control Treeview mostrará gráficos predefinidos (los elementos aparecerían como carpetas). Así tenemos:


Figura 11. TreeView personalizado

Además, podemos crear nuestras propias imágenes y especificarlas usando las siguientes propiedades: NoExpandImageUrl, CollapseImageUrl, ExpandImageUrl, RootNodeImageUrl, ParentNodeImageUrl, LeafNodeImageUrl.

El control TreeView también puede mostrar líneas que conectan los nodos. Si establecemos la propiedad ShowLines a true, entonces lineas punteadas serán dibujadas entre los nodos. No obstante, podemos crear nuestras propias líneas seleccionando la opción Create Line Images del menú contextual del control TreeView. Esto muesta el cuadro de diálogo Image Generator que nos permite especificar el color, estilo y el ancho de la línea. Cuando se hace click en el botón Generate, las imágenes son almacenadas en una carpeta de nuestra elección. Entonces, podemos establecer en la propiedad LineImagesFolderUrl del TreeView la ruta de esta carpeta, y tendríamos nuestras propias líneas personalizadas:


Figura 12. Añadiendo líneas personalizadas

También podemos personalizar la apariencia del control TreeView y crear efectos estableciendo propiedades como HoverNodeStyle o SelectedNodeStyle.


SiteMapDataSource

El último control que se puede ligar a datos es el control SiteMapDataSource. Por ejemplo, este control es útil para ligarlo a un control TreeView y crear un mapa de navegación del sitio web, con veremos, ligandolo a un control breadcrumb. El primer paso es crear un archivo XML que especifique la estructura del sitio web:

< ?xml version="1.0" encoding="utf-8" ?>
< siteMap>
    < siteMapNode title="Northwind" description="Northwind" 
        url="root.aspx">
        < siteMapNode 
            title="Products" 
            description="Product Line" 
            url="Products.aspx">
            < siteMapNode 
                title="Beverages" 
                description="Tasty Beverages" 
                url="Beverages.aspx" />
        < /siteMapNode>
    < /siteMapNode>
< /siteMap>
    


Aquí podemos ver que una jerarquía de elementos siteMapNode especifica la estructura de navegación del sitio web, la cual es totalmente independiente de la estructura de carpetas del sitio web. Entonces, este archivo es simplemente almacenado con el nombre app.sitemap. Cuando el control SiteMapDataSource es colocado en la página, se buscará por un archivo con este nombre, por defecto. Para permitir accesos directos a las páginas relacionadas, simplemente soltamos el control SiteMapPath sobre la página que automáticamente se liga al control SiteMapDataSource, resultando en lo siguiente:


Figura 13. El control SiteMapPath

Esto hace fácil añadir navegación a los sitios web. Si combinamos esto con Páginas Maestras, podemos definir los controles de navegación del sitio web una sola vez, y hacerlas aparecer en cada una de las páginas del sitio web.


Conclusión

Con ASP.NET versiones 1.0/1.1 teniamos que codificar para obtener información desde una fuente de datos (generalmente una base de datos). También, ciertos tipos de datos, como XML, no pueden ser ligados a controles nativamente. Con ASP.NET Whidbey, el concepto de fuente de datos es encapsulado en controles. Con estos controles, se puede trabajar con datos relacionales, XML, objetos de negocio y servicios Web. También podemos crear nuestras propias fuentes de datos para manejar otros escenarios. Los controles DataSource llenan un vacio en la sintaxis declarativa de ASPX, y como resultado tenemos muchos escenarios donde podemos generar interfaces enlazadas a datos sin usar código Visual Basic .NET or C#.



Comenta éste artículo en el foro de informatizate.




   


Otros Artículos del Autor: Fecha Publicación:
El acceso a Datos en ASP.NET Whidbey (Parte 2 / 3) Febrero 19 del 2005
El acceso a Datos en ASP.NET Whidbey (Parte 1 / 3) Febrero 16 del 2005
La Labor del Administrador de Base de Datos - (PARTE 1) Junio 14 del 2004


Google


Copyright © 2002-2005 Grupo Informatizate. Reservados todos los derechos.
Prohibida la reproducción total o parcial en cualquier formato sin previa autorización.
On-line desde el 27 de Noviembre del 2002