1

我使用 MvcSiteMapProvider(Nuget 包 MvcSiteMapProvider.MVC5(版本 4.6.22))为我的网站设置 MVC 面包屑。

它工作正常。

然后我想动态更新站点地图的网址,例如:

SiteMaps.Current.CurrentNode.Url = Url.Action("Index");

然后我得到了这个错误:

SiteMapNode 是只读的,不能修改属性“Url”

请注意,我仍然可以更新标题:

SiteMaps.Current.CurrentNode.Title = "/Index";

任何的想法?

4

1 回答 1

1

SiteMap是一个在所有用户之间共享的静态缓存对象。从技术上讲,所有属性在运行时都是只读的。但是,某些属性(例如Title)是请求缓存的,因此您可以在运行时安全地更新它们而不会影响其他用户。

Url属性是一个特殊的属性,它通过 MVCUrlHelper类(直接从您的路由驱动)动态构建 URL。将其设置为没有意义,Url.Action("Index")因为这实际上是它本身所做的(除非您使用动态节点提供程序或自定义ISiteMapNodeProvider- 这些是您加载节点配置的启动扩展点,因此属性是读写的) .

您只需在节点配置中设置正确的控制器和操作(可以是 XML、基于属性或基于代码),URL 将自行解析。

XML 示例

<mvcSiteMapNode title="Projects" controller="Project" action="Index"/>

注意:您需要考虑请求中的所有路由值,要么将它们添加为另一个属性,要么myId="123"使用preservedRouteParameters="myId"(告诉它myId在构建 URL 时包含来自当前请求的)。有关使用这些选项的详细说明,请参阅本文

注意:在配置中设置 URL 会SiteMap有效地覆盖对该节点的 MVC 支持。所以,你根本不应该设置一个 URL,除非它是一个非 MVC URL。

于 2016-04-04T18:22:51.117 回答