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

时间:2015-11-23 11:40:41

标签: c# .net model-view-controller url-routing mvcsitemapprovider

我正在使用MvcSiteMapProvider生成面包屑,而我在使用新功能匹配节点时遇到问题。我们使用MVC5区域并使用最新的MvcSiteMapProvider.MVC5库。我们将i18nResx个文件一起使用,我们的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}}子项中移除属性controllermvcSiteMapNode。为了完整起见,我已将他们留在这里了。

家庭控制器

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 = "") {} 的默认路由。问题仍然存在。

1 个答案:

答案 0 :(得分:1)

问题#1:

MSDN

  

默认路线

     

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

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

问题#2:

我通过在VS 2015中启动一个新的MVC 5项目并添加一个区域和其余的配置来调查它为什么“不匹配”。有一段时间我很困惑,为什么它不起作用。

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

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

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

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

问题#3:

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

如果它们相同,您只需将其他参数添加到搜索网址即可解决此问题。

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

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

请参阅How to make MvcSiteMapProvider Remember a User's Position以及所包含的演示以获取指导。