标签: mvcsitemapprovider

在MvcSiteMapProvider中为具有动态参数的DynamicNode创建子节点

我正在使用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)

c# asp.net asp.net-mvc asp.net-mvc-2 mvcsitemapprovider

19
推荐指数
1
解决办法
9848
查看次数

使用多个MvcSiteMaps

我最近遇到了试图使用MvcSiteMapProvider的路障.

在我的申请中,我有三个不同的领域:着陆,应用和管理.我目前已经实现了MvcSiteMapProvider并且它的工作效果令人惊讶,但我现在要做的是 - 使用Html MvcSiteMap Helper并根据我所在的区域指定不同的地图提供者.

所以,当我:

  • 在"Admin"区域中 - 我想使用名为"AdminSiteMapProvider"的提供程序.
  • 在"应用程序"区域中 - 我想使用名为"AppSiteMapProvider"的提供程序.

我尝试过以下方法:

共享 - > _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内容复制/粘贴到一个区域的新主服务器中,我宁愿它动态地选择正确的提供程序.

c# asp.net-mvc mvcsitemapprovider

8
推荐指数
3
解决办法
6958
查看次数

ASP.NET MVC SiteMap提供程序 - 如何在实际菜单中"隐藏"单个项目

我在一个项目中使用ASP.NET MVC SiteMap提供程序,它运行良好.我正在努力想弄清楚如何隐藏菜单项.我想隐藏在全局导航中显示的菜单项是我的"站点地图"页面.现在我知道VisibilityProvider在mvcSiteMapNode上有一些可用的东西 - 但我似乎无法弄清楚如何让它工作.

asp.net-mvc visibility menu nodes mvcsitemapprovider

8
推荐指数
2
解决办法
8942
查看次数

MvcSiteMapProvider - 多个页面需要链接到一个菜单节点

在我的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)

asp.net-mvc mvcsitemapprovider

7
推荐指数
1
解决办法
3918
查看次数

如何使用mvcsitemapprovider将自定义xml标记添加到sitemap.xml?

根据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

7
推荐指数
1
解决办法
316
查看次数

如何使用MVCSiteMap进行隐式本​​地化?

我试图使用与内隐本地化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.titleWeb.sitemap.resx文件App_GlobalResources夹里面.遵循以下说明:http://msdn.microsoft.com/en-us/library/ms178427(VS.80).aspx

我在这里缺少什么?

编辑

这已在变更集52831中实现.

asp.net-mvc mvcsitemapprovider

6
推荐指数
1
解决办法
5174
查看次数

MvcSiteMap提供程序中的自定义属性

在我的文件中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

6
推荐指数
1
解决办法
3399
查看次数

MVC SiteMap - 当不同节点指向同一个动作时,SiteMap.CurrentNode不会映射到正确的路径

建立:

我正在使用ASP.NET MVC 4,使用mvcSiteMapProvider来管理我的菜单.

我有一个自定义菜单构建器,用于评估节点是否在当前分支上(即,如果SiteMap.CurrentNode是CurrentNode或CurrentNode是否嵌套在它下面).代码包含在下面,但基本上检查每个节点的url并将其与currentnode的url进行比较,直到currentnodes"family tree".

我的自定义菜单构建器使用CurrentBranch添加一个类,该类突出显示CurrentBranch上的菜单项.

问题:

我的自定义菜单工作正常,但我发现,mvcSiteMapProvider似乎没有评估urlCurrentNode以一致的方式:

当两个节点指向同一个操作并且仅通过操作的参数进行区分时,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)

asp.net-mvc-4 mvcsitemapprovider

6
推荐指数
1
解决办法
5897
查看次数

MVCSitemapProvider指示当前节点和父节点

我想用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)

这现在完美无缺.但是真的没有更简单的方法吗?难道不能成为世界上第一个需要这个的人吗?

c# asp.net-mvc mvcsitemapprovider asp.net-mvc-sitemap

6
推荐指数
2
解决办法
3240
查看次数

System.Web.Mvc.HtmlHelper不包含MvcSiteMap的定义

我正在使用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)

有谁知道如何解决这个问题?

c# asp.net-mvc mvcsitemapprovider

6
推荐指数
1
解决办法
7281
查看次数