Créer du code html à partir d'objets

cs_mathmax Messages postés 403 Date d'inscription vendredi 28 octobre 2005 Statut Membre Dernière intervention 31 août 2008 - 27 mai 2007 à 14:43
cs_mathmax Messages postés 403 Date d'inscription vendredi 28 octobre 2005 Statut Membre Dernière intervention 31 août 2008 - 8 juin 2007 à 17:30
Bonjour,


Je cherche en ASP.net le meilleur moyen pour produire du HTML à partir
d'objets. Je crois qu'aucune des solutions actuelle n'est vraiment
satisfaisante :

    - l'utilisation contrôles ASP.net ne permet pas d'avoir le
contrôle sur le HTML produit. L'utilisation des feuilles de styles et la
manipulation du DOM via JavaScript deviennent alors fastidieuses, la seule
solution étant de compiler et exécuter le projet puis de regarder le code source
généré. Bien sûr il y a les CSS friendly adapters, mais leur utilisation
revient à redéfinir les méthodes de rendu des contrôles ce qui n'est vraiment
pas productif. Je pense donc que les contrôles sont réservés à la production de
pages simples ou de formulaire. J'ai par exemple récemment crée cette page
(http://fra.orkos.com/Products/PriceList). Je vois difficilement comment
j'aurais  pu la faire rien qu'avec des contrôle ASP.net...

     - La deuxième solution consiste à construire le code
html dans une variable de type string directement dans le code behind. Cela
permet de résoudre pas mal de problèmes de la solution précédente. On peut
produire exactement le code html que l'on veut et on a la possibilité de le
construire avec toutes les instructions de logique du langage de programmation
(conditions, boucle, appelle de fonction, récursivité,...). Je vois néanmoins
de très gros inconvénients dans l'application de cette méthode :

          - Il n'y a pas d'IntelliSense donc
le code est plus long à écrire et souvent sujet à erreurs. Une balise non
fermée ne sera par exemple détectée qu'à l'exécution.

          - A l'origine le principe du code
behind est là pour permettre une séparation entre la couche de logique et la
couche de présentation. En mettant tout dans le code behind, on casse cette
séparation et on perd la vue d'ensemble que l'on avait sur chacune de ces deux
couches.

    - Une troisième solution consiste à faire un mix des deux
solutions précédentes. Écrire le html dans la page ASPX et utiliser au maximum
les contrôles ASP.net. Quand ce n'est pas possible ou vraiment trop fastidieux,
écrire le code html dans le code behind puis l'insérer dans la page ASPX à
l'aide de la propriété InnerHtml. Je pense que c'est sûrement la solution la
plus mauvaise. Le code HTML se trouve alors à deux endroits différents et l'on
perd complètement la vue d'ensemble sur celui ci. L'étape de construction de la
feuille CSS  ou de manipulation du DOM devient un enfer...

    - Enfin, la dernière solution que je vois et l'utilisation
de feuilles XSLT. Mais comme celle-ci n'est pas applicable sur les objets, il
faut auparavant les sérialiser au format XML. C'est ce que j'ai fais pour créer
ma page (http://fra.orkos.com/Products/PriceList). Je trouve très agréable de bénéficier
d'instructions logiques au format xml (templates, boucle foreach,
conditions,...). Cela permet de les mélanger avec du code XHTML. On bénéficie
ainsi de l'IntelliSense, d'une parfaite séparation entre la logique objet et la
présentation et d'un parfait contrôle sur le html tout en restant productif
grâce à une logique qui permet de factoriser le code. Il y a cependant deux inconvénients
majeurs :

          - l'étape XML est non seulement
inutile mais contre-productive. Il faut faire une sérialisation à chaque fois
que les objets changent.

          - cette méthode ne peut pas
convenir dès que le client souhaite mettre à jour des données.


Pour conclure je dirais que l'idéal serait une sorte de feuille XSLT mais qui
s'applique directement sur les objets. Va-t-il falloir attendre ASP.net 3.0… ?
<!--[if gte vml 1]><v:shapetype id="_x0000_t75" coordsize="21600,21600" o:spt="75"
o:preferrelative="t" path="m@4@5l@4@11@9@11@9@5xe" filled="f" stroked="f">
<v:stroke joinstyle="miter"/>
<v:formulas>
<v:f eqn="if lineDrawn pixelLineWidth 0"/>
<v:f eqn="sum @0 1 0"/>
<v:f eqn="sum 0 0 @1"/>
<v:f eqn="prod @2 1 2"/>
<v:f eqn="prod @3 21600 pixelWidth"/>
<v:f eqn="prod @3 21600 pixelHeight"/>
<v:f eqn="sum @0 0 1"/>
<v:f eqn="prod @6 1 2"/>
<v:f eqn="prod @7 21600 pixelWidth"/>
<v:f eqn="sum @8 21600 0"/>
<v:f eqn="prod @7 21600 pixelHeight"/>
<v:f eqn="sum @10 21600 0"/>
</v:formulas>
<v:path o:extrusionok="f" gradientshapeok="t" o:connecttype="rect"/>
<o:lock v:ext="edit" aspectratio="t"/>
</v:shapetype><v:shape id="_x0000_i1025" type="#_x0000_t75" alt="" style='width:11.25pt;
height:11.25pt'>
<v:imagedata src="file:///C:\DOCUME~1\MAA~1.ORK\LOCALS~1\Temp\msohtml1\01\clip_image001.gif"
o:href="http://www.aspfr.com/imgs2/smile_shy.gif"/>
</v:shape><![endif]--><!--[if !vml]--><!--[endif]-->


Voilà, j'aimerais avoir votre avis sur la question. N'hésitez pas à me faire
part de vos remarques et conseils.


Merci d'avance.







Mathmax

47 réponses

cs_mathmax Messages postés 403 Date d'inscription vendredi 28 octobre 2005 Statut Membre Dernière intervention 31 août 2008
5 juin 2007 à 13:57
Pourquoi, m'envois-tu un lien sur les Css friendly adapters ? Quel est le rapport avec les contrôles génériques ?

Mathmax
0
jesusonline Messages postés 6814 Date d'inscription dimanche 15 décembre 2002 Statut Membre Dernière intervention 13 octobre 2010 29
8 juin 2007 à 14:30
effectivement mon message est pas clair :

les friendly adapters permettent de modifier le rendu html des gridview ce qui te permettra d'avoir un tableau idéal avec toutes les balises nécessaire pour être sémantiquement propre.

<hr />Cyril - MSP - MCTS ASP.net & SQL
0
cs_mathmax Messages postés 403 Date d'inscription vendredi 28 octobre 2005 Statut Membre Dernière intervention 31 août 2008
8 juin 2007 à 15:59
Oui, je connais les Css friendly adapters. Je ne souhaite pas reécrire la methode Render du contrôle gridview car j'ai besoin d'un rendu différent à chaque fois que je l'utilise (une classe sur telle colonne, sur telle ligne, un évenement javascript sur la table...). C'est pour ça que je préfère directement écrire le html avec un repeater. Y a t-il un inconvénient majeur à procéder comme ceci ?
Mathmax
0
jesusonline Messages postés 6814 Date d'inscription dimanche 15 décembre 2002 Statut Membre Dernière intervention 13 octobre 2010 29
8 juin 2007 à 16:31
j'en ai jamais eu besoin.

Si c'est pour rajouter un style css diférrent tu modifie ton fichier css, et si c'est pour du js tu fais un templatecolumns ou sinon tu parcours le dom js

<hr />Cyril - MSP - MCTS ASP.net & SQL
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_mathmax Messages postés 403 Date d'inscription vendredi 28 octobre 2005 Statut Membre Dernière intervention 31 août 2008
8 juin 2007 à 16:55
Pour le css, il faut bien que j'applique des classe à mes colonnes que je veux designer (à moins d'en affecter à toute, mais c'est souvent lourd inutilement.)
Pour le javascript, c'est vrai que je peux ajouter dynamiquement mes évenements. D'autant plus que je viens de découvrir jquery, c'est un régal pour parcourir le DOM...

Mathmax
0
jesusonline Messages postés 6814 Date d'inscription dimanche 15 décembre 2002 Statut Membre Dernière intervention 13 octobre 2010 29
8 juin 2007 à 17:14
css veut dire cascading style sheet, dedans il y a cascade ...

table tr {background-color:#F0F;}

mais en plus tu ne le fais pas dans l'exemple que tu as donné ...

<hr />Cyril - MSP - MCTS ASP.net & SQL
0
cs_mathmax Messages postés 403 Date d'inscription vendredi 28 octobre 2005 Statut Membre Dernière intervention 31 août 2008
8 juin 2007 à 17:30
Si tu veux séléctionner la troisième colonne de la quatrième ligne, tu fais comment sans classe et sans id ? Avec CSS 2.1, je ne crois pas que cela soit possible...

Mathmax
0
Rejoignez-nous