MvcSiteMapProvider MVC5 外部 URL 重新路由到家庭控制器/索引方法
MvcSiteMapProvider MVC5 External URL Re-routing to Home Controller / Index Method
我正在使用 MvcSiteMapProvider 4.6.18。我的许多菜单项 link 到外部站点;但是,mvcSiteMapNode 的 "url" 属性没有被转移到菜单中。也就是说,我可以在源代码中看到 url,但 link 指的是父 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 下载的 bootstrap 主题模板的一部分,并不认为将显示模板视为一个可能的问题。
这是有问题的模板,修改自原始 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>
}
}
MvcSiteMapProvider
由 HTML 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>
TIP: If you update your MvcSiteMapProvider.Web
package to version 4.6.18, the Bootstrap CSS classes will be output on the Menu HTML helper, so it will blend with the default MVC 5 theme. Run the command PM> Update-Package MvcSiteMapProvider.Web -Safe
from the Package Manager Console to update.
我正在使用 MvcSiteMapProvider 4.6.18。我的许多菜单项 link 到外部站点;但是,mvcSiteMapNode 的 "url" 属性没有被转移到菜单中。也就是说,我可以在源代码中看到 url,但 link 指的是父 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 下载的 bootstrap 主题模板的一部分,并不认为将显示模板视为一个可能的问题。
这是有问题的模板,修改自原始 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>
}
}
MvcSiteMapProvider
由 HTML 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>
TIP: If you update your
MvcSiteMapProvider.Web
package to version 4.6.18, the Bootstrap CSS classes will be output on the Menu HTML helper, so it will blend with the default MVC 5 theme. Run the commandPM> Update-Package MvcSiteMapProvider.Web -Safe
from the Package Manager Console to update.