TUTORIEL TECHNOS .NET 
ASP/C# : un système de commentaires en XML
Un fichier XML sera préféré à une base Access pour stocker les données. (15/06/2004)

Nous allons ici développer un système de dépôt de commentaires utilisant un fichier XML pour stocker les données plutôt qu'une base comme Access, ce qui nous permet d'utiliser ce script sur un plus grand nombre d'hébergeurs.

Notre script ASP.NET a été réalisé en C# à l'aide Webmatrix. Nous voulons obtenir un fichier XML ayant cette forme :

<?xml version="1.0" standalone="yes"?>
<NewDataSet>
  <Commentaires>
    <Page>Mon Petit Lapin Rose</Page>
    <Nom>jerms92</Nom>
    <Commentaire>kikoo tro kool ton lapin lol biz!!</Commentaire>
    <Date>15/06/2004 16:02</Date>
  </Commentaires>
  <Commentaires>
    <Page>Prosopopée de Fabricius</Page>
    <Nom>Diderot</Nom>
    <Commentaire>Pas d'accord. Toute société est mauvaise, mais toutes les sociétés sont bonnes d'un certain point de vue. Elles sont vivables. DTC LOL!</Commentaire>
    <Date>14/06/2004 18:15</Date>
  </Commentaires>
</NewDataSet>

Ce fichier sera entièrement créé et géré par ASP.

L'interface

Au sein de WebMatrix, nous plaçons un composant graphique DataGrid, deux composants TextBox, un Button et un Label. Ils sont respectivement nommés DataGrid1, TextBoxNom, TextBoxComment, Button1 et Label1. Après un petit travail cosmétique dans Webmatrix, notamment en utilisant quelques div centrées et en retravaillant les couleurs et tailles des éléments, voici notre interface :

...dont voici le code HTML :

<html>
  <head>
  </head>
  <body>
    <form runat="server">
      <div align="center">
        <asp:DataGrid id="DataGrid1" runat="server" ForeColor="Black" CellPadding="3" BackColor="Black" EnableViewState="False" GridLines="None" CellSpacing="1" AutoGenerateColumns="False">
        <HeaderStyle font-bold="True" forecolor="White" backcolor="Black"></HeaderStyle>
        <ItemStyle backcolor="White"></ItemStyle>
        <Columns>
          <asp:BoundColumn DataField="Nom" HeaderText="Nom"></asp:BoundColumn>
          <asp:BoundColumn DataField="Commentaire" HeaderText="Commentaire"></asp:BoundColumn>
          <asp:BoundColumn DataField="Date" HeaderText="Date"></asp:BoundColumn>
        </Columns>
        </asp:DataGrid>
        <asp:Panel id="Panel1" runat="server" Height="263px" Width="280px" align="center">
        Votre Nom:
        <asp:TextBox id="TextBoxNom" runat="server" Width="240px" MaxLength="250"></asp:TextBox>
        <br />
        Votre commentaire:<br />
        <asp:TextBox id="TextBoxComment" runat="server" Height="120px" Width="240px" MaxLength="250" TextMode="MultiLine"></asp:TextBox>
        <br />
        <asp:Button id="Button1" runat="server" Text="Valider"></asp:Button>
        <br />
        <asp:Label id="Label1" runat="server" forecolor="Red" font-bold="True"></asp:Label>
        </asp:Panel>
      </div>
    </form>
  </body>
</html>


Le code
Nous voulons donc qu'il soit possible de laisser un commentaire pour chaque page, et non pour tout le site (auquel cas nous aurions ici affaire à un livre d'or). Pour ce faire, notre formulaire sera accessible depuis un lien en popup partant de chaque page à commenter, ce lien comportant le nom de la page. Nous stockons ce nom dans le XML, et nous en servons pour afficher les commentaires qui y sont attachés.

<a href="comment.aspx?page=Euclide">Voir les commentaires</a>

Notre code doit, à tout chargement de la page, afficher les anciens commentaires et le formulaire. Quand le bouton est cliqué, le même processus se déroule, sauf que l'on sauvegarde le nouveau commentaire dans le fichier XML.

Nous allons donc utiliser l'évènement Page_Load(), au sein duquel nous testerons le clic à l'aide d'un if (IsPostBack == trues), IsPosBack étant une propriété de la page nous renseignant si le chargement se fait suite à un clic (true), ou si elle est chargée pour la première fois (false).

Avant toute chose, il nous faut tester si l'argument Page est bien rempli :

if ( Request.QueryString["page"] != null )

Après quoi nous définissons deux objets DataSet et DataTable, l'un pour gérer le contenu du fichier XML, l'autre pour gérer l'affichage dans notre tableau.
Un premier try..catch nous permet de charger le fichier XML. Si cela réussi, nous remplissons DataTable1 avec son contenu, si cela échoue nous créons tout de même un tableau avec la structure de notre XML.

Si l'utilisateur a effectivement validé le formulaire (if (IsPostBack == true)), nous récupérons ses champs dans une nouvelle ligne du tableau, et nous l'affichons, nous sans avoir effacé les champs avant.

Un nouveau try..catch nous permet ensuite de tenter de sauvegarder notre tableau ainsi augmentée dans notre fichier XML. Si cela échoue, nous affichons une erreur dans Label1.

  Forum

Réagissez dans les forums de JDN Développeurs

Quoiu'il advienne (IsPostBack ou pas), nous finissons par lier le contenu du tableau à celui qui est affiché, en prenant de n'afficher (avec RowFilter) que les lignes de la page demandée.

Voici notre code en entier :

<%@ Page Language="C#" %>
<%@ import Namespace="System.Data" %>
<script runat="server">
void Page_Load(Object sender, EventArgs e)
  {
  if ( Request.QueryString["page"] != null )
    {
    DataSet DataSet1 = new DataSet();
    DataTable DataTable1 = new DataTable();

    try
      {
      DataSet1.ReadXml( HttpContext.Current.Server.MapPath("commentaires.xml"), XmlReadMode.InferSchema);
      DataTable1 = DataSet1.Tables[0];
      }
    catch
      {
      DataTable1 = DataSet1.Tables.Add("Commentaires");
      DataTable1.Columns.Add("Page");
      DataTable1.Columns.Add("Nom");
      DataTable1.Columns.Add("Commentaire");
      DataTable1.Columns.Add("Date");
      }

    if ( IsPostBack == true )
      {
      DataRow ligne = DataTable1.NewRow();
      DateTime todayDate = DateTime.Now;
      ligne[DataTable1.Columns[0].Caption] =       Request.QueryString["page"];
      ligne[DataTable1.Columns[1].Caption] =       Server.HtmlEncode(TextBoxNom.Text);
      ligne[DataTable1.Columns[2].Caption] =       Server.HtmlEncode(TextBoxComment.Text);
      ligne[DataTable1.Columns[3].Caption] = String.Format("{0:g}", todayDate);
      DataTable1.Rows.Add(ligne);
      TextBoxNom.Text = "";
      TextBoxComment.Text = "";

      try
        {
        DataSet1.WriteXml( HttpContext.Current.Server.MapPath("commentaires.xml"));
        }
      catch
        {
        Label1.Text = "Impossible d'enregistrer le commentaire";
        }
      }
    DataView DataView1 = DataSet1.Tables[0].DefaultView;
    DataView1.RowFilter = "Page = '" + Request.QueryString["page"] + "'";
    DataGrid1.DataSource = DataView1;
    DataGrid1.DataBind();
    }
  }

</script>

 
Xavier Borderie, JDN Développeurs
 
Accueil | Haut de page