tag(s) Tags: C#, ASP.NET 2
lu 3343 fois
6 pages
Patrice Lamarche
Créer des contrôles sources de données (DataSource objects) avec ASP.net 2
Développement d'un contrôle DataSource qui permet d'effectuer du databinding avec des photos du site Flickr.
Par Patrice Lamarche publié le 19/08/2007 à 23:05
 
Comme tout bon site web 2.0 qui se respecte, Flickr propose un ensemble d'API qui permet de bâtir tout type d'application utilisant les services fournis par le site de publication de photo. Le seul pré-requis pour pouvoir utiliser ces API est de demander une clé d'utilisation que vous devrez fournir lors de l'utilisation des API. Afin de demander cette clé gratuite pour une utilisation non-commerciale, connectez-vous avec votre compte Flickr et rendez-vous sur la page services : http://www.flickr.com/services
Afin de ne pas avoir à implémenter cet API nous-même, nous allons utiliser une libraire managée Open Source disponible sur CodePlex : FlickrNet disponible à cette adresse http://www.codeplex.com/flickrnet
Utiliser cette librairie est très simple, il suffit d'instancier un objet Flickr en passant en paramètre une clé d'API fournie par Flickr, et de récupérer un set de photos grâce à la méthode PhotosetsGetPhotos. Cette méthode renvoie un tableau d'objets Photo utilisable pour afficher et/ou récupérer les informations liées à ces photos.

public void GetSetPhotos()

 {

    m_flickr = new Flickr(m_apiKey);

    Photoset set = m_flickr.PhotosetsGetPhotos(ViewState["flickrPhotoSetId"].ToString());

    Photo[] setPhotos;

    m_photos = set.PhotoCollection;

 }

Afin de développer un contrôle source de données, il suffit de créer une classe qui implémente l'interface IDataSource. Cependant le framework.net propose une classe abstraite un peu plus riche : la classe DataSourceControl. Cette classe hérite de System.Web.UI.Control et implémente IDataSource ainsi qu'IListSource, et nous allons donc créer une classe qui hérite de cette classe abstraite afin de définir notre classe FlickrDataSource. Cette classe expose différentes propriétés importante pour son fonctionnement tel que l'ID du set de photos qui sera affichée, le nom d'utilisateur qui sera utilisé pour filtrer les sets dans l'interface de configuration. La méthode la plus importante est la méthode GetView. Cette méthode permet de renvoyer une vue de données qui contiendra les donnés pouvant être affichées par le contrôle d'affichage.

    public class FlickrDataSource:DataSourceControl

    {

        private FlickrDataSourceView m_view;

        private Photo[] m_photos;

        private Flickr m_flickr;

        private string m_apiKey;

        private string m_userName;

        private string m_userId;

        private string m_setId;

 

 

public void GetSetPhotos()

        {

            m_flickr = new Flickr(m_apiKey);

            Photoset set = m_flickr.PhotosetsGetPhotos(ViewState["flickrPhotoSetId"].ToString());

            Photo[] setPhotos;

                m_photos = set.PhotoCollection;

        }

 

        public string PhotoSetId

        {

            get

            {

                if (ViewState["flickrPhotoSetId"] !=null)

                    return ViewState["flickrPhotoSetId"].ToString();

                else

                    return m_setId;

 

            }

            set { ViewState["flickrPhotoSetId"] = value;

                m_setId = value;

            }

        }

 

        public string UserName

        {

            get { return m_userName; }

            set 

            { m_userName = value;

            m_flickr = new Flickr(m_apiKey);

            m_userId = m_flickr.PeopleFindByUsername(value).UserId;

            }

        }

 

        public string ApiKey

        {

            get { return m_apiKey; }

            set { m_apiKey = value; }

        }

 

        [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]

        public Photo[] Photos

        {

            get { return m_photos; }

            set { m_photos = value; }

        }

 

 

        protected override DataSourceView GetView(string viewName)

        {

            if (m_view == null)

            {

                m_view = new FlickrDataSourceView(this, viewName);      

            }

            return m_view;

        }

    }

Les données renvoyées qui seront databindés vers des contrôles d'affichage de données tels que des repeater ou datalist doivent être définis dans une vue. Cette vue doit être implémentée grâce à une classe héritant de DataSourceView.
 
/content/5da97713-037d-441d-88ed-51bece6c7028/image2.png
 
DataSourceView expose plusieurs propriétés permettant d'indiquer si votre contrôle source de données supporte la suppression, l'insertion ou encore la modification de données. Les valeurs définies par la classe de base sont définies à false vous devez donc les redéfinir uniquement si vous implémenter ces fonctionnalités afin de renvoyer une valeur true. La classe de base expose également les méthodes permettant d'exécuter ces opérations (ExecuteSelect, ExecuteInsert, etc.), ces méthodes seront appelées durant l'exécution afin de réaliser les opérations correspondantes.
Le FlickrDataSource permettant uniquement d'afficher des données, il est uniquement nécessaire de redéfinir la méthode ExecuteSelect, méthode qui appellera la méthode GetSetPhotos définis dans la classe FlickrDataSource.

namespace FlickrDataSource

{

    class FlickrDataSourceView : DataSourceView

    {

        private FlickrDataSource m_owner;

 

        internal FlickrDataSourceView(FlickrDataSource owner, string viewName)

            : base(owner, viewName)

        {

            m_owner = owner;

        }

 

 

        protected override System.Collections.IEnumerable ExecuteSelect(DataSourceSelectArguments arguments)

        {

            m_owner.GetSetPhotos();

            return m_owner.Photos;

        }

    }

}

La méthode ExecuteSelect doit renvoyer un objet implémentant IEnumerable, nous pouvons donc renvoyer un tableau de photos tel que renvoyé par FlickrNet sans aucun problème. Nous pourrons ainsi profiter du modèle objet proposé par cette bibliothèque afin de binder les différentes propriétés des photos telles que le titre, la description, les différentes miniatures, etc.
Afin de permettre au développeur de mettre en place une pagination en quelques lignes de code, nous allons rajouter deux propriétés au contrôles : la propriété PageIndex afin de définir l'index de la page à afficher et la propriété PageSize afin d'indiquer le nombre d'éléments dans chaque page.
Afin de bien gérer les différents cycles de postback pouvant intervenir, nous allons stocker ces propriétés dans le ViewState :

public int PageSize

        {

            get 

            {

 

                if (ViewState["flickrPageSize"] != null)

                    return (int)ViewState["flickrPageSize"];

                else

                    return 0;

            }

            set 

            {

                ViewState["flickrPageSize"] = value;

            }

        }

 

        public int PageIndex

        {

            get 

            {

                if (ViewState["flickrPageIndex"] != null)

                    return (int)ViewState["flickrPageIndex"];

                else

                    return 0;

            }

            set 

            {

                ViewState["flickrPageIndex"] = value;

            }

        }

Il est maintenant nécessaire de modifier la méthode GetSetPhotos afin de prendre en compte ces propriétés et modifier l'affichage en fonction de leur valeur.

public void GetSetPhotos()

        {

            m_flickr = new Flickr(m_apiKey);

            Photoset set = m_flickr.PhotosetsGetPhotos(ViewState["flickrPhotoSetId"].ToString());

            Photo[] setPhotos;

            if (PageSize == 0)

            {

                m_photos = set.PhotoCollection;

                return;

            }

            if (PageSize * PageIndex > set.PhotoCollection.Length || PageIndex<0)

            {

                setPhotos = new Photo[0];

            }

            else

            {

                if (PageIndex * PageSize + PageSize > set.PhotoCollection.Length)

                {

                    setPhotos= new Photo[PageSize-((PageIndex * PageSize + PageSize)-set.PhotoCollection.Length)];

                }

                else 

                setPhotos = new Photo[PageSize];

            }

 

            for (int i=0;i<setPhotos.Length;i++)

            {

                setPhotos[i] = set.PhotoCollection[PageSize * PageIndex + i];

            }

            m_photos = setPhotos;

 

        }

 Commentaire - Créer des contrôles sources de données (DataSource objects) avec ASP.net 2  

 Dernières Publications      

Windows Media Center et WCF : développez votre maison intelligente
  Le développement d'applications pour Windows Media Center est facilité avec l'arrivée du SDK 5.3. Même si l'on sent un modèle objet bien lourd derrière, il devient plus facile d'exposer les fonctionnalités de WMC sous la forme de services WCF.
par Frédéric Colin posté le 23/06/2008 à 08:04, lu 295 fois, #0
Notions avancées avec Biztalk Server 2006 R2
  Utilisation des notions d'interchange, corrélation et convoi avec BizTalk Server 2006 R2
par Kader Yildirim posté le 09/06/2008 à 08:04, lu 288 fois, #0
Lucene Persistence Engine pour Evaluant Universal Storage Services
  Suite à l'article de Laurent Kempé, voici un moteur de stockage pour EUSS permettant l'indexation d'entités métier avec Lucene.
par Nicolas Penin posté le 01/06/2008 à 23:38, lu 510 fois, #1
Tags: C#, Linq
XMLA Trivia : Découverte du XMLA
  Le XMLA (XML for Analysis) est un langage normalisé par plusieurs éditeurs BI pour simplifier l'accès aux données aux cubes et aux métadonnées des bases multidimensionnelles.
par Renaud Harduin posté le 25/05/2008 à 11:57, lu 523 fois, #0
Exploiter les données CSV via Linq en toute simplicité
  A partir du requêteur dynamique fourni en exemple avec Visual Studio 2008, nous allons essayer de remplir les propriétés d'un ensemble d'objets à partir des données d'un fichier CSV. Nous enrichirons aussi le parseur de nos propres fonctions.
par Frédéric Mélantois posté le 17/05/2008 à 11:41, lu 1713 fois, #0
Comment manipuler simplement le contenu d'un fichier WordML ?
  Manipulations autour du format WordML
par Fabien Reinle posté le 14/05/2008 à 23:55, lu 781 fois, #0
Polymorphisme et contrats de données WCF
  WCF aborde les types polymorphes du point de vue de la sérialisation. En effet, la connaissance du type réel potentiel est rendue nécessaire dès la description du contrat de données. Une fois n'est pas coutume, j'ai réalisé l'exemple en VB.NET.
par Frédéric Colin posté le 14/05/2008 à 08:40, lu 1881 fois, #2
A la découverte de BizTalk Server 2006 3/3
  Développer un assembleur pour BizTalk Server 2006 R2
par Kader Yildirim posté le 06/05/2008 à 13:20, lu 511 fois, #0

 Dernières Actualités      

Deep Earth – Une belle utilisation de Virtual Earth et de Silverlight Deep Zoom
  Ce projet très intéressant est disponible sur Codeplex et vous pouvez voir une démo sur la page suivante . Bien entendu comme touts les projets sur Codeplex vous avez accès aux sources....
Tags: Silverlight
Sortie de JetBrains ReSharper 4.0 en version finale, l’outil ultime pour Visual Studio
  Après plusieurs mois de Early Access Program (EAP) , JetBrains met enfin à disposition la version finale de son outil ReSharper 4.0 . Cette nouvelle version est disponible pour Visual Studio 2005 &...
Tags: Visual Studio 2008, Visual Studio 2005, Outils
BoutDuTunnel v1.4
  BoutDuTunnel est un petit logiciel de tunneling réseau écrit en C#. Il permet par exemple d’accéder aux services ftp/smtp/pop/telnet/nntp/… sur des réseaux qui n’autorisent...
BI Framework & sample sur CodePlex
  Après plusieurs demandes, je me suis décidé à déposer l'ensemble des sources et du BI Framework MS proposés dans mes articles sur codeplex : http://www.codeplex.com/BILAB Je le mettrais à jour au fil des...
Injection de code et API de profiling .NET
  Si vous êtes intéressés par la sécurité du Framework, par le reverse engineering et la manipulation/injection de code .NET et les packers, alors jetez un coup d’œil...
NDepend pour l'analyse statique de code .NET
  Pour ceux qui ne connaissent pas NDepend , il s’agit d’un outil d’analyse statique de code .NET qui permet de remonter des informations à toute une équipe de développement. NDepend aide à travailler sur...
Tags: Outils