环境:
<siteMapNode url="~/Default.aspx" title="首页">
  <siteMapNode url="~/Test.aspx?Action=1" title="新增" />
</siteMapNode>Test.aspx页面中有一个SiteMapPath。1、访问Test.aspx?Action=1时可以正常显示,如下
首页 > 新增
2、访问Test.aspx?Action=2&ID=42时无法显示。问题:ID是动态的,怎么让SiteMapPath正常显示出来?
搜索到过很多文章,都是讲控制转发的,没有涉及到这个,有懂的不?

解决方案 »

  1.   

    SiteMap是配置文件 的形式,不能动态改变的呀,建议写到程序里面吧
      

  2.   

    程序里如何动态设置?我用了MasterPage,哎,郁闷死了。
      

  3.   

    why not you just use  <siteMapNode url="~/Test.aspx" title="新增" />??if your Test.aspx means to do a lot of different things depending on Action querystring, then you should consider to use different pagesor you can always add nodes dynamically, seehttp://msdn2.microsoft.com/en-us/library/system.web.ui.webcontrols.sitemappath.onitemcreated(VS.80).aspx
      

  4.   

    To saucer(思归)表里有那么多数据,我不可能只要ID不同就做张页子吧。例如一张人员表,我要在后台编辑这些人员。我怎么写呢?<siteMapNode url="~/Edit.aspx?ID=1" title="编辑A君" />
    <siteMapNode url="~/Edit.aspx?ID=2" title="编辑B君" />
    <siteMapNode url="~/Edit.aspx?ID=3" title="编辑C君" />
    只写~/Edit.aspx又没参数……
    写了参数SiteMapPath就失效………………
    我先看你给的文章去。
      

  5.   

    <siteMapNode url="~/Test.aspx" title="新增" />
     <asp:SiteMapPath ID="SiteMapPath1" runat="server" OnItemCreated="SiteMapPath1_ItemCreated">
        </asp:SiteMapPath>
    protected void SiteMapPath1_ItemCreated(object sender, SiteMapNodeItemEventArgs e)
        {
            if (e.Item.ItemType == SiteMapNodeItemType.Current)
            {
                Literal l = e.Item.Controls[0] as Literal;
                if (l != null)
                    l.Text += "A君"; //use the username you are currently editing
            }
        }
      

  6.   

    好用,是我没说清楚,再补充下,我同时在左边的框架页里用了一个TreeView由于
    <siteMapNode url="~/Edit.aspx" title="编辑人员" />
    所以在树上还是把这个节点显示出来了,点了后右边的框架里的Edit.aspx没有参数,无法确定编辑哪一个人。
    我变改了一下
    <siteMapNode url="~/Edit.aspx" title="编辑人员" show="false" />然后protected void treeMenu_TreeNodeDataBound(object sender, TreeNodeEventArgs e)
    {
      SiteMapNode node = (SiteMapNode)e.Node.DataItem;
      if (node["show"] != null && node["show"].ToLower() == "false")
      {
        this.treeMenu.Nodes.Remove(e.Node);
      }
    }
    根节点可以删掉,但是其他节点删不掉……于是我想用roles这个属性来限制他显示,我设置了securityTrimmingEnabled="true",然后<siteMapNode url="~/Edit.aspx" title="编辑人员" roles="乱设一个角色" />但是为什么TreeView上还是显示出来了这个节点。起不到按角色限制访问作用呢?
      

  7.   

    关于删不掉我知道了,糊涂了。那为什么securityTrimmingEnabled会无效呢?
      

  8.   

    最根本的办法,就是UrlRewrite和自己提供DataSource,呵呵……首先,要靠UrlRewrite把你的QueryString部分置入Path部分里面,这样SiteMap有关控件才会把两个不同的人的页面识别为两个URL。然后就是自己提供DataSource。SiteMapDataSource提供的DataSet是否和XmlDataSource差不多我没研究过,但是要自定义动态SiteMap完全可以通过自定义DataSource实现。你要研究下SiteMapDataSource提供的DataSet的形式,然后你自己实现一个DataSource从数据库里按你的方式提供SiteMap数据给SiteMap有关的控件就可以了。
      

  9.   

    好的,我会试试看。现在新问题是为什么无法在SiteMap文件上设置角色限定TreeView的节点显示,设置了Roles后不是那个角色的会员还是能看到。
      

  10.   

    其实也不用管SiteMap的DataSet格式,你自己实现一个SiteMapProvider类,然后该类通过Membership和Roles进行特定的校验和输出就行了。
      

  11.   

    刚刚实际用了一下SiteMapProvider。例如你有一个固定的具体SiteMap吧,用web.sitemap描述,然后Product下面的项目应该由数据库提供,那么你就在web.sitemap中写一个这个:
    <siteMapNode provider="ProductSiteMapProvider" />
    然后,你要有一个MyProductSiteMapProvider,并且在web.config中也注明SiteMapProvider中有一个name="ProductionSiteMapProvider"的指向MyNamespace.MyProductSiteMapProvider,这样这个节点以内的SiteMap就由MyProductSiteMapProvider实现了。详细你看MSDN关于SiteMapProvider的说明。注意SiteMap本身或者SiteMap相关控件可是有Cache功能的,所以你的SiteMapProvider不能太过“动态”,否则会不准确。