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