如何为 mvcSiteMapNodes 提供默认 url

How to provide default url for mvcSiteMapNodes

我有一些节点是严格导航的。到目前为止,我已经通过使用 "navigation node" 路线并在仅导航节点上显式设置 url (~/Home/*) 来处理此问题。它工作正常。这允许我拥有一个菜单层次结构,而不必为每个仅导航菜单项(这将是愚蠢的)添加虚拟,同时允许它们显示在菜单和面包屑层次结构中。

Mvc.sitemap

  <mvcSiteMapNode title="Home" controller="Home" action="Index" >
    <mvcSiteMapNode title="Products" url="~/Home/Products"   roles="*">
      <mvcSiteMapNode title="Shampoo MAX" url="~/Home/Products/ShampooMAX" >
        <mvcSiteMapNode title="Policies" controller="Object" action="List" type="Policy" >
        </mvcSiteMapNode>
        <mvcSiteMapNode title="Quotes"  controller="Object" action="List" >
        </mvcSiteMapNode>
        <mvcSiteMapNode title="Claims"  controller="Object" action="List">
        </mvcSiteMapNode>
      </mvcSiteMapNode>
    </mvcSiteMapNode>
    <mvcSiteMapNode title="Documents" controller="Document" action="Index" />
    <mvcSiteMapNode title="Forms" controller="Form" action="Index"/>
    <mvcSiteMapNode title="Links" url="~/Home/Links" roles="*">
      <mvcSiteMapNode url="https://interfarina.com/login#login" targetFrame="_blank"   title="Quoting" roles="*"/>
      <mvcSiteMapNode url="https://drive.google.com/file/d/asdfsdfsdfsdfs/view" targetFrame="_blank"   title="Downloadable App" roles="*"/>
      <mvcSiteMapNode url="https://gumbysafety.com/app/user/login" targetFrame="_blank"   title="Sales Tools" roles="*"/>
    </mvcSiteMapNode>
  </mvcSiteMapNode>

RouteConfig.cs

  routes.MapRoute(
      name: "Navigation-Only Node",
      url: "Home/{*url}",
      defaults: new { controller = "Home", action = "Index" }
  );

我想稍微清理一下我的 Mvc.sitemap 文件,方法是从仅导航节点中删除所有 urls 并捕获一些事件或覆盖一些我可以在其中生成 url 为节点。如您所见,这些节点的 url 可以从祖先和自身头衔生成。

我不确定 documentation 是否解决了这个问题。

如果您的菜单中有仅存在于客户端的节点,那么您根本不应该将它们放入 SiteMapSiteMap 有点像分层数据库 - 你不应该在数据库中放置任何 UI 逻辑。

相反,您应该在 /Views/Shared/DisplayTemplates/ 文件夹中编辑显示模板(或为不同的场景创建不同的模板)。这些模板的目的是让您可以控制 HTML 助手输出的 HTML。

您可能需要添加一两个 custom attribute 以打开和关闭显示逻辑的特定部分,但这可以在 "real"(服务器端)导航位置之间完成在你的 SiteMap.