我正在使用MvcSiteMapProvider 2.2.1(http://mvcsitemap.codeplex.com),并且当这些子节点具有动态参数(id)时,在动态节点(使用dynamicNodeProvider)下创建子节点时遇到问题.
我正在丢失以下路线的面包屑:
商店/ 5 /产品/编辑/ 23
url模式的位置是:
存储/ {STOREID}/{控制器}/{行动}/{ID}
当ID被省略时(即"新"动作),它可以正常工作.但是当指定ID时,它与路径不匹配,并且我的面包屑(使用SiteMapPath帮助程序)是空白的.
我的站点地图:(已删除)
<?xml version="1.0" encoding="utf-8" ?>
<mvcSiteMap xmlns="http://mvcsitemap.codeplex.com/schemas/MvcSiteMap-File-2.0">
<mvcSiteMapNode title="Home" controller="Dashboard" action="Index" changeFrequency="Always" updatePriority="Normal">
<mvcSiteMapNode title="My Account" controller="Account" action="Index" key="Account" />
<mvcSiteMapNode title="My Stores" area="Stores" controller="Home" action="Index" visibilityProvider="ControlPanel.Areas.Stores.StoreAreaVisibilityProvider, ControlPanel" >
<mvcSiteMapNode title="Store" action="Index" dynamicNodeProvider="ControlPanel.Areas.Stores.StoreAreaNodeProvider, ControlPanel" />
</mvcSiteMapNode>
</mvcSiteMapNode>
</mvcSiteMap>
Run Code Online (Sandbox Code Playgroud)
区域注册:
public override void RegisterArea(AreaRegistrationContext context)
{
context.MapRoute(
"Store_Index",
"Stores",
new { action = "Index", controller = "Home" },
new string[] { "ControlPanel.Areas.Stores.Controllers" }
);
context.MapRoute(
"Store_default",
"Stores/{storeID}/{controller}/{action}/{id}",
new { …
Run Code Online (Sandbox Code Playgroud) 我最近遇到了试图使用MvcSiteMapProvider的路障.
在我的申请中,我有三个不同的领域:着陆,应用和管理.我目前已经实现了MvcSiteMapProvider并且它的工作效果令人惊讶,但我现在要做的是 - 使用Html MvcSiteMap Helper并根据我所在的区域指定不同的地图提供者.
所以,当我:
我尝试过以下方法:
共享 - > _AppLayout.cshtml
@Html.Partial("_Menu")
Run Code Online (Sandbox Code Playgroud)
共享 - > _Menu.cshtml
@{
if (HttpContext.Current != null && HttpContext.Current.Handler is System.Web.Mvc.MvcHandler)
{
var handler = HttpContext.Current.Handler as System.Web.Mvc.MvcHandler;
var currentArea = handler.RequestContext.RouteData.Values["area"] ?? string.Empty;
if (!string.IsNullOrEmpty(currentArea.ToString()))
{
<text>@Html.MvcSiteMap("AppSiteMapProvider").Menu()</text>
}
else if (currentArea.ToString() == "Admin")
{
<text>@Html.MvcSiteMap("AdminSiteMapProvider").Menu()</text>
}
}
Run Code Online (Sandbox Code Playgroud)
}
有什么建议?我不想将_AppLayout.cshtml内容复制/粘贴到一个区域的新主服务器中,我宁愿它动态地选择正确的提供程序.
我在一个项目中使用ASP.NET MVC SiteMap提供程序,它运行良好.我正在努力想弄清楚如何隐藏菜单项.我想隐藏在全局导航中显示的菜单项是我的"站点地图"页面.现在我知道VisibilityProvider
在mvcSiteMapNode上有一些可用的东西 - 但我似乎无法弄清楚如何让它工作.
在我的MVC3项目中,我安装了Maartenba的MvcSiteMapProvider v.3.2.1,并且我创建了一个非常简单的静态两级菜单.下面是概念图结构.
- Home
- Member Center
- Member Listing [SELECTED]
- Event Calendar
- Documents
- Administration
Run Code Online (Sandbox Code Playgroud)
现在,会员列表下有很多子页面(例如详细信息,编辑等),但我不希望这些子页面显示为第3级菜单项(主要是因为它们与特定的成员ID绑定).但是,我确实希望所有这些第三级页面都与"成员列表"菜单节点"绑定",以便在这些页面上显示为已选中.
我的Mvc.SiteMap文件中有以下代码:
<mvcSiteMapNode title="Home" controller="Home" action="Index">
<mvcSiteMapNode title="Member Center" area="Members" controller="Home" action="Index" roles="Approved Member" >
<mvcSiteMapNode title="Member Listing" area="Members" controller="Member" action="List" />
<mvcSiteMapNode title="Event Calendar" area="Members" controller="Event" action="List" />
<mvcSiteMapNode title="Documents" area="Members" controller="Document" action="List" />
</mvcSiteMapNode>
<mvcSiteMapNode title="Administration" area="Admin" controller="Home" action="Index" roles="Site Administrator" >
</mvcSiteMapNode>
</mvcSiteMapNode>
Run Code Online (Sandbox Code Playgroud)
要呈现菜单,我在_Layout.cshtml文件中使用以下代码:
@Html.MvcSiteMap().Menu(1, true, true, 1, true, true)
Run Code Online (Sandbox Code Playgroud)
最后,我修改了SiteMapNodeModel.cshtml文件,以便将"selectedMenuItem"类添加到与用户正在查看的页面相关的节点.这是呈现菜单节点的snippit.
@model SiteMapNodeModel …
Run Code Online (Sandbox Code Playgroud) 根据Google在视频站点地图中定义的内容,应该将一些xml标记添加到视频的站点地图中,它应该是这样的:
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"
xmlns:video="http://www.google.com/schemas/sitemap-video/1.1">
<url>
<loc>http://www.example.com/videos/some_video_landing_page.html</loc>
<video:video>
<video:thumbnail_loc>http://www.example.com/thumbs/123.jpg</video:thumbnail_loc>
<video:title>Grilling steaks for summer</video:title>
<video:description>Alkis shows you how to get perfectly done steaks every
time</video:description>
<video:content_loc>http://www.example.com/video123.mp4</video:content_loc>
<video:player_loc autoplay="ap=1">
http://www.example.com/videoplayer.mp4?video=123</video:player_loc>
<video:duration>600</video:duration>
<video:expiration_date>2009-11-05T19:20:30+08:00</video:expiration_date>
<video:rating>4.2</video:rating>
<video:view_count>12345</video:view_count>
<video:publication_date>2007-11-05T19:20:30+08:00</video:publication_date>
<video:family_friendly>yes</video:family_friendly>
<video:restriction relationship="allow">IE GB US CA</video:restriction>
<video:gallery_loc title="Cooking Videos">http://cooking.example.com</video:gallery_loc>
<video:price currency="EUR">1.99</video:price>
<video:requires_subscription>yes</video:requires_subscription>
<video:uploader info="http://www.example.com/users/grillymcgrillerson">GrillyMcGrillerson
</video:uploader>
<video:live>no</video:live>
</video:video>
Run Code Online (Sandbox Code Playgroud)
我想知道如何动态地将这些自定义标签添加到我的sitemap.xml中?我正在使用mvcsitemapprovider
sitemapprovider google-sitemap mvcsitemapprovider asp.net-mvc-sitemap
我试图使用与内隐本地化MVCSiteMap但它不工作.
这是我的样本Web.Sitemap
:
<?xml version="1.0" encoding="utf-8" ?>
<mvcSiteMap xmlns="http://mvcsitemap.codeplex.com/schemas/MvcSiteMap-File-2.0" enableLocalization="true">
<mvcSiteMapNode title="Home" controller="Home" action="Index" changeFrequency="Always" updatePriority="Normal">
<mvcSiteMapNode resourceKey="Products" title="Products" controller="Products" action="Index">
<mvcSiteMapNode title="Edit" controller="Products" action="Edit" />
</mvcSiteMapNode>
<mvcSiteMapNode title="Categories" controller="Categories" action="Index" />
<mvcSiteMapNode title="Suppliers" controller="Suppliers" action="Index" />
</mvcSiteMapNode>
</mvcSiteMap>
Run Code Online (Sandbox Code Playgroud)
我resourceKey="Products"
在上面的站点地图和相应Products.title
的Web.sitemap.resx
文件App_GlobalResources
夹里面.遵循以下说明:http://msdn.microsoft.com/en-us/library/ms178427(VS.80).aspx
我在这里缺少什么?
这已在变更集52831中实现.
在我的文件中Mvc.sitemap
,有以下节点:
<mvcSiteMapNode title="Contato" controller="Home" action="Contato" classesCustomizadas="quebra contato" />
Run Code Online (Sandbox Code Playgroud)
Web.config文件
attributesToIgnore="visibility, classesCustomizadas"
充分..
<siteMap defaultProvider="MvcSiteMapProvider" enabled="true">
<providers>
<clear />
<add name="MvcSiteMapProvider" type="MvcSiteMapProvider.DefaultSiteMapProvider, MvcSiteMapProvider"
siteMapFile="~/Mvc.Sitemap"
securityTrimmingEnabled="true"
cacheDuration="5"
enableLocalization="true"
scanAssembliesForSiteMapNodes="true"
includeAssembliesForScan=""
excludeAssembliesForScan=""
attributesToIgnore="visibility, classesCustomizadas"
nodeKeyGenerator="MvcSiteMapProvider.DefaultNodeKeyGenerator, MvcSiteMapProvider"
controllerTypeResolver="MvcSiteMapProvider.DefaultControllerTypeResolver, MvcSiteMapProvider"
actionMethodParameterResolver="MvcSiteMapProvider.DefaultActionMethodParameterResolver, MvcSiteMapProvider"
aclModule="MvcSiteMapProvider.DefaultAclModule, MvcSiteMapProvider"
siteMapNodeUrlResolver="MvcSiteMapProvider.DefaultSiteMapNodeUrlResolver, MvcSiteMapProvider"
siteMapNodeVisibilityProvider="MvcSiteMapProvider.FilteredSiteMapNodeVisibilityProvider, MvcSiteMapProvider"
siteMapProviderEventHandler="MvcSiteMapProvider.DefaultSiteMapProviderEventHandler, MvcSiteMapProvider" />
</providers>
</siteMap>
Run Code Online (Sandbox Code Playgroud)
我编辑了文件"SiteMapNodeModel.cshtml",因此他可以按如下方式工作:
@if (Model.IsCurrentNode && Model.SourceMetadata["HtmlHelper"].ToString() != "MvcSiteMapProvider.Web.Html.MenuHelper")
{
<text>@Model.Title</text>
}
else if (Model.IsClickable)
{
<a href="@Model.Url " class=">>>> Classes here <<<<<">@Model.Title</a>
}
else
{
<text>@Model.Title</text>
}
Run Code Online (Sandbox Code Playgroud)
如何在我的文件中配置Mvc.sitemap
属性classesCustomizadas …
我正在使用ASP.NET MVC 4,使用mvcSiteMapProvider来管理我的菜单.
我有一个自定义菜单构建器,用于评估节点是否在当前分支上(即,如果SiteMap.CurrentNode
是CurrentNode或CurrentNode是否嵌套在它下面).代码包含在下面,但基本上检查每个节点的url并将其与currentnode的url进行比较,直到currentnodes"family tree".
我的自定义菜单构建器使用CurrentBranch添加一个类,该类突出显示CurrentBranch上的菜单项.
我的自定义菜单工作正常,但我发现,mvcSiteMapProvider
似乎没有评估url
的CurrentNode
以一致的方式:
当两个节点指向同一个操作并且仅通过操作的参数进行区分时,SiteMap.CurrentNode似乎不使用正确的路径(它忽略区分参数并默认为映射到中定义的操作的第一个路径)节点).
在我的应用程序中Members
.
会员的MemberStatus
字段可以是"未处理","活动"或"非活动".要更改MemberStatus,我ProcessMemberController
在一个名为Admin的区域中有一个.使用上的Process
操作完成处理ProcessMemberController
.
我的mvcSiteMap有两个节点,它们都映射到Process
动作.它们之间的唯一区别是alternate
参数(例如我的客户端的域语义),在一种情况下,其值为"已处理",而在另一种情况下为"未处理":
节点:
<mvcSiteMapNode title="Process" area="Admin" controller="ProcessMembers" action="Process" alternate="Unprocessed" />
<mvcSiteMapNode title="Change Status" area="Admin" controller="ProcessMembers" action="Process" alternate="Processed" />
Run Code Online (Sandbox Code Playgroud)
路线:
这两个节点的相应路由(同样,区别它们的唯一方法是备用参数的值):
context.MapRoute(
"Process_New_Members",
"Admin/Unprocessed/Process/{MemberId}",
new { controller = "ProcessMembers",
action = "Process",
alternate="Unprocessed",
MemberId = UrlParameter.Optional }
);
context.MapRoute(
"Change_Status_Old_Members",
"Admin/Members/Status/Change/{MemberId}",
new { controller = "ProcessMembers",
action …
Run Code Online (Sandbox Code Playgroud) 我想用css类标记当前节点和它的父节点.我在四处搜寻,发现这些链接:
http://mvcsitemap.codeplex.com/discussions/257786 http://mvcsitemap.codeplex.com/discussions/245000
所以我修改了SiteMapNodeModelList.cshtml,现在突出显示当前节点.但不知道我应该如何突出显示父节点.
<ul>
@foreach (var node in Model) {
<li class="@(node.IsCurrentNode ? "current" : "")" >@Html.DisplayFor(m => node)
@if (node.Children.Any()) {
@Html.DisplayFor(m => node.Children)
}
</li>
}
</ul>
Run Code Online (Sandbox Code Playgroud)
为了标记父节点,我构建了一个扩展方法来检查所有直接子元素(我只有2个级别):
public static bool IsCurrentNodeOrChild(this SiteMapNodeModel node)
{
if (node.IsCurrentNode) return true;
return node.Children.Any(n => n.IsCurrentNode);
}
Run Code Online (Sandbox Code Playgroud)
并改变了MenuHelperModel.cshtml,如下所示:
<ul id="menu">
@foreach (var node in Model.Nodes) {
<li class="@(node.IsCurrentNodeOrChild() ? "current" : "d")" >@Html.DisplayFor(m => node)
@if (node.Children.Any()) {
@Html.DisplayFor(m => node.Children)
}
</li>
}
</ul>
Run Code Online (Sandbox Code Playgroud)
这现在完美无缺.但是真的没有更简单的方法吗?难道不能成为世界上第一个需要这个的人吗?
我正在使用MvcSiteMapProvider MVC5和我的Web应用程序,并在我正在使用的_Layout.cshtml文件中:
@if (Html.MvcSiteMap().SiteMap.CurrentNode != Html.MvcSiteMap().SiteMap.RootNode)
{
@Html.MvcSiteMap().SiteMapPath()
}
Run Code Online (Sandbox Code Playgroud)
但Intellisence抛出了这个错误:
System.Web.Mvc.HtmlHelper does not contain a definition for MvcSiteMap
Run Code Online (Sandbox Code Playgroud)
有谁知道如何解决这个问题?