2013-12-23 36 views
0

我是新来MVCSiteMap,我有一个简单的问题:如何配置MVCSiteMap来实现参数?

我使用的是默认路由的配置是这样的:

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

现在,我想创建和编辑实体同样的动作:

public ActionResult AddEdit(int? id) 
     {} 

所以如果id为null,则意味着加,如果不为空,则操作是编辑。

现在我想让网站地图实现不同于添加和编辑。我试过这个:

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

但似乎不能很好地工作。它总是使用第二个。

我该怎么办? 非常感谢。

回答

0

有2个选项。

选项1

创建一个用于设置preservedRouteParameters =“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”)。