【问题标题】:MvcSiteMapProvider MVC5 External URL Re-routing to Home Controller / Index MethodMvcSiteMapProvider MVC5 外部 URL 重新路由到主控制器/索引方法
【发布时间】:2015-06-10 17:50:00
【问题描述】:

我正在使用 MvcSiteMapProvider 4.6.18。我的许多菜单项都链接到外部站点;但是,mvcSiteMapNode 的“url”属性没有被转移到菜单中。也就是说,我可以在源代码中看到 url,但链接指的是父 mvcSiteMapNode 控制器和操作,而不是我指定的 url。

以下是相关代码:

<?xml version="1.0" encoding="utf-8" ?>
<mvcSiteMap xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xmlns="http://mvcsitemap.codeplex.com/schemas/MvcSiteMap-File-4.0"
  xsi:schemaLocation="http://mvcsitemap.codeplex.com/schemas/MvcSiteMap-File-4.0 MvcSiteMapSchema.xsd">

<mvcSiteMapNode title="Home" controller="Home" action="Index">
    <mvcSiteMapNode title="About" url="http://www.amazon.com"/>
</mvcSiteMapNode>

</mvcSiteMap>

这是我在查看源代码时看到的:

<li>
    <a href="/"><span class="menu-text">About</span></a>
</li>

url 使用什么并不重要,它总是指向根目录(即 Home)。

似乎我缺少一些简单的东西。但是对于我的生活,我无法弄清楚。 为了完整起见,这是我的 RouteConfig:

public class RouteConfig
{
    public static void RegisterRoutes(RouteCollection routes)
    {
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

        routes.MapRoute(
            name: "Default",
            url: "{controller}/{action}/{id}",
            defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
        );
    }
}

任何帮助将不胜感激。

更新

感谢@NightOwl888,问题出在其中一个显示模板上。 mvcSiteMapProvider 是我从 wrapbootstrap 下载的引导主题模板的一部分,并且不认为将显示模板视为可能的问题。

这是有问题的模板,从原始 NuGet 下载修改为使用自定义侧栏菜单。

@model MvcSiteMapProvider.Web.Html.Models.MenuHelperModel
@using System.Web.Mvc.Html
@using MvcSiteMapProvider.Web.Html.Models

<ul class="nav sidebar-menu">
   @ShowMenu(Model.Nodes)
</ul>

@helper ShowMenu(IEnumerable<SiteMapNodeModel> menuItems)
{
   foreach (var node in menuItems)
   {
      var nodeclass = "";
      if (node.IsCurrentNode)
      {
         nodeclass = "active";
      }
      if (node.Children.Any(n => n.IsCurrentNode))
      {
         nodeclass = "active open";
      }
      else if (node.Children.Any())
      {
         foreach (var c in node.Children)
         {
            if (c.Children.Any())
            {
               if (c.Children.Any(n => n.IsCurrentNode))
               {
                  nodeclass = "active open";
               }
            }
         }
      }
      <li class="@(!string.IsNullOrEmpty(nodeclass) ? Html.Raw(nodeclass) : null)">
         @if (node.Children.Any())
         {
            @Html.Bootstrap().SidebarMenuItem(node.Title, node.Area, node.Action, node.Controller).Icon(node.ImageUrl).IsDropDown();
         }
         else
         {
            @Html.Bootstrap().SidebarMenuItem(node.Title, node.Area, node.Action, node.Controller).Icon(node.ImageUrl);
         }
         @if (node.Children.Any())
         {
            <ul class="submenu">
               @ShowMenu(node.Children)
            </ul>
         }
      </li>
   }
}

【问题讨论】:

  • 您好,它是自动创建网站还是我们必须手动创建?
  • 不确定您所说的“它会自动创建网站”是什么意思。菜单创建得很完美,除了它似乎忽略了 url 属性。
  • 意味着当我从 nuget 安装它时,它是否会根据所有视图和控制器生成站点地图,或者我们必须定义 n 写入它们
  • 当我从 NuGet 安装时,它创建了一个我在上面发布的默认站点地图。我修改了 About 节点来测试一个外部 url。我还没有任何其他控制器或视图。

标签: asp.net-mvc-5 mvcsitemapprovider


【解决方案1】:

MvcSiteMapProviderHTML helpers 驱动。由于我无法重现 v4.6.18 和 MVC5 的问题,我怀疑您没有在视图中添加一个。

一个典型的例子是将菜单 HTML 帮助程序添加到您的/Views/Shared/_Layout.cshtml 页面,如下所示。

<div class="navbar-collapse collapse">
    @*<ul class="nav navbar-nav">
        <li>@Html.ActionLink("Home", "Index", "Home")</li>
        <li>@Html.ActionLink("About", "About", "Home")</li>
        <li>@Html.ActionLink("Contact", "Contact", "Home")</li>
    </ul>*@
    @* Use the MvcSiteMapProvider Menu HTML helper *@
    @Html.MvcSiteMap().Menu()
    @Html.Partial("_LoginPartial")
</div>

提示:如果您将 MvcSiteMapProvider.Web 包更新到版本 4.6.18,Bootstrap CSS 类将在 Menu HTML 帮助器上输出,因此它将与默认的 MVC 5 主题混合。从包管理器控制台运行命令PM&gt; Update-Package MvcSiteMapProvider.Web -Safe 进行更新。

【讨论】:

  • 我的 _layout.cshtml 文件中确实有 HTML 帮助程序,并且菜单显示得很好。我的问题是 url 属性。无论我使用什么网址,该网址都不会应用于菜单。所以在我上面的例子中,我希望 About 菜单项会导航到 amazon.com;然而,事实并非如此。沿着这条线的某个地方,我指定的 url 被删除并导致我在上面发布的输出 - 参考我帖子的“这是我在查看源代码时看到的内容:”部分。基本上,url被替换为“/”
  • Here is a demo 显示它工作正常。针对这个项目检查你的配置,尤其是 MvcSiteMapProvider 的 packages.config 和 /Views/Shared/DisplayTemplates/ 中的模板。
  • 我已将范围缩小到 MenuHelperModel.cshtml 文件。我的实际上与默认值不同。我会用我的发现更新我原来的帖子。感谢您的帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多