如何配置MVCSiteMap来实现参数?

时间:2013-12-23 04:46:48

标签: mvcsitemapprovider

我是MVCSiteMap的新手,我有一个简单的问题:

我使用默认路由配置如下:

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

现在在我的控制器中,我想在同一个Action中创建和编辑一个实体:

public ActionResult AddEdit(int? id)
        {}

因此,如果id为null,则表示添加,如果不为null,则操作为edit。

现在我希望站点地图能够实现与添加和编辑不同的功能。我试过这个:

<mvcSiteMapNode title="Parent" controller="Class" action="Index">
      <mvcSiteMapNode title="Add" controller="Class" action="AddEdit" />
      <mvcSiteMapNode title="Edit" controller="Class" action="AddEdit" inheritedRouteParameters="Id"/>
    </mvcSiteMapNode>

但似乎效果不好。它总是使用第二个。

我该怎么办? 非常感谢。

1 个答案:

答案 0 :(得分:0)

有两种选择。

选项1

创建一个节点,在每个与带参数的操作方法对应的节点上设置savedRouteParameters =“id”。这在节点和操作方法之间创建了一对一的关系,但在节点和实际实体之间建立了一对多的关系。

<mvcSiteMapNode title="Products" controller="Product" action="Index">
    <mvcSiteMapNode title="Create New" controller="Product" action="Create" visibility="SiteMapPathHelper,!*" />
    <mvcSiteMapNode title="Details" controller="Product" action="Details" visibility="SiteMapPathHelper,!*" preservedRouteParameters="id">
        <mvcSiteMapNode title="Edit" controller="Product" action="Edit" visibility="SiteMapPathHelper,!*" key="Product_Edit" preservedRouteParameters="id"/>
        <mvcSiteMapNode title="Delete" controller="Product" action="Delete" visibility="SiteMapPathHelper,!*" preservedRouteParameters="id"/>
    </mvcSiteMapNode>
</mvcSiteMapNode>

如果您要创建编辑数据的页面,这是推荐的方法,特别是如果这些页面永远不会被搜索引擎编入索引。

在大多数情况下,您还需要设置FilteredSiteMapNodeVisibilityProviderSiteMapTitleAttribute来修复节点的可见性和标题。除了面包屑跟踪之外,您将无法使用此方法,因此将这些假节点隐藏在其他HTML帮助程序(如Menu和SiteMap)中非常重要。

有关如何完成此操作的完整演示,请访问如何制作MvcSiteMapProvider Remember a User's Position

选项2

使用自定义IDynamicNodeProvider为每个实体创建一个节点(1对1关系)。

public class StoreDetailsDynamicNodeProvider 
    : DynamicNodeProviderBase 
{ 
    public override IEnumerable<DynamicNode> GetDynamicNodeCollection(ISiteMapNode node) 
    {
        using (var storeDB = new MusicStoreEntities())
        {
            // Create a node for each album 
            foreach (var album in storeDB.Albums.Include("Genre")) 
            { 
                DynamicNode dynamicNode = new DynamicNode(); 
                dynamicNode.Title = album.Title; 
                dynamicNode.ParentKey = "Genre_" + album.Genre.Name; 
                dynamicNode.RouteValues.Add("id", album.AlbumId);

                yield return dynamicNode;
            }
        }
    } 
}

要使用此功能,您需要确保在代码中设置密钥和父密钥,以便每个节点都了解它所属的父节点。您可能需要在XML中显式设置“key”属性才能执行此操作。您还需要确保在每条记录上设置“id”routeValue,以确保您的节点与您的传入路由匹配。

当您的网页必须由搜索引擎编入索引和/或您想要查看菜单中的节点时,请使用此方法。

请注意,您可以在同一个应用程序中组合这两个选项,它可以正常工作。这两种方法也适用于任意数量的自定义路由值(“id”除外)。