对于MvcSiteMapProvide中的所有节点,可选参数“Id”是相同的

时间:2016-08-28 07:33:21

标签: mvcsitemapprovider asp.net-mvc-sitemap

以下是我的站点地图代码:

<mvcSiteMapNode title="Partner" controller="Partner" key="Partner" action="ShowPartners" >
  <mvcSiteMapNode title="ISP" controller="ISP" key="ISP"  action="ShowPartnersIsps" preservedRouteParameters="Id" >
    <mvcSiteMapNode title="Operator" controller="Operator" key="Operator"  action="ShowIspsOperators" preservedRouteParameters="Id" >
      <mvcSiteMapNode title="Subscriber" controller="Subscriber" key="Subscriber"  action="ShowOperatorsSubscribers" preservedRouteParameters="Id" >
        <mvcSiteMapNode title="Router" controller="Router" key="Router"  action="ShowSubscribersRouters" preservedRouteParameters="Id" />
      </mvcSiteMapNode>
    </mvcSiteMapNode>
  </mvcSiteMapNode>
</mvcSiteMapNode>

以下是我的route.config

        routes.MapRoute(
            "GetPartnerRoute",
            "Partner/ShowPartners/{search}",
            new { controller = "Partner", action = "ShowPartners", Search = UrlParameter.Optional }
        );

        routes.MapRoute(
          "GetISPRoute",
             "ISP/ShowPartnersIsps/{Id}/{Search}",
            new { controller = "ISP", action = "ShowPartnersIsps", Id = UrlParameter.Optional, Search = UrlParameter.Optional }
        );

        routes.MapRoute(
            "GetOperatorRoute",
            "Operator/ShowIspsOperators/{Id}/{Search}",
            new { controller = "Operator", action = "ShowIspsOperators", Id = UrlParameter.Optional, Search = UrlParameter.Optional }
        );

        routes.MapRoute(
            "GetSubscriberRoute",
            "Subscriber/ShowOperatorsSubscribers/{Id}/{Search}",
            new { controller = "Subscriber", action = "ShowOperatorsSubscribers", Id = UrlParameter.Optional, Search = UrlParameter.Optional }
        );

        routes.MapRoute(
            "GetRouterRoute",
            "Router/ShowSubscribersRouters/{Id}/{Search}",
            new { controller = "Router", action = "ShowSubscribersRouters", Id = UrlParameter.Optional, Search = UrlParameter.Optional }
        );

所有节点的id参数都不相同。

在上述情况中。

每个节点都有不同的“Id”值。每个节点都不相似。通过重命名“Id”,我可以达到我的预期。但我不能改变“Id”的名称。 所以当我去具有参数“Id”的子节点时,它设置与其父节点类似的值。

以下是我检查后的代码:

主页          &GT;

    <a href="/Partner/ShowPartners" title="Partner">Partner</a>
     &gt; 

    <a href="/ISP/ShowPartnersIsps/268e4984-0923-4db7-8dd3-78564663e4d1" title="ISP">ISP</a>
     &gt; 

    <a href="/Operator/ShowIspsOperators/268e4984-0923-4db7-8dd3-78564663e4d1" title="Operator">Operator</a>
     &gt; 

    <a href="/Subscriber/ShowOperatorsSubscribers/268e4984-0923-4db7-8dd3-78564663e4d1" title="Subscriber">Subscriber</a>
     &gt; 

“268e4984-0923-4db7-8dd3-78564663e4d1”对于每个节点都是类似的。哪个应该是不同的。

我怎样才能做到这一点。请帮忙

1 个答案:

答案 0 :(得分:0)

使用preservedRouteParameters时,值为&#34;保留&#34;来自当前请求。根据定义,这意味着路由值只能用于单一目的(尽管该目的可以跨越多个节点)。

有两种方法可以解决这个问题:

  1. 为每个目的使用不同的路线密钥({ispId}{operatorId}等。)
  2. 不使用preservedRouteParameters,而是使用MvcSitemapProvider which expects a unique node per id`的默认行为。您可以使用dynamic node provider建立父子关系。
  3. 第一个选项更具可扩展性。第二个选项为您提供更多控制(但只能扩展到大约10,000个节点)。

    请注意,要使preservedRouteParameters正常工作,您需要将所有祖先的路由值放入当前请求中。因此,例如,必须ispId节点提供Operator。即使您的操作方法可能不需要它,父节点ISP仍然可以正确地构建URL。

    在此处查看这两个选项的演示:https://github.com/NightOwl888/MvcSiteMapProvider-Remember-User-Position