我是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>
但似乎效果不好。它总是使用第二个。
我该怎么办? 非常感谢。
答案 0 :(得分:0)
有两种选择。
创建一个节点,在每个与带参数的操作方法对应的节点上设置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>
如果您要创建编辑数据的页面,这是推荐的方法,特别是如果这些页面永远不会被搜索引擎编入索引。
在大多数情况下,您还需要设置FilteredSiteMapNodeVisibilityProvider和SiteMapTitleAttribute来修复节点的可见性和标题。除了面包屑跟踪之外,您将无法使用此方法,因此将这些假节点隐藏在其他HTML帮助程序(如Menu和SiteMap)中非常重要。
有关如何完成此操作的完整演示,请访问如何制作MvcSiteMapProvider Remember a User's Position。
使用自定义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”除外)。