Avatar billede dennisjuul Nybegynder
30. januar 2007 - 11:15 Der er 17 kommentarer og
2 løsninger

Opsplittet menustruktur i VS 2005

Hej.

Er der nogen der ved hvordan man kan opsplitte en menu fra en sitemap-fil i tre menu'er?

Jeg vil gerne have vist første niveau i den første menu, det andet niveau i den anden og niveau tre og fremefter i den tredje.

Jeg har oprettet tre SiteMapDataSource'er og knyttet dem til hver deres Menu-kontrol.

I den første menu, er visningen korrekt, men i de to andre går det galt.

Dennis
Avatar billede dr_chaos Nybegynder
30. januar 2007 - 11:40 #1
hvorfor henter du ikke alle 3 niveauer via en SiteMapDataSource ?
Avatar billede dennisjuul Nybegynder
30. januar 2007 - 11:53 #2
Mener du at jeg kan tilknytte den samme SiteMapDataSource til alle tre Menu-kontroller?

Dennis
Avatar billede dr_chaos Nybegynder
30. januar 2007 - 11:59 #3
Prøv lige at vise mig din kode.
Avatar billede dennisjuul Nybegynder
30. januar 2007 - 12:44 #4
Der er egentlig ikke noget videre kode. Jeg har oprettet en sitemap-fil og fyldt lidt testdata i den. I web-config er den sat som default-provider.

På min Masterpage har jeg trukket tre Menu-kontroller ind (med tilhørende SiteMapDatasource'er) og i første omgang knyttet dem sammen i tre par.

I hver SiteMapDatasource har jeg prøvet mig lidt frem med indstillingerne:
- StartFromCurrentNode
- StartingNodeOffset

Dennis
Avatar billede dr_chaos Nybegynder
30. januar 2007 - 14:11 #5
Jeg skal bruge din code fra både aspx og codebehind samt hvordan dine sitemap filer ser ud.
Avatar billede dennisjuul Nybegynder
30. januar 2007 - 14:40 #6
Web.sitemap:

<?xml version="1.0" encoding="utf-8" ?>
<siteMap xmlns="http://schemas.microsoft.com/AspNet/SiteMap-File-1.0" >
  <siteMapNode url="~/default.aspx" title="Forside"  description="">
    <siteMapNode url="~/test1.aspx" title="Test1" description="" >
      <siteMapNode url="~/test2.aspx" title="Test2" description="" >
        <siteMapNode url="~/test3.aspx" title="Test3" description="" >
          <siteMapNode url="~/test4.aspx" title="Test4" description="" />
        </siteMapNode>
      </siteMapNode>
    </siteMapNode>
  </siteMapNode>
</siteMap>

AppMaster.master
<%@ Master Language="C#" AutoEventWireup="true" CodeFile="AppMaster.master.cs" Inherits="AppMaster" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="da" xml:lang="da">
<head runat="server">
    <title>TITLE</title>
    <!--[if IE 5]>
    <style type="text/css">       
        .sidebarcontainer td, .sidebarcontainer tr {font-size:smaller;}       
        #subnav a {height:1em;}
        body td, body th {font-size:0.78em;}       
    </style>
    <![endif]-->
    <!--[if IE 7]>
    <style type="text/css">               
      #rightcolumn{margin-right: -152px;}
    </style>
    <![endif]-->   
</head>
<body>
    <form id="mainForm" runat="server">
        <div id="wrapper">
            <div id="mainnav">
                <asp:SiteMapDataSource runat="server" ID="sitemap" />
                <asp:Menu DataSourceID="sitemap" ID="mainmenu" SkinID="mainmenu" runat="server" OnMenuItemDataBound="MainMenu_MenuItemDataBound" Width="10px" />
            </div>
            <div id="subnav1">
                <asp:SiteMapDataSource ID="subnav1SiteMap" runat="server" ShowStartingNode="False" StartingNodeOffset="1" />
                <asp:Menu DataSourceID="subnav1SiteMap" ID="subMenu1" runat="server" Orientation="Horizontal" SkinID="subMenu1" />
            </div>
            <div id="headerimg">
                <table border="0">
                    <tr>
                        <td>
                            <img src="main_page_teaser_left.gif" align="top" /><img src="baggrund.bmp" align="top" />
                        </td>
                    </tr>
                </table></div>
            <div id="header">
                <asp:ContentPlaceHolder runat="server" ID="top">
                </asp:ContentPlaceHolder>
            </div>   
            <div id="contentwrapper">
                <div id="floatwrapper">
                    <!-- brødkrumme -->
                    <div id="centercolumn">
                        <div id="breadcrumbs">
                            <asp:SiteMapPath runat="server" ID="smPath" />
                        </div>
                        <!-- indholdsrude -->
                        <div id="copy">
                            <asp:ContentPlaceHolder runat="server" ID="mainCopy">
                                <%-- Main page content goes here. Create a single
                                content box by wrapping everything in one
                                <div class="container"> or create multiple boxes
                                as needed. See the sample homepage for a
                                demonstration.
                               
                                This is the general structure:
                                <div class="container">
                                    <h1>Headline</h1>
                                    <p class="teaser">Teaser text</p>
                                    <p>Regular text and other markup.</p>
                                </div>                               
                                --%>                               
                            </asp:ContentPlaceHolder>
                        </div>
                    </div>
                    <!-- venstre kolonne -->
                    <div id="leftcolumn">
                        <div id="leftcolcontainer">
                            <div id="subnav">   
                                <asp:SiteMapDataSource runat="server" ID="subnavSitemap" StartingNodeOffset="2" ShowStartingNode="False" />                           
                                <asp:Menu runat="server" ID="subMenu" SkinID="subMenu" DataSourceID="subnavSitemap" />
                            </div>
                            <asp:ContentPlaceHolder ID="leftColumn" runat="server" Visible="true">
                                <%-- Left sidebar content placeholder. Again the
                                individual boxes are created by using a <div> and
                                assigning a class to it: 'sidebarcontainer'.
                                Follow the structure of the sample content below:
                               
                                <div class="sidebarcontainer">
                                    <h4>Headline</h4>
                                    <p>Content</p>
                                </div>                               
                                --%>
                               
                                <!--div class="sidebarcontainer">
                                    <%-- Kontrol eller lign. --%>
                                </div-->                       
                            </asp:ContentPlaceHolder>
                        </div>
                    </div>
                </div>
                <!-- højre kolonne -->
                <div id="rightcolumn">
                    <div id="rightcolcontainer">
                        <asp:ContentPlaceHolder ID="rightColumn" runat="server">
                            <%-- Right sidebar content placeholder. Again the
                                individual boxes are created by using a <div> and
                                assigning a class to it: 'sidebarcontainer'.
                                Follow the structure of the sample content below:
                               
                                <div class="sidebarcontainer">
                                    <h4>Headline</h4>
                                    <p>Content</p>
                                </div>                               
                                --%>
                            <div class="sidebarcontainer">
                                <h3>Nyheder</h3>
                                <b>10. januar 2007</b><br />
                                tekst...<br />
                                <img src="images/link-arrow-dbl-red.gif" />&nbsp;<span style="color:#C30F10;">Læs mere</span>
                                <br /><br />
                                <b>12. januar 2007</b><br />
                                tekst...<br />
                                <img src="images/link-arrow-dbl-red.gif" />&nbsp;<span style="color:#C30F10;">Læs mere</span>
                                <br /><br />
                                <b>16. januar 2007</b><br />
                                tekst...<br />
                                <img src="images/link-arrow-dbl-red.gif" />&nbsp;<span style="color:#C30F10;">Læs mere</span>
                            </div>
                        </asp:ContentPlaceHolder>
                    </div>
                </div>
                <!-- bund (under indholdsrude) -->
                <div id="footer">
                    &copy; Alle rettigheder forbeholdes.
                </div>
            </div>
        </div>
    </form>
</body>
</html>

AppMaster.master (Codebehind):
using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;

public partial class AppMaster : System.Web.UI.MasterPage
{
    /// <summary>
    /// Event handler that highlights the top level menu section for all
    /// sections and pages below it.
    /// </summary>
    protected void MainMenu_MenuItemDataBound(Object sender, MenuEventArgs e)
    {
        if (mainmenu.SelectedItem == null)
        {
            if (IsNodeAncestor((SiteMapNode)e.Item.DataItem, SiteMap.CurrentNode))
                e.Item.Selected = true;
        }
    }

    /// <summary>
    /// Determines if a <see cref="System.Web.SiteMapNode"/> is the ancestor of a second one.
    /// </summary>
    /// <param name="ancestor">The <see cref="System.Web.SiteMapNode"/> in question.</param>
    /// <param name="child">A <see cref="System.Web.SiteMapNode"/> which may or may not be
    /// the <paramref name="ancestor"/>'s child.</param>
    /// <returns><c>true</c>, if the two nodes are related, <c>false</c> otherwise.</returns>
    private bool IsNodeAncestor(SiteMapNode ancestor, SiteMapNode child)
    {
        bool result = false;

        if (ancestor.ChildNodes != null && ancestor.ChildNodes.Contains(child))
            return true;
        else
        {
            if (child.ParentNode != null && ancestor != child.RootNode)
            {
                return IsNodeAncestor(ancestor, child.ParentNode);
            }
        }

        return result;
    }
}
Avatar billede dr_chaos Nybegynder
30. januar 2007 - 14:47 #7
skal din menu fungerer lige som et treeview ?
Avatar billede dennisjuul Nybegynder
30. januar 2007 - 15:06 #8
På en måde, ja.

Det første niveau (dvs. forside og test1), skal vises i 'mainmenu', test2 (og andre på samme niveau) skal vises i 'subMenu1' og test3 (samt alle underliggende niveau'er) skal vises i 'subMenu'.

Der vil være flere items på niveau med test1.

Dennis
Avatar billede dr_chaos Nybegynder
30. januar 2007 - 15:08 #9
Et lille eksempel på en opdateret sitemap fil.
<siteMap xmlns="http://schemas.microsoft.com/AspNet/SiteMap-File-1.0" >
  <siteMapNode url="~/default.aspx" title="Forside"  description="">
    <siteMapNode url="~/test1.aspx" title="Test1" description="" >
      <siteMapNode url="~/test2.aspx" title="Test2" description="" >
        <siteMapNode url="~/test3.aspx" title="Test3" description="" >
          <siteMapNode url="~/test4.aspx" title="Test4" description="" />
        </siteMapNode>
<siteMapNode url="~/test4.aspx" title="Test4" description="" />
        <siteMapNode url="~/test4.aspx" title="Test4" description="" />
        </siteMapNode>
</siteMapNode>
      </siteMapNode>
<siteMapNode url="~/test4.aspx" title="Test4" description="" />
        <siteMapNode url="~/test4.aspx" title="Test4" description="" />
        </siteMapNode>
</siteMapNode>
    </siteMapNode>
<siteMapNode url="~/test4.aspx" title="Test4" description="" />
<siteMapNode url="~/test4.aspx" title="Test4" description="" />
        <siteMapNode url="~/test4.aspx" title="Test4" description="" />
        </siteMapNode>
</siteMapNode>       
</siteMapNode>
  </siteMapNode>
Avatar billede dennisjuul Nybegynder
30. januar 2007 - 15:21 #10
Så vidt jeg kan se, har du der flere 'noder' på øverste niveau (som 'Forside' er), det går vist ikke.

Dennis
Avatar billede dr_chaos Nybegynder
30. januar 2007 - 16:21 #11
DU har helt ret.
Denne her er testet:
<?xml version="1.0" encoding="utf-8" ?>
<siteMap xmlns="http://schemas.microsoft.com/AspNet/SiteMap-File-1.0" >
  <siteMapNode url="~/default.aspx" title="Forside"  description="">
    <siteMapNode url="~/test1.aspx" title="Test1" description="" >
      <siteMapNode url="~/test2.aspx" title="Test2" description="" >
        <siteMapNode url="~/test3.aspx" title="Test3" description="" >
          <siteMapNode url="~/test41.aspx" title="Test4" description="" />
        </siteMapNode>
        <siteMapNode url="~/test42.aspx" title="Test4" description="" />
        <siteMapNode url="~/test43.aspx" title="Test4" description="" />
      </siteMapNode>
    </siteMapNode>
    <siteMapNode url="~/test4211.aspx" title="Test4" description="" >
      <siteMapNode url="~/test4212.aspx" title="Test4" description="" >
        <siteMapNode url="~/test4241.aspx" title="Test4" description="" >
        </siteMapNode>
      </siteMapNode>
      <siteMapNode url="~/test4251.aspx" title="Test4" description="" >
      </siteMapNode>
    </siteMapNode>
    <siteMapNode url="~/test4261.aspx" title="Test4" description="" >
    </siteMapNode>
    <siteMapNode url="~/test43221.aspx" title="Test4" description="" >
      <siteMapNode url="~/test43421.aspx" title="Test4" description="" >
        <siteMapNode url="~/test43251.aspx" title="Test4" description="" >
        </siteMapNode>
      </siteMapNode>
    </siteMapNode>
  </siteMapNode>
</siteMap>
Avatar billede dr_chaos Nybegynder
30. januar 2007 - 16:21 #12
Med denne her:
<asp:SiteMapDataSource ID="testmap" ShowStartingNode="true" runat="server" />
                        <asp:TreeView ID="test" runat="server" DataSourceID="testmap"></asp:TreeView>
Avatar billede dennisjuul Nybegynder
30. januar 2007 - 20:21 #13
Takker for dit eksempel, men navigationen skal stadig være via Menu-kontrollen, da det er en del af sidens layout.

Dennis
Avatar billede dr_chaos Nybegynder
30. januar 2007 - 22:21 #14
du skal bare gøre sådan her:
<asp:SiteMapDataSource ID="testmap" ShowStartingNode="true" runat="server" />
                        <asp:Menu DataSourceID="testmap" ID="mainmenu" runat="server" Width="10px" />
Avatar billede dennisjuul Nybegynder
31. januar 2007 - 07:23 #15
Som du kan se i mit eksempel, benytter jeg der tre Menu-kontroller (ikke kun én), og det er dem der skal koordineres til at vise menu-strukturen korrekt.

Dennis
Avatar billede dr_chaos Nybegynder
02. februar 2007 - 10:44 #16
du skal nok prøve at kigge på sql sitemap provider.:
http://msdn.microsoft.com/msdnmag/issues/06/02/WickedCode/
Avatar billede dennisjuul Nybegynder
05. juni 2007 - 14:37 #17
Til dr_chaos,

Det ovenstående problem er ikke længere aktuelt, men jeg vil gerne give dig 50 point som tak for din hjælp. Så hvis du lige vil smide et svar.
Avatar billede dr_chaos Nybegynder
06. juni 2007 - 20:30 #18
svar :)
Avatar billede dennisjuul Nybegynder
07. juni 2007 - 07:26 #19
svar
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester