2013-12-23 34 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」)。