Работа с дочерними узлами dynamicNodeProvider - PullRequest
3 голосов
/ 24 декабря 2011

Я использую этот проект для генерации пути к карте сайта.

В моем приложении я бы хотел, чтобы путь карты сайта оставался следующим:

Путь: Home > Projects > {project-name}
URL: /projects/{url-project}

Путь: Home > Projects > {project-name} > Photos
URL: /projects/{url-project}/photos

Путь: Home > Projects > {project-name} > Addresses
URL: /projects/{url-project}/addresses

Путь: Home > Projects > {project-name} > Admin
URL: /projects/{url-project}/admin

Attemps

Для этого я создал реализацию DynamicNodeProviderBase

public class ProjectDetailsDynamicNodeProvider : DynamicNodeProviderBase
{
    private readonly IProjectRepository _projectRepository;
    public ProjectDetailsDynamicNodeProvider()
    {
        _projectRepository = DependencyResolver.Current.GetService<IProjectRepository>();
    }

    #region Overrides of DynamicNodeProviderBase

    public override IEnumerable<DynamicNode> GetDynamicNodeCollection()
    {
        // Build value 
        var returnValue = new List<DynamicNode>();
        var listDB = (from p in _projectRepository.Query()
                      select new { p.Name, p.Keyword, p.Description });

        // Create a node for each project
        foreach (var project in listDB.ToList())
        {
            var node = new DynamicNode { Title = project.Name, Description = project.Description };
            node.RouteValues.Add("url", project.Keyword);

            returnValue.Add(node);
        }

        // Return 
        return returnValue;
    }

    #endregion
}

Mvc.sitemap

<mvcSiteMapNode title="Projects" controller="Project" action="Index">
  <mvcSiteMapNode title="New project" controller="Project" action="Create" />

  <mvcSiteMapNode title="Project" action="About" controller="Project" dynamicNodeProvider="BindSolution.Infra.ProjectDetailsDynamicNodeProvider, BindSolution">
    <mvcSiteMapNode title="Photos" controller="Project" action="Photos" />
    <mvcSiteMapNode title="Addresses" controller="Project" action="Addresses" />
    <mvcSiteMapNode title="Admin" controller="Project" action="Admin" />
  </mvcSiteMapNode> 
</mvcSiteMapNode>

Результат

Путь: Home > Projects > {project-name}
URL: /projects/{url-project}

Путь: Project > Photos
URL: /projects/{url-project}/photos

Путь: Project > Addresses
URL: /projects/{url-project}/addresses

Путь: Project > Admin
URL: /projects/{url-project}/admin

Исследования

Глядя в интернете, Я нашел этот вопрос на stackoverflow , но не совсем понимаю разрешение или оно не вписывается в мой вопрос. Во всяком случае, если это ответ, вы могли бы дать мне более подробную информацию о том, как реализовать решение?

Спасибо всем за помощь!

Ответы [ 2 ]

1 голос
/ 05 марта 2012

Наш код / ​​страна / {имя страны} / / страна / {имя страны} / анкеты

И это то, что я придумал.Поэтому я бы заменил страну на url-проект.Единственная проблема, которую я замечаю с этим методом, поэтому я не знаю, является ли он лучшим, заключается в том, что с нашими странами (у нас 210) у нас заканчивается память.Я сделал это было Штаты (50) и несколько других и не было проблем.У меня проблема со странами, хотя у нас есть 9 различных страниц, перечисленных вверху.Когда я держу его до 4, у меня нет проблем.Надеюсь это поможет.

public class CountriesDynamicNodeProvider : DynamicNodeProviderBase
{
    globalEDGEDataContext _db = new globalEDGEDataContext();
    public override IEnumerable<DynamicNode> GetDynamicNodeCollection()
    {
        var returnValue = new List<DynamicNode>();
        foreach (var category in _db.CountriesList().Select(a => a.Title))
        {
            DynamicNode node = new DynamicNode("country_" + Tags.MakeUrlFriendly(category), category);
            node.RouteValues.Add("country", Tags.MakeUrlFriendly(category));
            yield return node;
        }
    }
}

public class CountriesPagesDynamicNodeProvider : DynamicNodeProviderBase
{
    globalEDGEDataContext _db = new globalEDGEDataContext();
    public override IEnumerable<DynamicNode> GetDynamicNodeCollection()
    {
        foreach (var category in _db.CountriesList().Select(a=>a.Title))
        {
            DynamicNode node = new DynamicNode();
            node.Title = "Profile";
            node.ParentKey = "country_" + Tags.MakeUrlFriendly(category);
            node.RouteValues.Add("country", Tags.MakeUrlFriendly(category));
            yield return node;
        }
    }
}

Пример работает и для MVC5.Слегка изменено:

  public class DepartmentEmployeeDynamicNodeProvider: DynamicNodeProviderBase
{
    AlertsContext db = new AlertsContext();

    public override IEnumerable<DynamicNode> GetDynamicNodeCollection(ISiteMapNode node)
    {
        // Build value 
        var returnValue = new List<DynamicNode>();

        // Create a node for each department 
        foreach (var department in db.Departments)
        {
            var dynNode = new DynamicNode();
            dynNode.Title = department.DepartmentName;
            dynNode.RouteValues.Add("id", department.ID);

            returnValue.Add(dynNode);
        }

        // Return 
        return returnValue; 
    }
}
0 голосов
/ 19 марта 2012

Чтобы дочерние элементы были зарегистрированы в родительском узле, просто назначьте их родительский ключ.

...