2010-09-21 8 views
4

Je suis en train de créer un plan de site dynamique sur mon site en utilisant SiteMapPath.Construit dynamiquement SiteMapPath dans asp.net

devrait être comme ceci:

Home > Products > %product_name% > Prices 

%product_name% est défini dynamiquement dans le temps d'exécution, selon le choix de l'utilisateur.

J'ai lu beaucoup d'articles sur le thème et choisissez ceci http://harriyott.com/2007/03/adding-dynamic-nodes-to-aspnet-site.aspx. Il modifie dynamiquement le fichier XML web.sitemap. Le problème est qu'il ne construit encore le sitemap qu'une seule fois au début, puis l'utilise sur chaque page.

Comment puis-je faire pour reconstruire sur chaque page chargée?

Répondre

7

Essayez ceci:

Faites un clic droit sur votre projet "Ajouter un nouvel élément" puis choisissez "Plan du site", il aura une structure XML qui ressemble à:

<?xml version="1.0" encoding="utf-8" ?> 

    <siteMap xmlns="http://schemas.microsoft.com/AspNet/SiteMap-File-1.0" > 

     <siteMapNode url="~/Default.aspx" title="Home " description=""> 

     <siteMapNode url="~/the page URL" title="Products" description="" > 

      <siteMapNode url="~/the page URL" title=" %product_name%" description="" > 

       <siteMapNode url="~/the page URL" title="Prices" description="" /> 

      </siteMapNode > 

     </siteMapNode > 

     </siteMapNode > 

    <sitemap> 

** Description ajouter pour chaque noeud est facultatif.

Maintenant, vous devez le placer où vous voulez, si vous ajoutez ce code dans la partie HTML de la page:

<asp:SiteMapPath ID="SiteMapPath1" runat="server"> 

<CurrentNodeStyle CssClass="Some class" /> 

    <PathSeparatorTemplate> 

     <img runat="server" alt="" src="an image to separate between nodes" height="5" width="5" /> 

    </PathSeparatorTemplate> 

</asp:SiteMapPath> 

Bien sûr, vous avez deux pages - un pour le produit et un pour des prix.

Pour affecter une mosaïque dynamiquement à un noeud dans SiteMap; ajoutez ce code dans le prix Page:

1) la charge de la page:

SiteMap.SiteMapResolve += new SiteMapResolveEventHandler(SiteMap_SiteMapResolve); 

2) Ajouter cette fonction dans la même page (page prix):

SiteMapNode SiteMap_SiteMapResolve(object sender, SiteMapResolveEventArgs e) 
{ 
    SiteMapNode currentNode = SiteMap.CurrentNode.Clone(true); 
    SiteMapNode tempNode = currentNode; 

    tempNode.ParentNode.Title = "Change the Product name"; 
    tempNode.ParentNode.Url = "Change the Product url"; 

    return currentNode; 
} 

Comme vous pouvez voyez vous pouvez manipuler le noeud parent comme vous voulez, changer le titre, l'url, etc. Je pense que vous voulez changer l'URL aussi; par exemple: "product.aspx? ID = blah"

+0

dans ce cas, la valeur% product_name% est constante, et j'ai besoin d'être mis dans l'exécution, lorsque les charges Product.aspx et le produit sélectionné est connu – GaGar1n

+1

Quel est le but de tempNode? – mizzle

+0

Qu'en est-il quelque chose comme pour ma question ici: http://stackoverflow.com/questions/26892575/how-to-set-up-a-breadcrumb-in-an-asp-net-page. J'ai le look & feel mis en place et juste besoin d'ajouter un LI à mon UL à chaque fois :) – Si8

1

Excellent! En cas de quelqu'un veut la même chose dans vb est ici le code:

Protected Sub Page_Load(sender As Object, e As System.EventArgs) Handles Me.Load 
    AddHandler SiteMap.SiteMapResolve, AddressOf Me.SiteMap_SiteMapResolve 

End Sub 

Private Function SiteMap_SiteMapResolve(sender As Object, e As SiteMapResolveEventArgs) As SiteMapNode 
    Dim currentNode As SiteMapNode = SiteMap.CurrentNode.Clone(True) 
    Dim tempNode As SiteMapNode = currentNode 

    tempNode.ParentNode.Title = "Change the Product name" 
    tempNode.ParentNode.Url = "Change the Product url" 

    Return currentNode 
End Function