我在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时它可以工作。如果不是,它将无法工作两次。
答案 0 :(得分:4)
在 ItemDetails 子节点的settlementID
属性中指定父节点项的preservedRouteParameters
路由参数。根据{{3}} inheritedRouteParameters是不够的:
<mvcSiteMapNode title="Maschine" controller="Machine" action="Index" preservedRouteParameters="settlementID,sectionID"/>
确保action方法中存在所有保留的路径参数。我不确定您的 ItemsDetails 操作方法是什么样的,但它需要看起来像这样:
public ActionResult Index(int settlementID, int sectionID)
{
//....
}
希望这会有所帮助......
答案 1 :(得分:1)
我不确定您关注的是什么示例,但此配置存在一些问题:
此外,请确保您拥有最新版本(目前为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。