MvcSitemapProvider参数有时有时无效

时间:2013-08-11 16:33:52

标签: c# asp.net-mvc asp.net-mvc-4 mvcsitemapprovider

我在MVC4应用程序中使用MvcSitemapProvider。我的controlleractions需要参数来解决数据库中的1:n关系。例如:商店>项目> ItemDetails。让我们说用户观看ItemXYZ的详细信息并点击Shop> 商品> ItemDetails我希望应用程序再次显示ItemXYZ。所以MvcSitemapProvider必须存储itemID。奇怪的是,当我更改任何代码时,运行它 - >有用。如果我停止它,重新启动它(使用完全相同的代码)它不起作用。如果我再次更改任何代码 - >它又有效了。那怎么可能呢。这是我的sitemap-config:

<?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>

这是一个控制器(看起来完全一样):

public class SectionController : ControllerBase
{
    //
    // GET: /Section/

    [SiteMapPreserveRouteData]
    public ActionResult Index(int settlementID)
    {
        using (var e = new ClapEntities())
        {
            return View(e.Sections.Where(x => x.SettlementID == settlementID).ToList());
        }
    }
}

除非我不重启应用程序,否则这是一个有效的代码。如果我重新启动应用程序它不起作用。但是如果我发表评论, [SiteMapPreserveRouteData] -Attribute它将再次工作。所以我重新启动应用程序,我不再工作 - &gt;取消注释属性,它再次起作用,直到我重新启动它。

那怎么可能呢?

编辑: 它与更改代码没有任何关系。当我在visual studio菜单中选择rebuild时它可以工作。如果不是,它将无法工作两次。

2 个答案:

答案 0 :(得分:4)

我碰到了这样的事情。我不得不做两件事:

  1. ItemDetails 子节点的settlementID属性中指定父节点preservedRouteParameters路由参数。根据{{​​3}} inheritedRouteParameters是不够的:

    <mvcSiteMapNode title="Maschine" controller="Machine" action="Index" preservedRouteParameters="settlementID,sectionID"/>
    
  2. 确保action方法中存在所有保留的路径参数。我不确定您的 ItemsDetails 操作方法是什么样的,但它需要看起来像这样:

    public ActionResult Index(int settlementID, int sectionID)
    {
        //....
    }
    
  3. 希望这会有所帮助......

答案 1 :(得分:1)

我不确定您关注的是什么示例,但此配置存在一些问题:

  1. inheritedRouteParameters用于从父节点(mvcSiteMapNode)继承参数。您的示例显示resolveID是SectionController的一部分,而不是SettlementController,因此不需要继承它。
  2. 您正在使用savedRouteParameters和SiteMapPreserveRouteDataAttribute。这些并不是要同时使用。
  3. 此外,请确保您拥有最新版本(目前为4.0.6),因为自官方发布以来,已经有一些节点匹配错误修复。

    如果您修复了这些并且仍然有问题,请创建一个小型演示项目来重现该行为,并将其发布在GitHub上或压缩它并使其可供下载,然后open a new issue并发布位置你的演示,所以我们可以看看。

    <强>更新

    我重读了您的问题并注意到您正在尝试显示数据库中的产品。当您基于数据库数据的列表或表进行导航时,使用savedRouteParameters仅对SiteMapPath(breadcrumb)HTML帮助程序有用。它用于通过从当前HTTP请求复制参数的值来强制每个id匹配单个节点。

    但是,除非为每个产品添加到站点地图中的实际节点,否则您将无法在其他HTML帮助程序(如Menu或SiteMap)中查看它们,更重要的是,它们不会显示在{{1搜索引擎的端点。

    我猜您希望您的产品在搜索引擎中编入索引,因此我建议您使用dynamic node providers将数据库中的节点加载到站点地图中。这会将它们全部存储在共享缓存中,因此它非常有效,并且它们不会在请求之间被“遗忘”。请务必使用/sitemaps.xml设置每个产品的ID,以便有匹配的唯一ID。