2013-12-10 3 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.

Смежные вопросы