2015-09-27 8 views
-1

У меня есть проект ASP.NET MVC, и у меня есть некоторый модуль. Некоторые модули имеют разбивку на страницы. Для испытания и понять MvcSiteMapProvider Я работаю с одним модулем Форума и создал класс ForumDynamicNodeProviderDynamicNodeProviderBase + Pagination

public class ForumDynamicNodeProvider : DynamicNodeProviderBase 
{ 
    private readonly IForumsService _forumsService; 

    public ForumDynamicNodeProvider(IForumsService forumsService) 
    { 
     this._forumsService = forumsService; 
    } 

    public override IEnumerable<DynamicNode> GetDynamicNodeCollection(ISiteMapNode node) 
    { 
     string rootTitle = ManagerLocalization.Get("Forums", "FORUMS"); 


     var nodes = new List<DynamicNode> 
         { 
          new DynamicNode 
           { 
            Title = rootTitle, 
            Controller = "Forums", 
            Action = "Index", 
            Key = "forum_home" 
           } 
         }; 

     var forums = this._forumsService.GetForums<ForumNode>().ToList(); 
     var topics = this._forumsService.GetTopics<TopicNode>().ToList(); 

     foreach (var forum in forums) 
     { 
      var parentForum = this.GetParentForum(forums, forum); 
      string parentKey = parentForum?.Id.ToString() ?? "home"; 

      var forumRouteValue = new Dictionary<string, object> { { "forumName", forum.NameTranslit } }; 

      nodes.Add(new DynamicNode 
      { 
       Key = $"forum_{forum.Id}", 
       ParentKey = $"forum_{parentKey}", 
       Title = forum.Name, 
       Controller = "Forums", 
       Action = "ShowForum", 
       RouteValues = forumRouteValue 
      }); 
     } 

     foreach (var topic in topics) 
     { 
      var forum = forums.FirstOrDefault(item => item.Id == topic.ForumId); 
      var forumRouteValue = new Dictionary<string, object> { { "forum", forum.NameTranslit }, { "topicName", topic.TitleTranslite }, {"page", 0 } }; 

      nodes.Add(new DynamicNode 
      { 
       Key = $"topic_{topic.Id}", 
       ParentKey = $"forum_{topic.ForumId}", 
       Title = topic.Title, 
       Controller = "Forums", 
       Action = "ShowTopic", 
       RouteValues = forumRouteValue 
      }); 
     } 

     return nodes; 
    } 

    private ForumNode GetParentForum(List<ForumNode> forums, ForumNode forum) 
    { 
     if (forum.ForumId > 0) 
     { 
      return forums.FirstOrDefault(item => item.Id == forum.ForumId); 
     } 

     return null; 
    } 
} 

Но я не могу нашел хорошее решение для пагинации. Для удобства я могу использовать префикс страницы для ключа и сделать дубликат DynamicNode. Но это плохая идея, потому что, когда у меня есть пример 1000 тем, и каждая тема имеет 20 страниц, я должен создать 20000 DynamicNode. Может быть, есть другое решение?

+0

Просьба уточнить ваш вопрос. Что вы подразумеваете под «иметь страницу в параметре»? – NightOwl888

ответ

1

Для окружающего контекста (например, номер страницы) вы можете использовать PreservedRouteParameters до force a match на любое значение для указанных ключей. Эти ключи соответствуют либо значениям маршрута, либо параметрам строки запроса из запроса (значения маршрута имеют приоритет, если они одинаковы).

foreach (var forum in forums) 
{ 
    var parentForum = this.GetParentForum(forums, forum); 
    string parentKey = parentForum?.Id.ToString() ?? "home"; 

    var forumRouteValue = new Dictionary<string, object> { { "forumName", forum.NameTranslit } }; 

    // Always match the "page" route value regardless of its value 
    var forumPreservedRouteParameters = new List<string>() { "page" }; 

    nodes.Add(new DynamicNode 
    { 
     Key = $"forum_{forum.Id}", 
     ParentKey = $"forum_{parentKey}", 
     Title = forum.Name, 
     Controller = "Forums", 
     Action = "ShowForum", 
     RouteValues = forumRouteValue, 
     PreservedRouteParameters = forumPreservedRouteParameters 
    }); 
} 

ПРИМЕЧАНИЕ: При использовании PreservedRouteParameters, они включены в сгенерированном URL из текущего запроса, если это предусмотрено и не включены в URL, если не предусмотрено в запросе. Поэтому, если у вас более одного номера страницы в одной и той же родословной, вам нужно иметь отдельное имя ключа маршрута для каждого из них, или номер текущей страницы будет передан узлам-предкам из текущего запроса.

+0

См. [Установка URL-адресов явно] (https://github.com/maartenba/MvcSiteMapProvider/wiki/Controlling-URL-Behavior#setting-urls-explicitly) из документации. Обратите внимание, что свойства 'Protocol' и' HostName' могут использоваться в сочетании с свойством 'Url'. Тем не менее, 'Controller',' Action', 'Area',' RouteValues', 'Route' и' PreservedRouteParameters' не действуют, когда вы используете свойство 'Url'. Строковые значения строки запроса - это несоответствие строчной строки - это означает, что при использовании свойства 'Url' вы должны передать их в URL-адресе в том же порядке, что и узел. – NightOwl888

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

  • Нет связанных вопросов^_^