【问题标题】:SiteMapNode is readonly, property 'Url' cannot be modifiedSiteMapNode 是只读的,不能修改属性“Url”
【发布时间】:2016-04-04 16:38:53
【问题描述】:

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

它工作正常。

然后我想动态更新 Sitemap 的 Url,例如:

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

然后我得到了这个错误:

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

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

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

有什么想法吗?

【问题讨论】:

    标签: asp.net-mvc asp.net-mvc-sitemap


    【解决方案1】:

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

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

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

    XML 示例

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

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

    注意:SiteMap 配置中设置 URL 会有效地覆盖对该节点的 MVC 支持。因此,除非它是非 MVC URL,否则您根本不应该设置 URL。

    【讨论】:

    • 我上面的代码只是为了说明问题而变得简单。事实上,我想修改我的 Parent SiteMapNode Url 以满足我的要求,因为默认 URL 的 ID 不正确。不过,我仍然能够在以前版本的 MvcSiteMap Provider 中编辑节点 URL。那么现在我需要使用不同的方法吗?
    • MvcSiteMapProvider 的先前版本从根本上被破坏,因为它允许这样做。当您更新 URL 时,它被写入全局缓存,这会影响网站的 所有用户。相反,您应该旨在在启动时加载您的属性。如果 URL 错误,则表明您的节点配置错误或您的 MVC 路由配置错误。请参阅我在我的 NOTE 中链接到的文章 - 它解释了使它工作所需要做的一切,并且还有演示。
    • 您现在是否有办法将参数传递给动态节点提供程序?
    • 动态节点提供程序用于加载 SiteMap(进入全局缓存)。所以你不会在那里传递每个请求的值。我建议您提出一个不同的问题并提出您要解决的问题。可能有一个解决方案可以解决您在不将 URL 推送到节点的情况下尝试实现的目标,但如果我不知道它是什么,我无法解释如何解决您的问题。
    猜你喜欢
    • 2011-09-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-21
    • 2019-07-10
    • 2016-11-13
    • 2020-06-12
    相关资源
    最近更新 更多