7
votes

MvcsitemApprovider - plusieurs pages doivent être liées à un noeud de menu

Dans mon projet MVC3 strong>, j'ai installé MVCSitemAlvider V.3.2.1 de Maartenba Strong> et j'ai un menu très simple, statique, à deux niveaux que j'ai créé. Vous trouverez ci-dessous la structure de carte conceptuelle.

@model SiteMapNodeModel
  <a href="@Model.Url" class="@(Model.IsCurrentNode ? "selectedMenuItem" : "")">@Model.Title</a>


0 commentaires

3 Réponses :


6
votes

Vous pouvez ajouter des nœuds de 3ème niveau au site XML du site XML et spécifier la visibilité pour les masquer dans le menu. Voici la déclaration de nœud pour l'afficher uniquement dans la chapelure: xxx

edit:

Autant que je sache, vous ne pouvez pas définir IscurrentNode. Mais vous pouvez vérifier si le nœud de menu est actuellement sélectionné avec le code suivant (je l'utilise dans le modèle d'affichage SitemapNodemodel): xxx


1 commentaires

Max, merci beaucoup! Cela résout le problème de base des nœuds de 2e niveau disparaissant. Cependant, est-ce qu'il y a de toute façon que vous savez avoir le noeud de deuxième niveau défini sur IscurrentNode lorsque cela se produit? Par exemple, j'aimerais que le nœud de la liste des membres indique comme sélectionné lors de la page Détails du membre. Sinon, ce n'est pas une affaire énorme ... juste une demande esthétique.



1
votes

Ajout à la réponse de Max, je créerais également une méthode d'extension pour Sitemapnodemodel. Que vous pouvez utiliser pour implémenter toute la logique personnalisée nécessaire pour le faire:

/* Also check IsRealCurrentNode, depending on the use case maybe only
IsRealCurrentNode */
@if ((Model.IsCurrentNode || Model.IsRealCurrentNode()) && Model.SourceMetadata["HtmlHelper"].ToString() != "MvcSiteMapProvider.Web.Html.MenuHelper")  { 
  <text>@Model.Title</text>
} else if (Model.IsClickable) { 
  <a href="@Model.Url ">@Model.Title</a>
} else { 
  <text>@Model.Title</text>
}


0 commentaires

1
votes

Suite à la réponse de Max Kiselev, si vous souhaitez utiliser cette technique, mais être capable d'utiliser des attributs sur vos actions de contrôleur, j'ai procédé aux éléments suivants:

Définissez un fournisseur de visibilité personnalisé: P>

[HttpGet]
[InvisibleMvcSiteMapNodeAttribute("ThisNodeKey", "ParentNodeKey")] 
public ViewResult OrderTimeout()
{
    return View("Timeout");
}


0 commentaires