Méthode simple pour identifier un ROBOT sur votre site

public static bool isUserAgent()
        {
            string userAgent = HttpContext.Current.Request.UserAgent.ToLower();
            string[] botKeywords = new string[10]{ "bot", "spider", "google", "yahoo", "search", "crawl", "slurp", "msn", "teoma", "ask.com" };           
            foreach (string bot in botKeywords)
            {
                if (userAgent.Contains(bot))
                {
                    return true;
                }
            }           
            return false;
}

 

Pour vérifier que tout fonctionne, vous pouvez utiliser le plug-in User Agent Switcher de Firefox... Vous pourrez alors vous faire passer pour un robot GOOGLE ou MSN ou autre :)

 

Il existe une façon plus complète pour identifier les robots qui viennent sur le site... Mais le but était d'utiliser une méthode simple et rapide :-)
La méthode plus complète consistera à utiliser Request.Browser.Crawler (qui renverra vrai ou faux pour dire VRAI c'est un Robot ou FAUX c'est un client)
Mais vous devrez définir au préalable une liste descriptive de Browsers dans votre fichier Web.config

Articles complets :
http://www.primaryobjects.com/CMS/Article102.aspx

http://owenbrady.net/browsercaps/

 

Client FTP Web

Ca peut toujours servir ...

Accès FTP en ligne par le Web donc... : http://debug.abaproduction.com

 

(développé en C#) :)

 

Reset environnement Visual Studio

Bon, imaginons que comme moi, pour une raison X ou Y vous avez explosé votre environnement Visual Studio et que franchement c'est la galère pour vous y retrouver dans les fenêtres...

Une solution existe pour TOUT réinitialiser (youkiii)...

Démarrer , Exécuter , taper dans le champ :  "C:\Program Files\Microsoft Visual Studio 8\Common7\IDE\devenv.exe" /resetuserdata

Cliquer sur OK

Redémarrez votre brave Visual Studio...

ATTENTION : même la liste des projets récents aura été vidée... C'est la purge totale ; mais le bonheur de retrouver son environnement tout propre :)

 

Colorisation alternée automatique d'une table

Il est parfois plus lisible d'avoir des tables avec la colorisation alternée des lignes qui la composent...

La GridView permet d'utiliser l'ItemTemplate et l'AlternateItemTemplate mais bon, c'est franchement "lourd" pour pas grand chose qui peut-être fait de manière très simple avec du javascript :-)

Voici le code javascript qui devra être chargé sur les pages... (on pourra le mettre dans une MasterPage)

<script language='javascript' type="text/javascript">
  function alternate(id)
  {
      if (document.getElementsByTagName)
      {
          var table = document.getElementById(id);
          var rows = table.getElementsByTagName("tr");


          for (i = 0; i < rows.length; i++)
          {
              if (rows[i].getElementsByTagName("th").length > 0)
              {
                  rows[i].className = "header";
                  continue;
              }
              if (i % 2 == 0)
              {
                  rows[i].className = "even";
              }
              else
              {
                  rows[i].className = "odd";
              }
          }
      }
  }
</script>

Le javascript ci-dessus va ajouter des class aux éléments TH (Header) et aux éléments TR (lignes) de notre table.
Le header aura la classe "header"
1 ligne sur 2 aura la classe "even" et 1 ligne 2 autre la casse "odd"

Evidemment il faut configurer dans notre CSS les classes header, odd et even . Par exemple :
tr.odd
{
 background-color:#cee3a0; 
}

tr.even
{
 background-color:#82bf4c;
}

tr.header
{
 color:Black;
 background-color:#ffb65b;
}

Voilà pour les fondamentaux !

Maintenant, il vous suffit de faire appel à la méthode javascript "alternate" pour coloriser de manière alternée vos tables !

Exemple avec une GridView :
Soit la page maPage.aspx qui charge la MasterPage.Master contenant le javascript ci-dessus et faisant lien avec le CSS contenant le paramétrage ci-dessus :

<asp:GridView ID="GridViewPays" runat="server" AllowPaging="True" AutoGenerateColumns="False">
        <Columns>
            <asp:BoundField DataField="id" HeaderText="UID" ReadOnly="True" />
            <asp:BoundField DataField="nom" HeaderText="Nom" />
            <asp:BoundField DataField="nom_EN" HeaderText="Nom (english)" />
            <asp:CommandField ShowEditButton="True" />
            <asp:CommandField ShowDeleteButton="True" />
        </Columns>
    </asp:GridView>
    <script language="javascript" type="text/javascript">
        alternate('<%=GridViewPays.ClientID %>');
    </script>

Et c'est terminé ! :)

Simple, pratique, efficace et surtout non invasif.. :) On fait ce qu'on veut, comme on veut !

Vérification W3C de tout un site...

Au lieu de valider page par page, voici une solution toute simple :

http://www.validator.ca

Il suffit alors de passer l'URL du site (exemple : http://www.monsite.com) et c'est parti ! L'outil va vérifier l'intégralité de votre site web, à condition bien entendu que la page d'entrée contienne les liens vers les autres pages à contrôler.

Vous allez ensuite pouvoir facilement voir quelles pages ne sont pas conformes et corriger ce qu'il faut...

Pour information amusante, le fait d'être conforme ou non au règles W3C ne doit pas être un paramètre important pour les moteurs de recherches puisque GOOGLE, BING, YAHOO ne sont pas validés ! :-)

Gestion automatique de plusieurs Web.config dans un même projet

Une fois que vous y aurez goûté... vous ne pourrez plus vous en passer :-)

L'astuce qui est décrite ci-après est désormais appliquée à tous mes projets !

Le but c'est de pouvoir gérer plusieurs Web.Config dans un même projet. En fonction du mode de compilation Debug, Release, Deploy, le Web.config qui va bien sera généré !
En clair plus besoin de bidouiller le Web.config du serveur de prod , du serveur de Dev puisque tout est maintenu dans notre projet ! Le TOP !

Alors comment ça marche ?

1) Ajout de copyifnewer.bat dans nos fichiers de solutions
Avant tout, nous allons ajouter à notre solution le fichier copyifnewer.bat que vous pouvez télécharger là : copyifnewer.bat (415,00 bytes). Ce fichier doit être dans la solution mais n'est pas inclus dans la solution (de sorte qu'il ne soit pas dans le package de livraison final donc)



2) Modification des propriétés du PROJET
Clique droit le nom du projet concerné puis PROPRIETES.
Sélectionner BUILD EVENTS.
Dans PRE-BUILD event, ajouter : "$(ProjectDir)copyifnewer.bat" "$(ProjectDir)web.config.$(ConfigurationName)" "$(ProjectDir)web.config"

3) Création des fichiers de configuration adaptés à la situation
Vous allez pouvoir créer des fichiers Web.config.[nomDeConfiguration]
Exemple : Web.config.Release , Web.config.Debug
Dans ces fichiers qui sont dans votre solution, mais qui sont exclus (de sorte qu'ils ne soient pas dans le package de livraison final), vous allez pouvoir adapter les paramètres en fonction de la situation ! (Debug ou Release)



Lorsque vous lancerez la GENERATION du projet, l'instruction PRE-BUILD event (2) va remplacer le Web.config par le Web.config.[nomDeConfiguration] , exemple, si vous lancez la GENERATION du projet en mode RELEASE c'est le Web.config.Release qui remplacera le Web.config
Si vous lancez le projet en DEBUG, c'est le Web.config.Debug qui remplacera le Web.config

Vous pouvez évidemment ajouter d'autres configurations... Cliquer sur BUILD puis CONFIGURATION MANAGER, dans ACTIVE SOLUTION CONFIGURATION sélectionner NEW et remplissez le nouveau NOM de la configuration (exemple DEPLOY) ; Dans COPY SETTINGS FROM sélectionnez une configuration existante (exemple RELEASE)
Il vous suffira alors de définir un Web.config.Deploy qui contiendra les paramètres de configuration pour ce cas de compilation :-)

 (source : http://www.hanselman.com/blog/default.aspx?date=2007-09-21)

DataView et Delete d'une DataRowView .NET 2.0.xxxxx

Alors voilà une mésaventure pas cool du tout !

Il peut arriver que l'on veuille filtrer certains éléments d'une DataView et que l'on fasse un petit browse de toutes les lignes pour supprimer ce qui ne nous intéresse pas...

Exemple tout simple :

foreach(DataRowView drv in myDataView)
{
   if(drv["champ"].ToString().Equals("pas top"))
   {
       drv.Delete();
    }
}

Vous allez me demander pourquoi ne pas faire un RowFilter, mais c'est simplement pour l'exemple que j'utilise un cas aussi simple... Imaginons donc, que le RowFilter ne puisse pas répondre à notre besoin et que nous devons donc bel et bien supprimer nous même ce qui ne nous intéresse pas...

Donc l'exemple ci-dessus marchera avec un framework 2.0.50727.4200 mais ne marchera pas du tout avec un framework 2.0.50727.832

On aura des messages d'erreurs qui indiqueront que l'élément n'existe plus. Et si comme moi, votre hébergeur ne peut pas mettre à jour la version du Framework, pas d'autre choix que de s'adapter !

il faudra alors ruser en procédant ainsi :

            for (int i = 0; i < myDataView.Count; i++)
            {
                if (myDataView[i]["champ"].ToString().Equals("pas top"))
                {
                    myDataView[i].Row.Delete();
                    i--;
                }
            }

Il fallait commencer par ça quand même !!!

BONNE ANNEE 2010 à tous !

Pace e Salute a tutti !

:)

Mise à jour du moteur de Blog !

Ahhhh, voilà qui devrait donner envie de reprendre les posts... Avec la version 1.5 de BlogEngine on sent quand même que c'est plus complet !

Popup Confirmation Delete sur GridView

Une manière toute simple pour faire en sorte de demander à l'utilisateur de confirmer une demande de Suppression faites en cliquant sur le lien DELETE d'une GridView :

 transformer votre

<asp:CommandField ShowDeleteButton="True" />

 en TemplateField. Vous pouvez le faire très facilement depuis le Designer de Visual Studio ou à la mimine (aussi très rapidement).

En gros votre bouton Delete devient :

<asp:TemplateField ShowHeader="False">
  <ItemTemplate><asp:LinkButton ID="LinkButtonDelete" runat="server" CausesValidation="false" CommandName="Suppr"  Text="Delete"
                                 
CommandArgument='<%#Eval("id") %>' ></asp:LinkButton>
 
</ItemTemplate>
</asp:TemplateField>

Bonne nouvelle :
- vous pouvez passer du coup un CommandArgument (ce qui n'est pas vrai avec un CommandField !)

ATTENTION :
- Si vous indiquez CommandName="Delete" vous allez provoquer un Evenement RowDeleting que vous devrez forcément gérer ! Avec ce que cela implique : pas de CommandArgument disponible dans ce cas. C'est pour cela que je renomme le commandName en Suppr.
- Du coup je gère mon action de suppression dans RowCommand au lieu de RowDeleting. Cela revient au même (sauf que j'ai mon commandArgument).

Mais ce n'est pas le sujet... Nous on voulait faire en sorte que l'utilisateur soit obligé de valider son action. Et donc il suffit d'ajouter :

OnClientClick="return confirm('Are you sure ?');"

ce qui nous donne au final :

<asp:TemplateField ShowHeader="False">
  <ItemTemplate><asp:LinkButton ID="LinkButtonDelete" runat="server" CausesValidation="false" CommandName="Suppr"  Text="Delete"
                                 
CommandArgument='<%#Eval("id") %>' OnClientClick="return confirm('Are you sure ?');"></asp:LinkButton>
 
</ItemTemplate>
</asp:TemplateField>

Trop simple :-)

A propos de l'auteur

 

Développeur depuis plus de 10 ans, j'ai commencé la programmation dès l'âge de 9 ans sur un PC 8088 !!

GW-Basic, Pascal, Turbo Pascal, Delphi ont fait mes bases... Puis Java , bien plus tard... Pour enfin avoir découvert le C#... Quel plaisir de développer avec ce langage des solutions ASP.NET... Le développement Web comme jamais je ne pouvais l'imaginer possible :)

Aujourd'hui titulaire du MCSD VS 6.0, MCAD .NET, et MCT ...

Sur ce blog, je souhaite partager des choses simples mais efficaces... Des problèmes de tous les jours que l'on peut rencontrer et qu'il est simple de régler :)

Mes certifications

Month List