我的路线:
"{lang}/{controller}/{action}/{id}"
{lang}这里是:en-US,de-DE等
一切正常,直到我想转换语言。当我切换语言时,我正在丢失部分菜单。
我的MenuHelperModel.chtml
@model MvcSiteMapProvider.Web.Html.Models.MenuHelperModel
@using System.Web.Mvc.Html
@using MvcSiteMapProvider.Web.Html.Models
<div class="hmenu">
<ul class="tabs">
@foreach (var node in Model.Nodes)
{
<li>@Html.DisplayFor(m => node)</li>
}
</ul>
</div>
@foreach (var node in Model.Nodes)
{
if (node.IsInCurrentPath)
{
if (node.Children.Any()) {
//Left side menu
<div class="vmenu" style="float: left;">
<ul class="tabs">
@foreach (var child in node.Children)
{
<li><a href="@child.Url">@child.Description</a></li>
}
</ul>
</div>
}
}
}
一切正常仅适用于默认语言,适用于所有其他节点.IsInCurrentPath =&gt;假。 看起来我需要覆盖它。有人可以建议怎么做吗?有没有其他方法可以解决这个问题?或者我可能需要以某种方式分配父母?但它适用于默认语言。
答案 0 :(得分:2)
您只需要在lang
参数上将其设置为force a match,这样它就会始终从当前请求的路由复制到节点的RouteValues字典中。
<mvcSiteMapNode title="Home" controller="Home" action="Index" preservedRouteParameters="lang">
<mvcSiteMapNode title="About" controller="Home" action="About" preservedRouteParameters="lang"/>
</mvcSiteMapNode>
我怀疑它是&#34;工作&#34;对于默认语言,因为您在路线中设置了默认的lang
参数。但从技术上讲,它仍然无法与当前网址的路线相匹配,因为您没有平衡等式的两边。您的值看起来像这样:
|-----------------------------------|-----------------------------------|
| Current Request | SiteMap Node |
|-----------------------------------|-----------------------------------|
| Key | Value | Key | Value |
|-----------------------------------|-----------------------------------|
| controller | Home | controller | Home |
| action | Index | action | Index |
| lang | de-DE | | |
|-----------------------------------|-----------------------------------|
由于节点中缺少lang
键和值,因此不匹配。使用适当的键添加savedRouteParameters会在比较它们之前将它们从当前请求复制出来:
|-----------------------------------|-----------------------------------|
| Current Request | SiteMap Node |
|-----------------------------------|-----------------------------------|
| Key | Value | Key | Value |
|-----------------------------------|-----------------------------------|
| controller | Home | controller | Home |
| action | Index | action | Index |
| lang | de-DE | lang | de-DE |
|-----------------------------------|-----------------------------------|
这会强制匹配lang参数的任何值。如果所有其他键和值也匹配,则CurrentNode属性的值不为null,这对于获取SiteMapPath和菜单的许多功能非常重要。您可以通过使用savedRouteParameters或为每个路径值组合配置单独的节点来平衡书籍,但在使用区域,控制器和操作之外的路径值时,必须始终考虑这一点。
另外,有关设置SiteMapNode属性的本地化的信息,请参阅this answer。