Карта сайта HtmlHelper ASP.NET MVC

Я переписал этот пост, чтобы сделать его более простым. Это код, который я получил 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();
    }
  }
}

которая является измененной версиейэт. Я используюMVC Areas Lib так что я не вижу как MvcSiteMap может работать с этим, так как он больше не работает{controller}/{action} как раньше.

Скажи, у меня есть страница, похожая наhttp://localhost/mycontroller/myaction и он существует в SiteMap, то меню будет сгенерировано нормально. Но скажи, что я делаюhttp://localhost/mycontroller/myaction/50 и укажите параметр, генератор SiteMap больше не будет работать, поскольку этот URL не существует.руководств не покрываетMVC Areas Lib, поэтому решение этой проблемы не работает.

Ответы на вопрос(4)

 Manfred01 июл. 2014 г., 08:11
Новое местоположение проекта: Github.com / maartenba / MvcSiteMapProvider
 Kezzer09 июл. 2009 г., 11:14
Тестировал это сегодня, он определенно не будет работать, потому что MvcSiteMap работает на основе {controller} / {action}, а не area / {controller} / {action}.
 Kezzer14 окт. 2009 г., 10:19
Гах, я использую это сейчас, так как у него есть поддержка областей, но я не могу пометить ваш ответ как правильный:
 Kezzer08 июл. 2009 г., 09:56
Да, но я использую области lib, поэтому не понимаю, как это сработает.

Изменить набор 24979 реализует поддержку области.

"Определение узлов карты сайта"

...

area | Необязательно | Область указанного контроллера, на которую должен ссылаться уз

...

 Kezzer10 авг. 2009 г., 11:43
Я просил об этом;)

в asp.net SiteMap реализован в значительной степени, в отличие от «нестандартной» реализации в asp.net mvc :). Я должен также выбрать для своего приложения, как организовать карту сайта. Я думаю, что это решение далеко не идеальное и элегантное, но оно мне кажется очень хорошим. В моем объекте представления данных Base, который я использую для отображения данных в представлении, я делаю все эти функциональные возможности свободно для удобства (я люблю беглый код), поэтому есть метод, который генерирует жестко закодированный путь в зависимости от '' ссылка''. Так что же такое ссылка ?, ссылка представляет собой статический класс со всеми моими ссылками на моем сайте. Так, например, ваш:

http://localhost/myarea/contract/viewcontract/12

In '' links '' означает: Links.ContractView, и в моем контроллере что-то вроде этого:

BaseDV.SetPageMapBasedOnLink(Links.ContractView)

и в SetPageMapBasedOnLink у вас есть переключатель, который на основе значения ссылки устанавливает соответствующий заголовок или что вы хотите. Я надеюсь, у вас есть идея, и это поможет вам решить!

 Kezzer07 июл. 2009 г., 13:13
Если вы проверите мое редактирование, вы увидите, что оно автоматически создает мое меню на основе HtmlHelper, как рекомендовано в статье, на которую я ссылался. Я не уверен, исходя из вашего перевода, как это будет работать лично для меня. Однако я вижу идею, стоящую за этим.

заключается в разделении интересов, поэтому при заполнении объекта StringBuilder вы немного упускаете суть. Я ожидаю, что код вернет коллекцию всех возможных узлов, а затем вы отправите ее в свой View, и он выполнит фактическую разметку HTML.

Теперь причина, по которой вы не можете заставить ... / myaction / {id} работать, возможно, в том, что SiteMapNode не знает о вашей структуре данных - только о маршрутах в вашем приложении. Если они заставили это работать вhttp: //mvcsitemap.codeplex.com возможно, стоит посмотреть, но я думаю, что нет. Вы должны будете заполнить эту область самостоятельно (например, для каждого узла, у которого есть параметр, проверьте, что это за узел, и загрузите все возможные значения из вашего хранилища данных). И снова - передавайте объекты обратно из вашего вспомогательного класса, а не HTML.

 Kezzer12 июл. 2009 г., 09:41
MvcSiteMap работает, но только против приложений, не относящихся к области. MvcSiteMap никогда не разрабатывался и не знал областей, поскольку это сторонняя библиотека, разработанная кем-то другим. Код может быть немного не по пути, но я на самом деле взял это из примера Microsoft MVC для создания карты сайта.
 synhershko12 июл. 2009 г., 17:20
Это были только мои 2 цента за то, как все должно быть сделано правильно с MVC. Прочитайте записи в блоге ScottGu, если вы недостаточно знакомы с концепциями.

Ваш ответ на вопрос