这个问题困扰我几个小时。这是我的路线.MapRoute:
routes.MapRoute(
"SiteArea",
"SiteArea/{area}/{link}",
new { controller = "SiteArea", action = "Dispatch", link = UrlParameter.Optional },
namespaces
);
链接是可选的,可以为null。在Mvc.sitemap中:
<mvcSiteMapNode title="SiteArea" controller="SiteArea" action="Dispatch" route="SiteArea" preservedRouteParameters="area,link" />
在C#Mvc行动中:
public override ActionResult Dispatch(string area, string link)
{
var node = SiteMaps.Current.CurrentNode;
if (node != null)
{
node.ParentNode.Title = area;
node.Title = link;
}
return base.Dispatch(area, link);
}
SiteMaps.Current.CurrentNode
总是抛出异常:
The node with key _Home_Index_GET_Home__SiteArea_Dispatch_GET_SiteArea_' and title 'SiteArea' has 'area' configured in both RouteValues and PreservedRouteParameters, which is not allowed. PreservedRouteParameters copies the route value from the current HTTP request which would overwrite your configured RouteValue in every case. Either remove 'area' from PreservedRouteParameters or as a configured RouteValue.
Alternatively, if you are configuring the node in XML and intend to use 'area' as a custom attribute, use the 'MvcSiteMapProvider_AttributesToIgnore' configuration setting to ensure 'area' is not automatically added to RouteValues. If using external DI, this setting is injected into the constructor of 'SiteMapXmlReservedAttributeNameProvider'.
我知道这个例外是假的,并不会告诉任何有用的问题。 但是,我有完全相同的位置,除了链接不是UrlParameter.Optional - 不可空,它工作正常。 任何人都可以解释或提供这个问题的解决方案 - 当第二个保留的参数是可选的吗?
答案 0 :(得分:0)
我只是想出了问题的根本原因。我在使用区域关键字:
routes.MapRoute(
"SiteArea",
"SiteArea/{area}/{link}",
new { controller = "SiteArea", action = "Dispatch", link = UrlParameter.Optional },
namespaces
);
并在Mvc.sitemap中:
<mvcSiteMapNode title="SiteArea" controller="SiteArea" action="Dispatch" preservedRouteParameters="area" >
<mvcSiteMapNode title="SiteArea" controller="SiteArea" action="Dispatch" preservedRouteParameters="area,link" />
</mvcSiteMapNode>
更改
后一切都像魅力一样。区域到 站点区域
答案 1 :(得分:0)
area
是MvcSiteMapProvider
中的保留路由值。如果您没有使用MVC区域,则仍有一个自动路由值用作默认区域(area = ""
)。
因此,您需要将路由密钥更改为area
以外的其他名称。否则,由于此冲突,此值无法放入preservedRouteParameters
。
routes.MapRoute(
"SiteArea",
"SiteArea/{myArea}/{link}",
new { controller = "SiteArea", action = "Dispatch", link = UrlParameter.Optional },
namespaces
);
<mvcSiteMapNode title="SiteArea" controller="SiteArea" action="Dispatch" route="SiteArea" preservedRouteParameters="myArea,link" />
答案 2 :(得分:0)
我遇到了这样的错误,并对其发生原因感到困惑。在进行过多故障排除之前,请尝试再次运行代码。对我来说,这似乎是神秘的,但并没有发生在第二,第三等尝试中。