我正在使用MvcSiteMapProvider
生成面包屑,而我在使用新功能匹配节点时遇到问题。我们使用MVC5区域并使用最新的MvcSiteMapProvider.MVC5
库。我们将i18n
与Resx
个文件一起使用,我们的title
属性为关键字。我们的页面网址在发布后不会更改,因此请使用标准的XML配置。
我们使用基于MVC5属性的路由。
List
操作是Home控制器和区域的默认操作,因此位于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>
我感谢我可以从area
的{{1}}子项中移除属性controller
和mvcSiteMapNode
。为了完整起见,我已将他们留在这里了。
家庭控制器
List
研究
我觉得这与[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)
{}
}
动作为空的MVC路线有关。如果我将List
的路线更改为:
List
然后搜索节点将匹配,其兄弟姐妹(我剪掉了)
修改 - 简化路由
我删除了控制器[Route("List/{page?}/{itemsPerPage?}")]
public ActionResult List(int page = 1, int itemsPerPage = -1, string msg = "")
{}
的默认路由。问题仍然存在。
答案 0 :(得分:1)
每MSDN:
默认路线
您还可以在控制器级别应用[Route]属性,将操作捕获为参数。然后,该路由将应用于控制器中的所有操作 ,除非已在特定操作上定义特定的[Route],覆盖控制器上的默认设置 。 / p>
在您的情况下,将完全忽略默认的控制器级路由,因为在每种情况下,您都有一个覆盖它的操作级别的路由。
我通过在VS 2015中启动一个新的MVC 5项目并添加一个区域和其余的配置来调查它为什么“不匹配”。有一段时间我很困惑,为什么它不起作用。
然后我发现脚手架为/Area/<area name>/Views/_ViewStart.cshtml
中的每个区域连接了不同的布局页面。
@{
Layout = "~/Areas/Store/Views/Shared/_Layout.cshtml";
}
我将其更改为使用共享的ViewStart.cshtml
文件,然后显示了痕迹痕迹。
@{
Layout = "~/Views/Shared/_Layout.cshtml";
}
此外,您保留的路线参数也存在问题。由于它们总是从当前请求派生,因此内部请求必须始终提供其祖先的所有参数。此外,参数在父级和子级之间的含义不得相同,因此例如page
必须引用List
和Search
的相同页面。换句话说,每个键名在其祖先中必须是唯一的。
如果它们相同,您只需将其他参数添加到搜索网址即可解决此问题。
[Route("Search/{page?}/{itemsPerPage?}/{tags?}")]
否则,您应该为每个page
参数指定一个不同的名称。
请参阅How to make MvcSiteMapProvider Remember a User's Position以及所包含的演示以获取指导。