MvcSitemapProvider参数有时有效,有时无效
本文关键字:无效 有效 MvcSitemapProvider 参数 | 更新日期: 2023-09-27 18:27:19
我在MVC4应用程序中使用MvcSitemapProvider。我的控制器需要参数来解析数据库中的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>
这是一个控制器(看起来完全一样):
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());
}
}
}
除非我不重新启动应用程序,否则这是一个有效的代码。如果我重新启动应用程序,它将不起作用。但如果我对[SiteMapPreserveRoutData]-属性进行评论,它将再次起作用。因此,我重新启动应用程序,我不再工作->取消注释属性,直到我重新启动它,它才会再次工作。
那这怎么可能呢?
编辑:它与更改代码无关。当我在visual studio菜单中选择"重建"时,它就起作用了。如果不这样,它就不会工作两次。
我遇到了这样的事情。我必须做两件事:
-
在ItemDetails子节点的
preservedRouteParameters
属性中指定父节点Item的settlementID
路由参数。根据继承的文档,RouteParameters是不够的:<mvcSiteMapNode title="Maschine" controller="Machine" action="Index" preservedRouteParameters="settlementID,sectionID"/>
-
请确保操作方法中存在所有preservedRouteParameters。我不确定ItemsDetails操作方法是什么样子的,但它需要看起来像这样:
public ActionResult Index(int settlementID, int sectionID) { //.... }
希望这能帮助。。。
我不确定你在举什么例子,但这个配置有一些问题:
- inheritedRouteParameters用于从父节点(mvcSiteMapNode)继承参数。您的示例显示settlementID是SectionController的一部分,而不是SettlementController,因此不需要继承它
- 您同时使用preservedRouteParameters和SiteMapPreservedRouteDataAttribute。这些不应同时使用
此外,请确保您拥有最新版本(目前为4.0.6),因为自正式发布以来,已经修复了一些节点匹配错误。
如果你解决了这些问题,但仍然有问题,请创建一个小的演示项目,复制行为,并将其发布在GitHub上,或将其压缩并提供下载,然后打开一个新问题,发布演示的位置,以便我们查看。
更新
我重读了你的问题,注意到你正试图显示数据库中的产品。只有在基于数据库数据列表或表进行导航时,使用preservedRouteParameters才对SiteMapPath(breadcrumb)HTML助手有用。它用于通过从当前HTTP请求中复制参数的值来强制每个id与单个节点匹配。
但是,除非每个产品的站点地图中都添加了实际的节点,否则您将无法在其他HTML帮助程序(如Menu或sitemap)中查看它们,更重要的是,它们不会出现在搜索引擎的/sitemaps.xml
端点中。
我猜你希望你的产品在搜索引擎中建立索引,所以我建议你使用动态节点提供程序将你的节点从数据库加载到网站地图中。这将把它们全部存储在共享缓存中,因此非常高效,并且它们不会在请求之间被"遗忘"。只需确保使用node.RouteValues.Add("id", product.id)
设置每个产品的id,这样就有一个唯一的id可以进行匹配。