2013-12-10 134 views
0

我希望我能做到以下幾點:@Html.MvcSiteMap().PageMenu()而不是@Html.MvcSiteMap().Menu("MenuBtnGroup")如何創建新模型?

主要是因爲過濾器。

我希望某個環節只出現在頁面上,或在主應用程序菜單

<mvcSiteMapNode title="Usuários" controller="Usuarios" action="Index"> 
    <mvcSiteMapNode title="Novo Usuário" action="Novo" visibility="SiteMapPathHelper,PAGEMENU-ONLY,!*" /> 
    <mvcSiteMapNode title="Detalhes" action="Detalhes" visibility="SiteMapPathHelper,!*" dynamicNodeProvider="UsuarioDynamicNodeProvider, Web"> 
     <mvcSiteMapNode title="Editar" action="Editar" inheritedRouteParameters="id" /> 
    </mvcSiteMapNode> 
</mvcSiteMapNode> 

回答

1

這個功能不是內置(還)網站地圖,並沒有,但有一個辦法通過構建自己的可見性提供者並使用SourceMetaData將菜單的名稱傳遞到可見性邏輯來實現。

/// <summary> 
/// Filtered SiteMapNode Visibility Provider for use with named controls. 
/// 
/// Rules are parsed left-to-right, first match wins. Asterisk can be used to match any control or any control name. Exclamation mark can be used to negate a match. 
/// </summary> 
public class CustomFilteredSiteMapNodeVisibilityProvider 
    : SiteMapNodeVisibilityProviderBase 
{ 
    #region ISiteMapNodeVisibilityProvider Members 

    /// <summary> 
    /// Determines whether the node is visible. 
    /// </summary> 
    /// <param name="node">The node.</param> 
    /// <param name="sourceMetadata">The source metadata.</param> 
    /// <returns> 
    ///  <c>true</c> if the specified node is visible; otherwise, <c>false</c>. 
    /// </returns> 
    public override bool IsVisible(ISiteMapNode node, IDictionary<string, object> sourceMetadata) 
    { 
     // Is a visibility attribute specified? 
     string visibility = string.Empty; 
     if (node.Attributes.ContainsKey("visibility")) 
     { 
      visibility = node.Attributes["visibility"].GetType().Equals(typeof(string)) ? node.Attributes["visibility"].ToString() : string.Empty; 
     } 
     if (string.IsNullOrEmpty(visibility)) 
     { 
      return true; 
     } 
     visibility = visibility.Trim(); 

     // Check for the source HtmlHelper 
     if (sourceMetadata["HtmlHelper"] == null) 
     { 
      return true; 
     } 
     string htmlHelper = sourceMetadata["HtmlHelper"].ToString(); 
     htmlHelper = htmlHelper.Substring(htmlHelper.LastIndexOf(".") + 1); 

     string name = sourceMetadata["name"].ToString(); 

     // All set. Now parse the visibility variable. 
     foreach (string visibilityKeyword in visibility.Split(new[] { ',', ';' })) 
     { 
      if (visibilityKeyword == htmlHelper || visibilityKeyword == name || visibilityKeyword == "*") 
      { 
       return true; 
      } 
      else if (visibilityKeyword == "!" + htmlHelper || visibilityKeyword == "!" + name || visibilityKeyword == "!*") 
      { 
       return false; 
      } 
     } 

     // Still nothing? Then it's OK! 
     return true; 
    } 

    #endregion 
} 

然後,你可以給他們一個「名」 SourceMetadata屬性名稱每個菜單。

@Html.MvcSiteMap().Menu(new { name = "MainMenu" }) 
@Html.MvcSiteMap().Menu(new { name = "PageMenu" }) 

然後在您的配置中使用CustomFilteredSiteMapVisibilityProvider而不是FilteredVisibilityProvider。完整示例請參見this answer