2010-01-29 1 views
1

У меня есть вопрос, подобный описанному здесь:
ASP.NET URL Routing with WebForms - Using the SiteMapSiteMap и Url маршрутизации

Мой ASP.Net WebForms WebApplication имеет Sitemap, похожее на это:

<?xml version="1.0" encoding="utf-8" ?> 
<siteMap xmlns="http://schemas.microsoft.com/AspNet/SiteMap-File-1.0" > 
    <siteMapNode title="Root"> 
    <siteMapNode url="Home" title="Home" /> 
     <siteMapNode url="Home?" title="Home" /> 
     <siteMapNode url="Faq" title="FAQ" /> 
    </siteMapNode> 
    <siteMapNode url="Reports" title="Your reports" /> 
     <siteMapNode url="Reports?" title="Your reports" /> 
     <siteMapNode url="ExtraReports" title="Extra reports" /> 
    </siteMapNode> 
    <siteMapNode url="Presentations" title="Your presentations" /> 
     <siteMapNode url="Presentations?" title="Your presentations" /> 
     <siteMapNode url="ExtraPresentations" title="Extra presentations" /> 
    </siteMapNode> 
</siteMapNode> 

Я хотел бы иметь URL-адрес в следующем формате:
: // host/projects/{company}/{projectno}/Главная
:// Хост/проекты/Microsoft/10/Главная
: // хост/проекты/Microsoft/11/Отчеты
: // хост/проекты/яблоко/10/ExtraReports

Маршруты Url маршрутизации/проекты/{ company}/{projectno}/{pagename} в /Pages/{pagename}.aspx.

Мой навигации состоит из TabStrip на вершине, которая должна содержать домой, доклады и презентации и меню на левой со своими подразделами (например, с Home выбран он должен быть: Home, Faq).

Мои вопросы:

  1. Что такое правильный способ справиться с дубликата SiteMapNode URL-ы?

  2. Как предотвратить TabStrip от генерации URL-адресов, например:: // host/Home и: // host/ExtraReports?
    мне нужно сохранить текущую компанию и projectno выбора, и карта сайт игнорирует относительные адреса

  3. TabStrip и управление меню должно признать выбранные элементы, чтобы показать активный выбор. Каково надлежащее решение всего этого?

ответ

2

проведя несколько часов на это, я думаю, что я пришел хорошее (достаточно :)) решение.

SiteMap файл
Обратите внимание на узлы без URL будут указывать на родительский

<siteMap xmlns="http://schemas.microsoft.com/AspNet/SiteMap-File-1.0"> 
    <siteMapNode> 
     <siteMapNode title="Home" url="Home"> 
      <siteMapNode title="Home" /> 
      <siteMapNode title="xxx" url="Cycle"/> 
      <siteMapNode title="yyy" url="Survey" /> 
      <siteMapNode title="zzzteam" url="Team" /> 
     </siteMapNode> 
     ... 

класса Утилиты для создания URL-адреса
CurrentContext статической ссылка на RequestContext

public static string GetPageUrl(SiteMapNode node) { 
    RouteValueDictionary values = new RouteValueDictionary(CurrentContext.RouteData.DataTokens); 
    values["page"] = node.Url.Trim('/'); 

    return CurrentContext.RouteData.Route.GetVirtualPath(CurrentContext, values).VirtualPath; 
} 

DataBound события в Masterpage
навигации является Telerik Панель вкладок, subnavigation является ASP.Net Меню

private void navigation_TabDataBound(object sender, Telerik.Web.UI.RadTabStripEventArgs e) { 
    if (!String.IsNullOrEmpty(e.Tab.NavigateUrl)) {    
      SiteMapNode node = (SiteMapNode) e.Tab.DataItem; 

    // Is this tab a parent of the current navigation node? Then select it 
    if (SiteMap.CurrentNode.IsDescendantOf(node)) e.Tab.Selected = true; 
      e.Tab.NavigateUrl = XRouteHandler.GetPageUrl(node); 
    } 
} 

private void subNavigation_MenuItemDataBound(object sender, MenuEventArgs e) { 
    SiteMapNode itemNode = (SiteMapNode) e.Item.DataItem; 
    SiteMapNode currentNode = SiteMap.CurrentNode; 

    // SiteMapNodes without url will point to the parent node 
    if (String.IsNullOrEmpty(itemNode.Url)) { 
     itemNode = itemNode.ParentNode; 
     e.Item.Selectable = true; 
    } 

    // Is this menu item the node itself or one of it's parents? Then select it 
    if (currentNode == itemNode || currentNode.IsDescendantOf(itemNode)) 
     e.Item.Selected = true; 
     e.Item.NavigateUrl = XRouteHandler.GetPageUrl(itemNode); 
    } 
} 

реализация XmlSiteMapProvider
Это решение достаточно хорошо сейчас, будет изучать его позже, чтобы превзойти его :)

public override SiteMapNode FindSiteMapNode(HttpContext context) { 
     string pageName = context.Request.Url.Segments.Last().Trim('/'); 
     foreach (SiteMapNode node in SiteMap.RootNode.GetAllNodes()) 
       if (node.Url.EndsWith(pageName, StringComparison.InvariantCultureIgnoreCase)) return node; 
     return SiteMap.RootNode; 
} 
1

Zyphax,

Это наиболее вероятно, что вы будете иметь, чтобы переписать TabStrip и меню управления, чтобы принять во внимание ваши маршруты. Это также означает, что вы можете удалить дубликаты SiteMapNodes.

Вместо этого вам нужно будет написать код для перемещения по дереву SiteMap, чтобы получить самый дальний предок, который является дочерним элементом домашней страницы. Это метод расширения, который может помочь.

public SiteMapNode FurthestAncestor(this SiteMapNode node) 
{ 
    while (node.Key != this.RootNode.Key && node.ParentNode.Key != this.RootNode.Key) 
    { 
     node = node.ParentNode; 
    } 

    return node; 
} 

Также с помощью относительных URL-адресов поможет ../Presentations, а не /проектов/Apple/10/Презентации

+0

Я работаю над этим в офисе сегодня. Я думаю, что нашел хорошее решение, которое действительно связано с элементами управления TabStrip и Menu. Завтра отправлю. Thnx. – Zyphrax

+0

Ищите решение ниже .. – Zyphrax