如何使用 mvcsitemapprovider 呈现特定站点地图部分

2023-12-25

假设我有站点地图

<mvcSiteMapNode title="Home" controller="Home" action="Index" changeFrequency="Always" >
        <mvcSiteMapNode title="Home" controller="Home" action="Index" visibility="MenuHelper,!*">
            <mvcSiteMapNode title="T1" controller="Home" action="T1" />
            <mvcSiteMapNode title="T2" controller="Home" action="T2"/>
        </mvcSiteMapNode>
        <mvcSiteMapNode title="Help" controller="Help" action="Index">
            <mvcSiteMapNode title="T1" controller="Help" action="T1" />
            <mvcSiteMapNode title="T2" controller="Help" action="T2" />
            <mvcSiteMapNode title="T3" controller="Help" action="T3" />
            <mvcSiteMapNode title="T4" controller="Help" action="T4" />
            <mvcSiteMapNode title="T5" controller="Help" action="T5" />
            <mvcSiteMapNode title="T6" controller="Help" action="T6" />
        </mvcSiteMapNode>
</mvcSiteMapNode>

@Html.MvcSiteMap().Menu()将显示上面包含节点的菜单 但是可以说在页脚上我只想显示站点地图中的特定节点,可以说我想显示节点Help:

    <ul>
    <li>
    <a href="/help">
    </li>
    <li>
    <a href="/help/t1">T1</a>
    </li>
    <li>
    <a href="/help/t2">T2</a>
    </li>
    //and so on....
    </ul>

我怎样才能做到这一点?

我猜我可能需要创建一个自定义模板,但是如何将字符串值传递给自定义模板?


Option 1

一种方法是显式设置起始节点。首先,给起始节点一个显式的键:

<mvcSiteMapNode title="Help" controller="Help" action="Index" key="HelpKey">
    <mvcSiteMapNode title="T1" controller="Help" action="T1" />
    <mvcSiteMapNode title="T2" controller="Help" action="T2" />
    <mvcSiteMapNode title="T3" controller="Help" action="T3" />
    <mvcSiteMapNode title="T4" controller="Help" action="T4" />
    <mvcSiteMapNode title="T5" controller="Help" action="T5" />
    <mvcSiteMapNode title="T6" controller="Help" action="T6" />
</mvcSiteMapNode>

并使用菜单重载:

@Html.MvcSiteMap().Menu(Html.MvcSiteMap().SiteMap.FindSiteMapNodeFromKey("HelpKey"), false, false)

但这样做并不会给你太多的控制权。

Option 2

您还可以使用自定义可见性提供程序。您可以使用 sourceMetaData 字典将自定义数据传递给可见性提供程序,因此您可以为每个菜单实例创建单独的“名称”:

@Html.MvcSiteMap().Menu(new { name = "MainMenu" })
@Html.MvcSiteMap().Menu(new { name = "HelpMenu" })

然后,您的自定义可见性提供程序可以使用 FilteredSiteMapNodeVisibilityProvider 用于自定义“名称”属性的相同逻辑:

/// <summary>
/// Filtered SiteMapNode Visibility Provider for use with named controls.
/// 
/// Rules are parsed left-to-right, first match wins. Asterisk can be used to match any control or any control name. Exclamation mark can be used to negate a match.
/// </summary>
public class CustomFilteredSiteMapNodeVisibilityProvider
    : SiteMapNodeVisibilityProviderBase
{
    #region ISiteMapNodeVisibilityProvider Members

    /// <summary>
    /// Determines whether the node is visible.
    /// </summary>
    /// <param name="node">The node.</param>
    /// <param name="sourceMetadata">The source metadata.</param>
    /// <returns>
    ///     <c>true</c> if the specified node is visible; otherwise, <c>false</c>.
    /// </returns>
    public override bool IsVisible(ISiteMapNode node, IDictionary<string, object> sourceMetadata)
    {
        // Is a visibility attribute specified?
        string visibility = string.Empty;
        if (node.Attributes.ContainsKey("visibility"))
        {
            visibility = node.Attributes["visibility"].GetType().Equals(typeof(string)) ? node.Attributes["visibility"].ToString() : string.Empty;
        }
        if (string.IsNullOrEmpty(visibility))
        {
            return true;
        }
        visibility = visibility.Trim();

        // Check for the source HtmlHelper
        if (sourceMetadata["HtmlHelper"] == null)
        {
            return true;
        }
        string htmlHelper = sourceMetadata["HtmlHelper"].ToString();
        htmlHelper = htmlHelper.Substring(htmlHelper.LastIndexOf(".") + 1);

        string name = sourceMetadata["name"].ToString();

        // All set. Now parse the visibility variable.
        foreach (string visibilityKeyword in visibility.Split(new[] { ',', ';' }))
        {
            if (visibilityKeyword == htmlHelper || visibilityKeyword == name || visibilityKeyword == "*")
            {
                return true;
            }
            else if (visibilityKeyword == "!" + htmlHelper || visibilityKeyword == "!" + name || visibilityKeyword == "!*")
            {
                return false;
            }
        }

        // Still nothing? Then it's OK!
        return true;
    }

    #endregion
}

然后更新您的配置以使用名称而不是控件类型。

<mvcSiteMapNode title="Home" controller="Home" action="Index" changeFrequency="Always" >
        <mvcSiteMapNode title="Home" controller="Home" action="Index" visibility="MainMenu,!*">
            <mvcSiteMapNode title="T1" controller="Home" action="T1" />
            <mvcSiteMapNode title="T2" controller="Home" action="T2"/>
        </mvcSiteMapNode>
        <mvcSiteMapNode title="Help" controller="Help" action="Index" visibility="HelpMenu,!*">
            <mvcSiteMapNode title="T1" controller="Help" action="T1" />
            <mvcSiteMapNode title="T2" controller="Help" action="T2" />
            <mvcSiteMapNode title="T3" controller="Help" action="T3" />
            <mvcSiteMapNode title="T4" controller="Help" action="T4" />
            <mvcSiteMapNode title="T5" controller="Help" action="T5" />
            <mvcSiteMapNode title="T6" controller="Help" action="T6" />
        </mvcSiteMapNode>
</mvcSiteMapNode>

并且不要忘记将自定义可见性提供程序设置为配置中的默认设置。

使用内部 DI (web.config):

<appSettings>
    <add key="MvcSiteMapProvider_DefaultSiteMapNodeVisibiltyProvider" value="MyNamespace.CustomFilteredSiteMapNodeVisibilityProvider, MyAssemblyName"/>
</appSettings>

使用外部 DI(在 DI 模块中 - 显示 Ninject 示例):

this.Kernel.Bind<ISiteMapNodeVisibilityProviderStrategy>().To<SiteMapNodeVisibilityProviderStrategy>()
    .WithConstructorArgument("defaultProviderName", "MyNamespace.CustomFilteredSiteMapNodeVisibilityProvider, MyAssemblyName");

Note:如果需要关闭父节点的可见性但使子节点保持可见,则应使用 Menu()、SiteMap() 或 SiteMapPath() 的重载之一,这些重载允许您将visibilityAffectsDescendants 参数设置为 false。默认情况下是正确的。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用 mvcsitemapprovider 呈现特定站点地图部分 的相关文章

随机推荐

  • 项目 Euler 7 Scala 问题

    我试图使用 scala 2 8 解决 Project Euler 问题 7 我实施的第一个解决方案大约需要 8 秒 def problem 7 Int var num 17 var primes new ArrayBuffer Int pr
  • 使用 Spring Boot、Spring Security 和 React 时发生 CORS 错误

    早上好 这两天我一直在解决这个问题 所以我决定发布一个关于它的问题 基本上我有一个 Spring Boot 项目 它通过 React JS 前端执行基本的 CRUD 操作 一切似乎都工作正常 直到我将 Spring Security 添加到
  • 使用 .NET 进行双向通信以进行通知的方法

    我有一个服务器 客户端项目 我使用 C 进行编码 WCF 作为服务器 我仅限于 HTTP 到目前为止对 wsdualhttpbinding 还没有运气 项目正在公司网络上运行 除了 WCF 双工之外 还有其他方法可以将通知从服务器发送到客户
  • 如何在推送时自动结帐?

    考虑以下情况 我有一个 git 存储库 foo git 其中包含 javascript 项目的代码 在这个存储库中有一个分支生产包含由网络服务器提供的代码状态 该服务器从以下位置获取代码 var www foo 该存储库是该项目的主存储库
  • 对于作为 Azure 应用服务 (P3) 托管的 .NET Core 2 Web api 的基准 RPS,我的期望应该是什么?

    我正在尝试衡量在 NET Core 2 中开发的 Web API 的基线 RPS 以下是迄今为止我遵循的步骤 从 Microsoft 的 VS 模板中生成了一个新的 空的 Web API 项目 添加了一个新的控制器 它执行基本的 你好 你的
  • Automake 将两个静态库合并为一个

    我正在尝试将预构建静态库中的符号包含到我正在构建的静态库中 然后 我正在构建的静态库将在可执行文件内部使用 我遇到的问题是我的静态库中从其他静态库获取了未定义的符号 这意味着我从预构建的静态库中需要的符号没有包含在我的静态库中 使用自动工具
  • 在 LWUIT 中拨打电话

    我有一个带有电话号码的文本字段 我想要做的就是当文本字段聚焦并按下呼叫按钮时 必须暂停应用程序并且应使用以下命令拨打文本字段的电话号码平台请求 http docs oracle com javame config cldc ref impl
  • MKOverlayView 和触摸

    我的地图上有一个自定义 MKOverlayView 我想检测触摸 但是 我似乎无法让覆盖层做出响应 我希望这会是愚蠢的事情 比如忘记将 userInteractionEnabled 设置为 YES 但是可惜 没有运气 目前 我的情况如下 m
  • 在 php 中处理数学方程

    用户可以输入他们喜欢的任何数学方程 带有一个变量 x 5 1 x 2 x 3 56 13 它们以字符串形式存储在数据库中 当检索它们时 我需要用 x 代替数字并检查方程的值 我怎么能这样做呢 我正在考虑编写一个解析器来解构字符串并将它们转换
  • 在C#中打开路径中有空格的Word文档

    我有这条路 path Cash Report 30 03 2012 01 11 07 Cash Flow Report Docx 当我使用下面的代码打开文件时 它会尝试打开每个单词 所以它会尝试打开 cash doc 然后打开 Report
  • 来自 GitHub 的桌面通知

    当我选择的项目出现新推送时 如何获得桌面通知 任何 RSS 阅读器都应该这样做 转到 GitHub 上的仪表板页面 其中显示 您的新闻源 右上角是带有文本 新闻源 的橙色 rss 图标 您可以订阅该图标
  • Python 3,PIL是Pillow的别名吗?

    Windows 7 64 位上的 Python 3 5 我很困惑 如果有人安装Pillow 那么必须使用被取代 卸载的图形库的名称PIL作为它的别名 根据枕头安装说明 http pillow readthedocs io en 3 3 x
  • 从 Storyboard 中初始化的 UIViewController 调用方法 - Objective C

    我是新来的Storyboarding在 Objective C 中 我需要调用方法UIVIewController 前Storyboarding我正在初始化UIViewController in AppDelegate或者只是在那里分配指针
  • 如何将Tomcat的端口从8080改为80?

    我想执行我的网络应用程序http localhost 1 前往conftomcat安装目录下的文件夹 e g C Tomcat 6 0 conf 2 编辑以下标签server xml file
  • 是否可以仅将一个类的 MediaTypeFormatter 更改为 JSON?

    我有一个 Web api 其中全局配置配置为使用 XmlMediaTypeFormatter 我的问题是我不会使用新的控制器扩展此 Web api 而是使用 JsonMediaTypeFormatter 是否可以仅将一个 API 控制器类的
  • 如何以编程方式从共享点文档库下载文件

    在按钮单击事件或链接按钮单击时 我想从共享点文档库下载文档并将其保存到用户的本地磁盘 请帮助我 如果您有任何代码示例 请分享 输出文件的直接链接的问题是 对于某些内容类型 它可能只是在浏览器窗口中打开 如果这不是所需的结果 并且您想要强制保
  • 如何存储 Websphere MQ 消息以实现持久性?

    Websphere MQ 消息存储在数据库还是文件系统中 我可以将其配置为使用 MySQL 吗 WebSphere MQ 持久性始终是分布式平台的本地文件系统 在大型机上 可以在具有耦合设施的 Sysplex 中使用 DB2 数据库 但对于
  • Deno 顶级等待

    正在阅读homepage https deno land 新的 JS 运行时 deno 我看到了下面的代码 import serve from https deno land email protected cdn cgi l email
  • 使用 Gulp 较新版本的 Gulp Vinyl FTP 没有注意到文件中的更改,因此没有部署更新:时区问题

    解决 我构建了一个 gulp 插件来解决这个问题 https www npmjs com package gulp mtime Correction https www npmjs com package gulp mtime correc
  • 如何使用 mvcsitemapprovider 呈现特定站点地图部分

    假设我有站点地图