C# MvcSitemapProvider参数有时有效有时无效

C# MvcSitemapProvider参数有时有效有时无效,c#,asp.net-mvc,asp.net-mvc-4,mvcsitemapprovider,C#,Asp.net Mvc,Asp.net Mvc 4,Mvcsitemapprovider,我正在MVC4应用程序中使用MvcSitemapProvider。我的controlleractions需要参数来解析数据库中的1:n关系。例如:商店>商品>项目详细信息。假设用户查看ItemXYZ的详细信息并单击Shop>Item>ItemDetails,我希望应用程序再次显示ItemXYZ。因此MvcSitemapProvider必须存储itemID。奇怪的行为是,当我更改任何代码时,运行它->它可以工作。如果我停止它,重新启动它(使用完全相同的代码),它将不工作。如果我再次更改任何代码->

我正在MVC4应用程序中使用MvcSitemapProvider。我的controlleractions需要参数来解析数据库中的1:n关系。例如:商店>商品>项目详细信息。假设用户查看ItemXYZ的详细信息并单击Shop>Item>ItemDetails,我希望应用程序再次显示ItemXYZ。因此MvcSitemapProvider必须存储itemID。奇怪的行为是,当我更改任何代码时,运行它->它可以工作。如果我停止它,重新启动它(使用完全相同的代码),它将不工作。如果我再次更改任何代码->它将再次工作。那怎么可能呢。这是我的站点地图配置:

<?xml version="1.0" encoding="utf-8" ?>
<mvcSiteMap xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
            xmlns="http://mvcsitemap.codeplex.com/schemas/MvcSiteMap-File-4.0"
            xsi:schemaLocation="http://mvcsitemap.codeplex.com/schemas/MvcSiteMap-File-4.0 MvcSiteMapSchema.xsd">

  <mvcSiteMapNode title="Werk" controller="Settlement" action="Index">
    <mvcSiteMapNode title="Abteilung" controller="Section" action="Index" preservedRouteParameters="settlementID" inheritedRouteParameters="settlementID">
      <mvcSiteMapNode title="Maschine" controller="Machine" action="Index" preservedRouteParameters="sectionID" inheritedRouteParameters="sectionID"/>
    </mvcSiteMapNode>
  </mvcSiteMapNode>

</mvcSiteMap>
这是一个工作代码,除非我不重新启动应用程序。如果我重新启动应用程序,它将不工作。但如果我对[SiteMapPreserveRouteData]属性进行注释,它将再次起作用。因此,我重新启动应用程序,不再工作->取消对该属性的注释,它将再次工作,直到我重新启动它

那怎么可能呢

编辑:
它与更改代码无关。当我在VisualStudio菜单中选择“重建”时,它会工作。如果没有,它将无法工作两次。

我不确定您正在执行的示例,但此配置存在一些问题:

  • inheritedRouteParameters用于从父节点(MVCSItemaNode)继承参数。您的示例显示,沉降器是SectionController的一部分,而不是沉降器控制器,因此无需继承它
  • 您同时使用的是PreservedOuteParameters和SiteMapPreservedRoutedataAttribute。这些不意味着要同时使用
  • 另外,请确保您拥有最新版本(目前为4.0.6),因为自正式发布以来,已经有一些节点匹配的错误修复

    如果您修复了这些问题,但仍然存在问题,请创建一个小的演示项目,复制该行为,然后将其发布到GitHub或zip上,并提供下载,然后发布演示的位置,以便我们查看

    更新

    我重读了你的问题,注意到你正试图显示数据库中的产品。只有在基于数据库数据列表或表进行导航时,使用PreservedOutParameters才对SiteMapPath(面包屑)HTML帮助器有用。它用于通过从当前HTTP请求复制参数值来强制每个id与单个节点匹配

    但是,除非每个产品的站点地图中都添加了实际节点,否则您将无法在其他HTML帮助程序(如菜单或站点地图)中查看它们,更重要的是,它们不会出现在搜索引擎的
    /sitemaps.xml
    端点中


    我猜您希望在搜索引擎中为您的产品编制索引,因此我建议您改为使用将节点从数据库加载到站点地图中。这将把它们都存储在一个共享缓存中,因此它非常高效,而且它们不会在请求之间被“遗忘”。只需确保使用node.RouteValues.Add(“id”,product.id)设置每个产品的id,这样就有了一个唯一的id来进行匹配。

    我不确定您遵循的示例,但此配置存在一些问题:

  • inheritedRouteParameters用于从父节点(MVCSItemaNode)继承参数。您的示例显示,沉降器是SectionController的一部分,而不是沉降器控制器,因此无需继承它
  • 您同时使用的是PreservedOuteParameters和SiteMapPreservedRoutedataAttribute。这些不意味着要同时使用
  • 另外,请确保您拥有最新版本(目前为4.0.6),因为自正式发布以来,已经有一些节点匹配的错误修复

    如果您修复了这些问题,但仍然存在问题,请创建一个小的演示项目,复制该行为,然后将其发布到GitHub或zip上,并提供下载,然后发布演示的位置,以便我们查看

    更新

    我重读了你的问题,注意到你正试图显示数据库中的产品。只有在基于数据库数据列表或表进行导航时,使用PreservedOutParameters才对SiteMapPath(面包屑)HTML帮助器有用。它用于通过从当前HTTP请求复制参数值来强制每个id与单个节点匹配

    但是,除非每个产品的站点地图中都添加了实际节点,否则您将无法在其他HTML帮助程序(如菜单或站点地图)中查看它们,更重要的是,它们不会出现在搜索引擎的
    /sitemaps.xml
    端点中


    我猜您希望在搜索引擎中为您的产品编制索引,因此我建议您改为使用将节点从数据库加载到站点地图中。这将把它们都存储在一个共享缓存中,因此它非常高效,而且它们不会在请求之间被“遗忘”。只需确保使用node.RouteValues.Add(“id”,product.id)设置每个产品的id,这样就有了一个唯一的id来进行匹配。

    我遇到了类似的情况。我必须做两件事:

  • 在子节点的
    preservedLoteParameters
    属性中指定父节点项的
    settlementID
    路由参数。根据inheritedRouteParameters,以下参数不够:

    <mvcSiteMapNode title="Maschine" controller="Machine" action="Index" preservedRouteParameters="settlementID,sectionID"/>
    

  • 希望这有帮助…

    我遇到了这样的事情。我必须做两件事:

  • 在子节点的
    preservedLoteParameters
    属性中指定父节点项的
    settlementID
    路由参数。根据inheritedRouteParameters,以下参数不够:

    <mvcSiteMapNode title="Maschine" controller="Machine" action="Index" preservedRouteParameters="settlementID,sectionID"/>
    

  • 希望这有帮助……

    我已经解决了这个问题,但仍然有完全相同的行为。如果我选择“重建”,它将工作一次@夜猫子888哦,我是usi
    public ActionResult Index(int settlementID, int sectionID)
    {
        //....
    }