到同一Razor视图的多个路径 - 使用SiteMap Provider的ASP.NET MVC breadcrum

时间:2014-05-19 08:14:28

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

我有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>

想法是从应用程序的不同位置到达“编辑”视图。我可以通过“中间”或“过度”Razor视图。我的目标是为这些不同的“编辑”视图路径提供不同的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>

但是,每次进入“编辑”视图时,我都会在痕迹中找到“编辑 - 默认”标题。 这是为什么? 非常感谢你的时间。

2 个答案:

答案 0 :(得分:2)

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

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

|-----------------------------------|-----------------------------------|
|         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>

使用默认路线时,第一个编辑页面将生成网址/Home/Edit,第二个编辑页面将生成网址/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时,它现在将在查找当前节点时匹配第二个节点,并且由于额外参数而无法匹配第一个节点。

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

查看MvcSiteMapProvider - SEO Features Tutorial示例和可下载的演示项目。此外,如果您打算使用自定义网址方案,则可以查看How to Make MvcSiteMapProvider Remember a User's Position

答案 1 :(得分:0)

您可以在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>