2011-06-21 9 views
6

Próbuję utworzyć mapę witryny dla mojej witryny, która zachowuje parametry URL, gdy jest to konieczne. Używam MvcSiteMapProvider i próbuję użyć dynamicznych węzłów do zachowania danych trasy dla różnych węzłów. Jednak problem, który mam, dotyczy dzieci dynamicznych węzłów. Gdy zagnieżdżę węzeł w węźle dynamicznym w pliku mapy witryny, nie pojawi się on w mapie witryny wygenerowanej przy użyciu metody Html.MvcSiteMap(). SiteMap(), a po przejściu na stronę tracę wszystkie elementy nawigacyjne PRZED węzeł dynamiczny.MvcSiteMapProvider - Dzieci dynamicznych węzłów nie pojawiają się w bułce lub mapie witryny

Na przykład, jeśli mój dynamiczny węzeł jest nazywany „Osoba Szczegóły”, to breadcrumb wygląda to na stronie Osoba szczegóły:

Home > People > Person Details 

Ale tak szybko, jak poruszać się dalej na stronie, powiedzieć „Kontakt Osoba ", bułka wygląda następująco:

Person Details > Contact Person 

bez dwóch pierwszych ścieżek. Ponadto, jeśli spróbuję wrócić do szczegółów osoby, żaden z parametrów adresu URL nie jest zachowywany (np. Zamiast przechodzić do http://localhost:55555/Home/People/PersonDetails?id=12, przechodzi do http://localhost:55555/Home/People/PersonDetails).

Kiedy próbuję wyświetlić całą mapę witryny za pomocą Html.MvcSiteMap(). SiteMap(), wyprowadza prawidłową hierarchię aż do węzła dynamicznego. Mapa witryny zawiera unikatowy węzeł dla każdego węzła "Person" znalezionego w dostawcy węzła dynamicznego, ale nie wyświetla żadnego elementu podrzędnego węzła dynamicznego.

Moja mapa serwisu wygląda mniej więcej tak (w skrócie):

<?xml version="1.0" encoding="utf-8" ?> 
<mvcSiteMap xmlns="http://mvcsitemap.codeplex.com/schemas/MvcSiteMap-File-3.0" enableLocalization="true"> 
    <mvcSiteMapNode title="Home" controller="Home" action="Index"> 
    <mvcSiteMapNode title="People" controller="Information" action="People"> 
     <mvcSiteMapNode title="Person Details" controller="Information" action="PersonDetails" dynamicNodeProvider="MySite.Code.PersonDetailsDynamicNodeProvider, MySite"> 
     <mvcSiteMapNode title="Contact Person" controller="Information" action="Contact" /> 
     </mvcSiteMapNode> 
    </mvcSiteMapNode> 
    </mvcSiteMapNode> 
</mvcSiteMap> 

A mój dynamiczny dostawcą węzeł wygląda następująco:

public class PersonDetailsDynamicNodeProvider : DynamicNodeProviderBase 
{ 
    List<Person> people = proxy.GetPeople(); 

    public override IEnumerable<DynamicNode> GetDynamicNodeCollection() 
    { 
     var nodes = new List<DynamicNode>(); 

     foreach (var person in people) 
     { 
      DynamicNode node = new DynamicNode(); 
      node.RouteValues.Add("id", person.ID); 

      nodes.Add(node); 
     } 

     return nodes; 
    } 

    static private PersonServiceClient proxy = new PersonServiceClient(); 
} 

Czy coś mi brakuje? Mam przeczucie, że właśnie coś opuściłem, ale jestem nowicjuszem w dziedzinie tworzenia stron internetowych i naprawdę po prostu dźgam w ciemność w tym momencie.

Odpowiedz

8

Nie potrzebujesz dostawcy dynamicznego węzła.

<mvcSiteMapNode title="Person Details" controller="Information" action="PersonDetails" preservedRouteParameters="id"> 
    <mvcSiteMapNode title="Contact Person" controller="Information" action="Contact" /> 
</mvcSiteMapNode> 

działa dobrze dla tego, co robisz.