none
Menu separator

    Dotaz

  • Dobrý den,
    tvořím webovou stránku ASP.NET a používám zde control prvek Menu, který čte data z xml souboru (web.sitemap). Jeho vlastnost orientation jsem nastavil na horizontal, takže menu ted vypadá přibližně takto:

    Home Articles Photogallery Contact

    Já potřebuji mezi každé tyto dva prvky dostat znak | jako separátor jednotlivých uzlů . Tedy aby menu vypadalo takto:

    Home | Aricles | Photogallery | Contact

    Zkoušel jsem použít vlastnost StaticItemFormatString ve tvaru {0} |  , ale pak se separující znak přidá i za poslední prvek. Také mě napadlo ho napsat natvrdo do sitemap souboru, ale pak je znak |  součástí odkazu a např. při najetí myši mění barvu spolu s ním nebo prakticky znemožňuje použití prvku SiteMapPath. Ještě mě napadla možnost si vytvořit vlastní control, zděděný od controlu prvku Menu a násleně ho upravit pro své potřeby, bohužel nevím, jak přesně "vnitřně" control prvek Menu funguje, tudíž si ho nemůžu ani upravit.

    Vím, že se to jeví jako hloupost a že to jde vyřešit např. bez použití control prvku Menu, ale já potřebuju právě řešení pomocí tohoto prvku. Snad to nějak jde vyřešit, protože pokud ne, nenapadá mě jedinný důvod, proč tento control používat. Navíc když ješte generuje velice nepěkný tabulkový HTML kód.

    Doufám, že Vás příliš neobtěžuji a že mi pomůžete najít řešení.

    Děkuji za odpověď, s pozdravem Tomáš Slíž
    pátek 30. května 2008 9:42

Odpovědi

  • Aha, máte pravdu, ty controly jsou nekonzistentní a SiteMapPath skutečně dělá HtmlEncode nad textem položek.

     

    Nevím, jestli to stojí za námahu, ale změnit byste to mohl potomkem MySiteMapPath : SiteMapPath

    pomocí override virtuální metody InitializeItem.

     

    Asi by mělo fungovat něco jako

     

    Code Snippet

    protected override void InitializeItem(SiteMapNodeItem item)

    {

    item.SiteMapNode.Text = RemoveSeparator(item.SiteMapNode.Text);

    base.InitializeItem();

    }

     

     

    Popřípadě můžete udělat v SiteMapPath NodeTemplate a zabránit tak HtmlEncode:

     

    Code Snippet

    <asp:SiteMapPath ...>

      <NodeTemplate>

    <%# Eval("Title") %>

      </NodeTemplate>

    </asp:SiteMapPath>

     

     

     

     

    ...ani jedno z výše uvedených jsem netestoval, možná to budete muset trochu rozvést.

     

    Jinak jsou to všechno jen obskurní workaroundy na neschopnost Menu zobrazit nějaké ty separatory.

    Pokud chcete web.sitemap používat s něčím dalším, než jen Menu, tak by asi stálo za to nechat web,sitemap v korektní podobě a spíše se snažit obskurní workaround natlačit jen k tomu Menu.

    sobota 7. června 2008 12:03
    Moderátor

Všechny reakce

  • Takovýto separátor se dá ošálit např. tak, že znak | dáte do odkazu v podobě "Home<span class="separator">|</span>", a pak si uděláte styl separator, aby se vám nepodtrhával, neměnil barvu, atp. Stejnětak si ho odsunete kousek od textu.

     

    Tabulkového designu menu se zbavíte tzv. CSS Control Adapterem: http://www.asp.net/cssadapters/

     

    sobota 31. května 2008 20:35
    Moderátor
  • Obávám se, že jste mě nepochopil. Řešení, které mu tu nabízíte se moc netýká toho, co jsem chtěl. Samožřejmě je funkční a já jsem ve svém dotazu také psal, že to jde vyřešit i jinak bez použití control prvku MENU, ale že já potřebuji vyřešit tento problém s jeho použitím, aby data načítal z XML souboru a vložil mezi ně nějakým způsobem ten separátor, což mě právě zajímá, jak to provést. Vaše rada je pro mě tedy nepoužitelná, nemám kam vložit <span>. Do xml sitemapy samozřejmě nejde.

     

    Možná jsem já nepochopil Vaše řešení a je tedy chybka na mé straně, každopádně prosím o znovupřečtení mého dotazu.

    neděle 1. června 2008 16:10
  • Mluvím o prvku Menu, web.sitemap musíte samozřejmě sestavit s entitami:

    Code Snippet

    <siteMapNode url="default.aspx" title="Home &lt;span&gt;|&lt;/span&gt;" description="xxx">

     

     

    neděle 1. června 2008 21:15
    Moderátor
  • Ano, tak tohle řešení se zdá být funkční, bohužel jen do té doby, než použiju control prvek SiteMapPath, který pak zobrazuje aktuální pozici na webu ve tvaru

     

     You are here: Home<span class="separator">|</span> > Articles<span class="separator">|</span>

     

    Takže se zdá, že problémy na sebe navazují. Asi vážně raději napíšu to menu natvrdo do masterpage a ušetřím si tak problémy. I přesto Vám děkuji za rady.

     

    Pokud náhodou někdo ví, jak tento problé vyřešit, podělte se prosím o to,

    pondělí 2. června 2008 7:27
  •  

    Pro SiteMapPath samozřejmě můžete udělat opět obskurní workaround požadovaného, tedy dát mu nějaký CssClass, nebo ho obalit divem s class="path" a pak nastavit CSS pravidlo

     

    Code Snippet

    .path .separator {display: none;}

     

     

    Každopádně je to všechno jenom kruté ohýbání existujících prvků k dosažení požadovaného vizuálního výsledku. Čisté to ale není a za zvážení by stálo použití nějakých bohatších controlů Menu třetí strany.
    pátek 6. června 2008 21:10
    Moderátor
  • On není u prvku SiteMapPath problém v jeho vlastním separátoru, poblém je v tom, že jsem upravil sitemapu a ten control prvek ji pak zobrazí v "surovém" tvaru, tedy že se řetězec prostě zobrazí tak, jak je zadán v parametru Title v sitemapě, tedy

     

    Položka1<span class="separator">|</span> > Položka2<span class="separator">|</span> ...

     

    U prvku Menu se zobrazí už zpracovaný, tedy čistě jen

     

    Položka1 | Položka2 | Položka3 ... 

     

    V podstatě je tohle začarovaný kruh, protože upravovat přímo tu sitemapu jaksi nemá moc význam, když ji pak využívají i jiné prvky (což je její hlavní smysl). Snad z mého krkolomného popisu chápete, kde je ten problém a jak říkáte, řešením je asi použití nového prvku, protože ten standartní zřejmě vůbec nepočítá s úpravou, kterou jsem chtěl udělat.

     

    Děkuji za Vaši pomoc.

    sobota 7. června 2008 8:36
  • Aha, máte pravdu, ty controly jsou nekonzistentní a SiteMapPath skutečně dělá HtmlEncode nad textem položek.

     

    Nevím, jestli to stojí za námahu, ale změnit byste to mohl potomkem MySiteMapPath : SiteMapPath

    pomocí override virtuální metody InitializeItem.

     

    Asi by mělo fungovat něco jako

     

    Code Snippet

    protected override void InitializeItem(SiteMapNodeItem item)

    {

    item.SiteMapNode.Text = RemoveSeparator(item.SiteMapNode.Text);

    base.InitializeItem();

    }

     

     

    Popřípadě můžete udělat v SiteMapPath NodeTemplate a zabránit tak HtmlEncode:

     

    Code Snippet

    <asp:SiteMapPath ...>

      <NodeTemplate>

    <%# Eval("Title") %>

      </NodeTemplate>

    </asp:SiteMapPath>

     

     

     

     

    ...ani jedno z výše uvedených jsem netestoval, možná to budete muset trochu rozvést.

     

    Jinak jsou to všechno jen obskurní workaroundy na neschopnost Menu zobrazit nějaké ty separatory.

    Pokud chcete web.sitemap používat s něčím dalším, než jen Menu, tak by asi stálo za to nechat web,sitemap v korektní podobě a spíše se snažit obskurní workaround natlačit jen k tomu Menu.

    sobota 7. června 2008 12:03
    Moderátor