SiteMap HtmlHelper ASP.NET MVC
J'ai réécrit ce post pour le rendre plus simple. C'est le code que j'ai (un HtmlHelper
):
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Runtime.CompilerServices;
using System.Web.Mvc;
using System.Text;
using System.Web.Routing;
namespace Intranet.Helpers
{
public static class MenuHelper
{
private static string GetBackLink(SiteMapNode parentNode)
{
return "<li class='li-back'><a href='" + parentNode.Url + "' title='" + parentNode.Title + "'></a></li>";
}
public static string Menu(this HtmlHelper helper)
{
var sb = new StringBuilder();
SiteMapNodeCollection siteMapNodeCollection;
sb.Append("<ul>");
SiteMapNode currentNode = SiteMap.CurrentNode;
if (!SiteMap.CurrentNode.Equals(SiteMap.RootNode))
{
if (!SiteMap.CurrentNode.HasChildNodes)
sb.Append(GetBackLink(SiteMap.CurrentNode.ParentNode.ParentNode));
else
sb.Append(GetBackLink(SiteMap.CurrentNode.ParentNode));
}
if (!SiteMap.CurrentNode.HasChildNodes)
siteMapNodeCollection = SiteMap.CurrentNode.ParentNode.ChildNodes;
else
siteMapNodeCollection = SiteMap.CurrentNode.ChildNodes;
foreach (SiteMapNode node in siteMapNodeCollection)
{
if(node.Description.Equals("hidden")) continue;
if (node.Url.Length == 0 && node.Description.Equals("separator"))
sb.Append("<li class=\"li-separator\"></li>");
else if (node.Url.Length == 0 && node.Description.Equals("heading"))
sb.Append("<li class=\"li-heading\">" + node.Title + "</li>");
else
{
if (node.HasChildNodes)
{
if (node.NextSibling != null)
sb.Append("<li class=\"li-sub\"><a href=\"" + node.Url + "\">" + node.Title + "</a></li>");
else
sb.Append("<li class=\"li-sub last-child\"><a href=\"" + node.Url + "\">" + node.Title + "</a></li>");
}
else
{
if (node.NextSibling != null)
sb.Append("<li><a href='" + node.Url + "'>" + node.Title + "</a></li>");
else
sb.Append("<li class='last-child'><a href='" + node.Url + "'>" + node.Title + "</a></li>");
}
}
}
sb.Append("</ul>");
return sb.ToString();
}
}
}
qui est une version modifiée de cette. Je suis en utilisant MVC Zones Lib donc je ne vois pas comment MvcSiteMap peut travailler avec ce que ça ne fonctionne plus par {controller}/{action}
comme il l'a fait avant.
Dire que j'ai une page comme http://localhost/mycontroller/myaction
et il existe dans le SiteMap, puis le menu sera bien généré. Mais dire que je ne http://localhost/mycontroller/myaction/50
et spécifier un paramètre, le générateur de SiteMap ne fonctionne plus parce que cette URL n'existe pas. Le tutoriel ne couvre pas MVC Zones Lib, de sorte que la solution à ce problème ne fonctionne pas.
OriginalL'auteur Kezzer | 2009-07-02
Vous devez vous connecter pour publier un commentaire.
Caisse MvcSitemap sur Codeplex
Testé aujourd'hui, il ne fonctionnera certainement pas parce que MvcSiteMap fonctionne sur la base de {controller}/{action}, par opposition à la zone/{controller}/{action}.
Gah, je suis en utilisant ce maintenant qu'il a des zones de soutien, mais je ne peux pas marquer votre réponse en droit:
Nouvel emplacement du projet: github.com/maartenba/MvcSiteMapProvider
OriginalL'auteur Matthew
Il est temps de se réjouir: Changement 24979 implémente de soutien de secteur.
OriginalL'auteur Larry
look, en asp.net le SiteMap est grandement mis en œuvre à la différence, c'est "non standard" de la mise en œuvre de asp.net mvc :). J'ai à choisir aussi pour mon application comment organiser un plan du site. Je pense que cette solution est loin d'être idéal et élégant, mais il semble très agréable pour moi. Dans ma Base de données de la vue de l'objet que j'utilise pour l'affichage des données sur le point de vue-je faire de toutes ces fonctionnalités couramment pour le bien de produits de base (j'aime couramment le code ), donc il y a t-il une méthode qui génère codé en dur chemin dans dependanse de "lien". Alors, quel est le lien?, le lien représente une classe statique avec tous mes liens dans mon site. Ainsi, par exemple, votre :
Dans "liens" signifie: Liens.ContractView et dans mon contrôleur, j'ai qch comme ceci:
et dans SetPageMapBasedOnLink vous avez un interrupteur sur la base de Liens de valeur définit le titre, ou ce que jamais vous le souhaitez.
J'espère que vous avez compris l'idée, et cela vous aidera à décider!
OriginalL'auteur diadiora
Ce code semble un peu hors-piste pour moi. L'idée principale de .NET MVC est de séparer les préoccupations, de sorte que lorsque vous remplissez un objet StringBuilder, vous êtes absent le point un peu. Ce que je m'attendrais est le code de retour d'une collection de toutes les nœuds, puis vous l'envoyez à votre point de Vue et il ne le HTML layouting.
Maintenant, la raison pour laquelle vous ne pouvez pas obtenir .../myaction/{id} pour travailler, c'est probablement parce que SiteMapNode n'est pas au courant de votre structure de données - seulement de les Itinéraires de votre application. Si ils ont fait des travaux dans http://mvcsitemap.codeplex.com/ peut-être que c'valeurs un coup d'oeil, mais ma conjecture est qu'ils n'ont pas. Vous aurez à remplir cette zone vous (par exemple, pour chaque nœud qui possède un paramètre, vérifiez ce nœud, il est et de charger toutes les valeurs possibles à partir de votre magasin de données). Et de nouveau - passer des objets de retour de votre classe d'aide, pas en HTML.
C'était juste mes 2 cents sur la façon de faire les choses correctement avec MVC. Lire ScottGu du blog sur que si vous n'êtes pas assez familiers avec les concepts.
OriginalL'auteur synhershko