MVCSiteMapProvider有些节点匹配,有些则不匹配

本文关键字:不匹配 节点 MVCSiteMapProvider | 更新日期: 2023-09-27 18:24:00

我正在使用MvcSiteMapProvider生成面包屑,并且在将节点与新功能匹配时遇到问题。我们使用MVC5区域,并且正在使用最新的MvcSiteMapProvider.MVC5库。我们将i18nResx文件一起使用,我们的title属性是密钥。我们的页面URL在发布后不会更改,所以使用标准的XML配置。

我们使用基于MVC5属性的路由。

List操作是主控制器和区域的默认操作,Store/路由也是如此。它运行良好,匹配成功。

Search操作Store/Search路由与节点不匹配。

配置

<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 controller="Dashboard" action="Index" title="Foobar" key="Bar">
    <!-- quite a large file -->
    <mvcSiteMapNode area="Store" controller="Home" action="List" title="SiteMap_DocumentStore_Home_List" preservedRouteParameters="page, itemsPerPage, msg">
      <mvcSiteMapNode area="Store" controller="Home" action="Search" title="SiteMap_DocumentStore_Search" preservedRouteParameters="tags, page"/>
      <!-- snip extra entries -->
    </mvcSiteMapNode>
  </mvcSiteMapNode>
</mvcSiteMap>

我很感激我可以从ListmvcSiteMapNode子级中删除属性areacontroller。为了完整起见,我把它们留在了这里。

家庭控制器

[RouteArea("Store")]
[Route("{action=list}")]
public class HomeController : Controller
{
  [Route("{page?}/{itemsPerPage?}")]
  public ActionResult List(int page = 1, int itemsPerPage = -1, string msg = "")
  {}
  [Route("Search/{tags?}/{page?}")]
    public ActionResult Search(string tags = "", int page = 1)
  {}
}

调查

我有一种感觉,这与List操作为的MVC路由有关。如果我将List的路线更改为:

[Route("List/{page?}/{itemsPerPage?}")]
public ActionResult List(int page = 1, int itemsPerPage = -1, string msg = "")
{}

然后Search节点将匹配,它的兄弟节点(我删掉了)也将匹配

编辑-简化路由

我已经删除了控制器[Route("{action=list}")]的默认路由。这个问题仍然存在。

MVCSiteMapProvider有些节点匹配,有些则不匹配

问题#1:

根据MSDN:

默认路线

您还可以在控制器级别应用[Route]属性,将动作捕获为参数。然后,该路由将应用于控制器中的所有操作,,除非在特定操作上定义了特定的[route],覆盖控制器上的默认设置

在您的情况下,默认的控制器级路由将被完全忽略,因为在每种情况下,您都有一个覆盖它的操作级路由

第2期:

我研究了为什么它是";不匹配";通过在VS 2015中启动一个新的MVC 5项目,并添加一个区域和其他配置。有一段时间,我很困惑为什么它不起作用。

然后我发现脚手架为/Area/<area name>/Views/_ViewStart.cshtml中的每个区域连接了不同的布局页面。

@{
    Layout = "~/Areas/Store/Views/Shared/_Layout.cshtml";
}

我将其更改为使用共享的ViewStart.cshtml文件,然后它显示了breadcrumb踪迹。

@{
    Layout = "~/Views/Shared/_Layout.cshtml";
}

第3期:

此外,您保留的路线参数也有问题。由于它们总是从当前请求派生而来,因此内部请求必须始终提供其祖先的所有参数。此外,参数在父级和子级之间不能有不同的含义,因此例如page必须引用ListSearch的同一页。换句话说,每个密钥名称在其祖先中必须是唯一的。

如果它们相同,只需在搜索URL中添加附加参数即可解决此问题。

[Route("Search/{page?}/{itemsPerPage?}/{tags?}")]

否则,应为每个page参数指定不同的名称。

请参阅如何使MvcSiteMapProvider记住用户位置以及所包含的演示以获得指导。