MVCSiteMapProvider有些节点匹配,有些则不匹配
本文关键字:不匹配 节点 MVCSiteMapProvider | 更新日期: 2023-09-27 18:24:00
我正在使用MvcSiteMapProvider
生成面包屑,并且在将节点与新功能匹配时遇到问题。我们使用MVC5区域,并且正在使用最新的MvcSiteMapProvider.MVC5
库。我们将i18n
与Resx
文件一起使用,我们的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>
我很感激我可以从List
的mvcSiteMapNode
子级中删除属性area
和controller
。为了完整起见,我把它们留在了这里。
家庭控制器
[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}")]
的默认路由。这个问题仍然存在。
问题#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
必须引用List
和Search
的同一页。换句话说,每个密钥名称在其祖先中必须是唯一的。
如果它们相同,只需在搜索URL中添加附加参数即可解决此问题。
[Route("Search/{page?}/{itemsPerPage?}/{tags?}")]
否则,应为每个page
参数指定不同的名称。
请参阅如何使MvcSiteMapProvider记住用户位置以及所包含的演示以获得指导。