Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

CRAWLABLELINKBUTTON : UPDATEPANEL ET RÉFÉRENCEMENT




Description

L'utilisation des UpdatePanels peut avoir des impacts non négligeable sur le référencement des moteurs de recherche.


Ce contrôle permet de remedier à ce problème. Le CrawlableLinkButton hérite de LinkButton et lui rajoute la propriété NavigateUrl. Son rendu sera alors le suivant :

<a href="navigateurl" onclick="void(__doPostBack(...));return false">...

Ainsi, lorsqu'un utilisateur riche cliquera sur le lien, il fera un postback comme un classique LinkButton, par contre les robots iront référencer la page NavigateUrl. Il vous faudra donc gérer 2 cas : le cas du postback et le cas du classique lien.


Ci-dessous : un exemple d'utilisation de ce contrôle.
 

Source

  • <%@ Page Language="C#" MasterPageFile="~/Master/MasterPage.master" AutoEventWireup="true"
  • CodeFile="temp.aspx.cs" Inherits="temp" Title="Untitled Page" %>
  • <script type="text/C#" runat="server">
  • void Page_Load(Object sender, EventArgs e)
  • {
  • if (!Page.IsPostBack)
  • {
  • BindData();
  • }
  • }
  • private System.Diagnostics.Process _currentProcess;
  • public System.Diagnostics.Process CurrentProcess {
  • get {
  • if (_currentProcess == null) {
  • int pid = -1;
  • if (Page.IsPostBack) {
  • if (ViewState["PID"] != null) {
  • pid = (int)ViewState["PID"];
  • }
  • } else {
  • int.TryParse(Request.QueryString["PID"], out pid);
  • }
  • if (pid > -1) {
  • _currentProcess = Processes.Find(delegate(
  • System.Diagnostics.Process process){
  • return process.Id == pid;
  • });
  • } else {
  • _currentProcess = Processes[0];
  • }
  • }
  • return _currentProcess;
  • }
  • set {
  • ViewState["PID"] = value.Id;
  • _currentProcess = value;
  • }
  • }
  • private static List<System.Diagnostics.Process> _processes;
  • public static List<System.Diagnostics.Process> Processes
  • {
  • get
  • {
  • // Ne faites pas ça, c'est pour l'exemple mais attention
  • // c'est pas thread safe ...
  • if (_processes == null)
  • {
  • _processes = new List<System.Diagnostics.Process>(
  • System.Diagnostics.Process.GetProcesses());
  • }
  • return _processes;
  • }
  • }
  • void gvProcess_SelectedIndexChanged(object sender, EventArgs e)
  • {
  • // ca aussi c'est mal, c'est pour simplifier l'exemple
  • CurrentProcess = Processes[gvProcess.SelectedIndex];
  • }
  • void BindData()
  • {
  • gvProcess.DataSource = Processes;
  • gvProcess.DataBind();
  • }
  • </script>
  • <asp:Content ID="Content1" ContentPlaceHolderID="CPH1" runat="Server">
  • <asp:UpdatePanel runat="server" UpdateMode="Conditional" >
  • <ContentTemplate>
  • <%=CurrentProcess.ProcessName %>
  • </ContentTemplate>
  • <Triggers>
  • <asp:AsyncPostBackTrigger ControlID="gvProcess" />
  • </Triggers>
  • </asp:UpdatePanel>
  • <asp:GridView runat="server" ID="gvProcess" AutoGenerateColumns="false"
  • OnSelectedIndexChanged="gvProcess_SelectedIndexChanged">
  • <Columns>
  • <asp:TemplateField>
  • <ItemTemplate>
  • <cs:CrawlableLinkButton runat="server" CommandName="Select"
  • Text="Select" NavigateUrl='<%# "temp.aspx?PID=" + Eval("id").ToString() %>' />
  • </ItemTemplate>
  • </asp:TemplateField>
  • <asp:BoundField DataField="ProcessName" />
  • <asp:BoundField DataField="VirtualMemorySize" />
  • </Columns>
  • </asp:GridView>
  • </asp:Content>
<%@ Page Language="C#" MasterPageFile="~/Master/MasterPage.master" AutoEventWireup="true"
    CodeFile="temp.aspx.cs" Inherits="temp" Title="Untitled Page" %>

<script type="text/C#" runat="server">

    void Page_Load(Object sender, EventArgs e)
    {
        if (!Page.IsPostBack)
        {
            BindData();
        }
    }

    private System.Diagnostics.Process _currentProcess;
    public System.Diagnostics.Process CurrentProcess {
        get {
            if (_currentProcess == null) {
                int pid = -1;
                if (Page.IsPostBack) {
                    if (ViewState["PID"] != null) {
                        pid = (int)ViewState["PID"];
                    }
                } else {
                    int.TryParse(Request.QueryString["PID"], out pid); 
                }
                if (pid > -1) { 
                    _currentProcess = Processes.Find(delegate(
                            System.Diagnostics.Process process){ 
                        return process.Id == pid;
                    });
                } else {
                    _currentProcess = Processes[0]; 
                }
            }
            return _currentProcess;
        }
        set {
            ViewState["PID"] = value.Id; 
            _currentProcess = value; 
        }
    }

    private static List<System.Diagnostics.Process> _processes;
    public static List<System.Diagnostics.Process> Processes
    {
        get
        {
            // Ne faites pas ça, c'est pour l'exemple mais attention 
            // c'est pas thread safe ...
            if (_processes == null)
            {
                _processes = new List<System.Diagnostics.Process>(
                        System.Diagnostics.Process.GetProcesses());
            }
            return _processes;
        }
    }

    void gvProcess_SelectedIndexChanged(object sender, EventArgs e)
    {
        // ca aussi c'est mal, c'est pour simplifier l'exemple
        CurrentProcess = Processes[gvProcess.SelectedIndex];
    }
    
    void BindData()
    {
        gvProcess.DataSource = Processes;
        gvProcess.DataBind();
    }

</script>

<asp:Content ID="Content1" ContentPlaceHolderID="CPH1" runat="Server">
    <asp:UpdatePanel runat="server" UpdateMode="Conditional" >
        <ContentTemplate>
            <%=CurrentProcess.ProcessName %>
        </ContentTemplate>
        <Triggers>
            <asp:AsyncPostBackTrigger ControlID="gvProcess" />
        </Triggers>
    </asp:UpdatePanel>
    <asp:GridView runat="server" ID="gvProcess" AutoGenerateColumns="false" 
        OnSelectedIndexChanged="gvProcess_SelectedIndexChanged">
        <Columns>
            <asp:TemplateField>
                <ItemTemplate>
                    <cs:CrawlableLinkButton runat="server" CommandName="Select" 
                        Text="Select" NavigateUrl='<%# "temp.aspx?PID=" + Eval("id").ToString() %>' />
                </ItemTemplate>
            </asp:TemplateField>
            <asp:BoundField DataField="ProcessName" />
            <asp:BoundField DataField="VirtualMemorySize" />
        </Columns>
    </asp:GridView>
</asp:Content>

Conclusion

Attention le référencement est un art plus complexe que ça, ce controle permet simplement de rendre référencables les linkbuttons. Il va de soit qu'il faut penser toute l'application pour qu'elle soit référencable et bien réfléchir à comment les robots vont naviguer sur le site.
 

Fichier Zip

Pour les "Membres Club", vous pouvez télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip

Commentaires et avis

signaler à un administrateur
Commentaire de dymsbess le 27/03/2009 07:59:16

Bonjour,

Effectivement, c'est solution qui peut dépanner pas mal de monde. Par contre, j'obtiens l'erreur suivante "Balise server inconnue 'cs:CrawlableLinkButton'.". C'est mal implémenté de mon côté ?

@+.

signaler à un administrateur
Commentaire de dymsbess le 13/06/2009 17:32:05

Finalement, ce sera un lien en javascript qui tient en une ligne avec de la réécriture d'URL derrière :

<a href="pageXY.html" onclick="javascript:FonctionTest('');return false;">Lien</a>

http://www.xoowiki.com/Category/csharp-7.aspx

Ajouter un commentaire

Discussions en rapport avec ce code source dans le forum

ASP et le référencement [ par Thibaut ] J'ai une petite question intéressante :lors d'un référencement, est ce que le robot du moteur de recherche analyse ce qu'il y a entre les balises asp? Bug webcontrol treeview [ par karim ] Bonjour a tous !J'utilise VS.Net version Beta 2.je crée une webform dans laquelle j'ajoute un treeview et un bouton(webcontrols). Je ne rajoute aucun Référencement [ par Benz ] Bonjour,Il semble que la question que je vais poser soit déjà sur le forum, mais elle à du se perdre car elle est restée sans réponse. Je me permet do Référencement site Broadvision [ par tchpub ] Bonjour,j'aimerais avoir des conseils et des liens (genre tutoriels) sur la manière de référencer des sites en Broadvision. Le problème vient du fait Collection de webcontrol en asp.net [ par pascalwick ] voila je suis entrain de developper une dll de traduction qui va traduire une page et tous ses webcontrols.je desire donc faire une boucle pour trouve TABSTRIP : je recherche un exemple ou une aide sur ce webcontrol [ par sehn ] help, je débute en ASP.NET . Je n'arrive pas a le configurer graphiquementSeHN User Webcontrol [ par Mia ] Salut tlmVoilà, je voudrais créer un webcontrol que j'utiliserais dans +ieurs pages. QQun connait'il une adresse avec un bon tutorial en français sur KeyPress event in a WebControl.TextBox [ par sdiacal ] Je voudrais gèrer l'event d'appuyer sur une touche du clavier dans un WebControl.TextBox en .NET C#. J'ai vu qu'il y a un event appellé keyPress pour Modifier un WebControl appartenant à un DataList. [ par tofyz ] Bonjour &#224; tous,Je vais essayer d'&#233;claicir mon propos!Je souhaite afficher, par l'interm&#233;diaire d'un DataList une liste dont chaque lign Référencement objet COM Excel [ par arkele ] Bonjour,j'aimerai faire un export de donn&#233;es pr&#233;sentes dans un datagrid vers excel. J'utilise le code suivant : Dim xlapp As Exc


Nos sponsors

Sondage...

CalendriCode

Juillet 2009
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode

Téléchargements

Comparez les prix Nouvelle version

Photothèque Nouveau !



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,608 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.