【问题标题】:Multiple path to same Razor view - ASP.NET MVC breadcrum using SiteMap Provider相同 Razor 视图的多个路径 - 使用 SiteMap Provider 的 ASP.NET MVC 面包屑
【发布时间】:2014-05-19 08:14:27
【问题描述】:

我有 Asp.NET MVC SiteMap Provider 4.0 版。

我编写了一个包含多个测试 Razor 视图的小型测试项目。 这是定义了路径的 MvcSite xml 文件:

 <mvcSiteMapNode title="Home - default" controller="Home" action="Index">
    <mvcSiteMapNode title="Middle - default" controller="Home" action="Middle">
      <mvcSiteMapNode title="Edit - default" controller="Home" action="Edit" key="keyForEdit">
      </mvcSiteMapNode>
    <mvcSiteMapNode title="Over - another path" controller="Home" action="Over">
      <mvcSiteMapNode title="Edit through over" controller="Home" action="Edit" canonicalKey="keyForEdit">
      </mvcSiteMapNode>
    </mvcSiteMapNode>
    </mvcSiteMapNode>
  </mvcSiteMapNode>
</mvcSiteMap>

这个想法是从应用程序的不同位置到达“编辑”视图。我可以通过“中间”或“过度”剃刀视图。我的目标是为这些不同的“编辑”视图路径提供不同的 bredcrumb 显示。 这是构建网站的主布局:

    @{
        Layout = null;
    }

    <!DOCTYPE html>

<html>
<head>
    <meta name="viewport" content="width=device-width" />
    <title>This is layout</title>
    @Html.MvcSiteMap().CanonicalTag()
</head>
<body>
    <div>Hi from Layout!</div>
    <div>@Html.MvcSiteMap().SiteMapPath()</div>
    <div>
        @RenderBody()
    </div>
</body>
</html>

不过,每次我进入“编辑”视图时,我都会在面包屑中看到“编辑 - 默认”标题。 这是为什么呢? 非常感谢您的宝贵时间。

【问题讨论】:

标签: asp.net-mvc asp.net-mvc-4 razor mvcsitemapprovider


【解决方案1】:

这是因为您有 2 个不同的节点具有完全相同的路由签名。当这种情况发生时,在确定当前节点(当前请求的节点)时,第一个匹配总是获胜。

对于您的示例,两个 URL 都有一个如下所示的路由。

|-----------------------------------|-----------------------------------|
|         Current Request           |          SiteMap Node             |
|-----------------------------------|-----------------------------------|
|      Key       |      Value       |      Key       |      Value       |
|-----------------------------------|-----------------------------------|
| controller     | Home             | controller     | Home             |
| action         | Edit             | action         | Edit             |
|-----------------------------------|-----------------------------------|

问题是没有唯一的方法可以到达第二个节点,所以它永远不会匹配。此外,在这两种情况下,URL(和路由)都是相同的。

为了使其正常工作,每个节点的路由签名必须是唯一的,即使它们代表相同的位置。实现这一点的最简单方法是添加一个附加参数,为其中一种情况创建不同的路由签名和不同的 URL。

<mvcSiteMapNode title="Home - default" controller="Home" action="Index">
    <mvcSiteMapNode title="Middle - default" controller="Home" action="Middle">
        <mvcSiteMapNode title="Edit - default" controller="Home" action="Edit" key="keyForEdit"/>
    </mvcSiteMapNode>
    <mvcSiteMapNode title="Over - another path" controller="Home" action="Over">
        <mvcSiteMapNode title="Edit through over" controller="Home" action="Edit" category="path2" canonicalKey="keyForEdit"/>
    </mvcSiteMapNode>
</mvcSiteMapNode>

使用默认路由时,第一个编辑页面会生成 URL /Home/Edit,第二个编辑页面会生成 URL /Home/Edit?category=path2。这为 MvcSiteMapProvider 提供了足够的信息来区分这两个位置,因为它们现在是唯一的。这是第二个现在的样子。

|-----------------------------------|-----------------------------------|
|         Current Request           |          Default Node             |
|-----------------------------------|-----------------------------------|
|      Key       |      Value       |      Key       |      Value       |
|-----------------------------------|-----------------------------------|
| controller     | Home             | controller     | Home             |
| action         | Edit             | action         | Edit             |
| category       | path2            |                                   |   
|-----------------------------------|-----------------------------------|


|-----------------------------------|-----------------------------------|
|         Current Request           |        Another Path Node          |
|-----------------------------------|-----------------------------------|
|      Key       |      Value       |      Key       |      Value       |
|-----------------------------------|-----------------------------------|
| controller     | Home             | controller     | Home             |
| action         | Edit             | action         | Edit             |
| category       | path2            | category       | path2            |
|-----------------------------------|-----------------------------------|

所以当当前请求路由包含category=path2时,现在在查找当前节点时会匹配第二个节点,而因为额外的参数而匹配第一个失败。

您还可以安排路线以创建符合您喜欢的任何方案的 URL。唯一的限制是每个节点的路由必须是唯一的。

查看MvcSiteMapProvider - SEO Features Tutorial 以获取示例和可下载的演示项目。此外,如果您打算使用自定义 URL 方案,请查看 How to Make MvcSiteMapProvider Remember a User's Position 可能会有所帮助。

【讨论】:

  • 对不起,我试过了,但还是不行。我在做某事吗?错误的?我已将“类别”添加到节点“编辑通过”。
  • 查看demo project 的 SEO 功能教程。 “About”和“Another About”指向同一个控制器动作,但具有不同的面包屑轨迹。该演示使用 something=1234,但只要 URL 是唯一的,如何使 URL 唯一并不重要。
  • 在项目内部它可以工作,但是当我在我的项目上复制它时它不起作用。我已经通过 NuGet 添加了 MVCSiteProvider 4,我还向 MVC 站点地图 xml 和 SiteMap.Path 和 CanonocalTag 添加了参数到布局文件。我在 RouteCongfig 文件中添加了以下行: MvcSiteMapProvider.Web.Mvc.XmlSiteMapController.RegisterRoutes(routes); 还有什么其他的吗?谢谢
  • 你能发布你的路线吗?
  • 当然,给你:public class RouteConfig { public static void RegisterRoutes(RouteCollection routes) { routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); routes.MapRoute( name: "Default", url: "{controller}/{action}/{id}", defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional } ); MvcSiteMapProvider.Web.Mvc.XmlSiteMapController.RegisterRoutes(routes); } }
【解决方案2】:

您可以在 mvc.sitemap 节点中使用 URL:

<mvcSiteMapNode title="Home - default" controller="Home" action="Index">
    <mvcSiteMapNode title="Middle - default" controller="Home" action="Middle">
        <mvcSiteMapNode title="Edit - default" controller="Home" action="Edit" key="keyForEdit" url="/Home/Edit"/>
    </mvcSiteMapNode>
    <mvcSiteMapNode title="Over - another path" controller="Home" action="Over">
        <mvcSiteMapNode title="Edit through over" controller="Home" action="Edit" url="/Home/Edit/Path2" canonicalKey="keyForEdit"/>
    </mvcSiteMapNode>
</mvcSiteMapNode>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-20
    • 2010-11-13
    • 2019-05-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多