třída selected   zodpovězená otázka

ASP.NET WebForms

Zdravím,asi budu mít triviální otázku,ale jak co nejjednodušeji a tím nejefektivněji docílit toho,aby aktuálně stisklý odkaz v menu(<ul> element) dostal Css třídu "selected"?

Zatím jsem to řešil tak,že jsem v Page_Load metodě tuto třídu nastavil.Nicméně mi to nepřijde jako vhodné řešení vzhledem k tomu,že takový stránek může být velké množství nebo se jednodušše může na tento kód při přidávání nové stránky zapomenout.Věřím,že půjde o něco "triviálního",mě se ale bohužel nedaří na nic jiného přijít.

předem děkuji

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Napsal bych si na to komponentu MenuHyperLink - vyrenderuje se jako <li><a href="adresa">text</a></li> a pokud je aktuální adresa stejná jako ta, na kterou odkazujeme, přidá se ještě ta CSS třída.

Udělejte třídu, která dědí z Control, přidejte jí dvě vlastnosti Text a NavigateUrl (které si ukládají hodnoty do ViewState) a přepište metodu Render.

Vlastnosti budou vypadat takto:

        [Category("Navigation"), DefaultValue(""), Bindable(true), UrlProperty] 
        public string NavigateUrl { 
            get { return (string)(this.ViewState["NavigateUrl"] ?? string.Empty); } 
            set { this.ViewState["NavigateUrl"] = value; } 
        } 
 
        [Category("Appearance"), DefaultValue(""), Bindable(true), Localizable(true)] 
        public string Text { 
            get { return (string)(this.ViewState["Text"] ?? string.Empty); } 
            set { this.ViewState["Text"] = value; } 
        }

A metoda Render třeba takto (píšu z hlavy, takže to berte s rezervou):

protected override void Render(HtmlTextWriter writer) {

    if (IsActive(NavigateUrl, HttpContext.Current.Request.Url)) {
        writer.AddAttributesToRender("class", "active");
    }
    writer.RenderBeginTag("li");  // <li>

    // vyrenderovat hyperlink
    writer.AddAttributesToRender("href", Page.ResolveClientUrl(NavigateUrl));
    writer.RenderBeginTag("a");   // <a>
    writer.WriteEncodedText(Text);
    writer.RenderEndTag();    // </a>

    writer.RenderEndTag();    // </li>
}
nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

Asi vím jak to myslíte a děkuji za nakopnutí.Jen bohužel moc nerozumím tomu,kam "nacpu" ostatní linky,dejme tomu,že mám menu o 8 odkazech(8x li & a href),to pak musím v metodě render,všechny ručně vyrenderovat?

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Ne, každá LI je jedna komponenta:

<ul>
  <my:MenuHyperLink runat="server" NavigateUrl="Jedna.aspx" Text="Jedna" />
  <my:MenuHyperLink runat="server" NavigateUrl="Jve.aspx" Text="Dvě" />
  <my:MenuHyperLink runat="server" NavigateUrl="Tri.aspx" Text="Tři" />
</ul>
nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

Super,díky moc za nakopnutí,už je mi vše jasné.Kód jsem poupravil a vše funguje.

Ještě jednou děkuji

nahlásit spamnahlásit spam 0 odpovědětodpovědět
                       
Nadpis:
Antispam: Komu se občas házejí perly?
Příspěvek bude publikován pod identitou   anonym.
  • Administrátoři si vyhrazují právo komentáře upravovat či mazat bez udání důvodu.
    Mazány budou zejména komentáře obsahující vulgarity nebo porušující pravidla publikování.
  • Pokud nejste zaregistrováni, Vaše IP adresa bude zveřejněna. Pokud s tímto nesouhlasíte, příspěvek neodesílejte.

přihlásit pomocí externího účtu

přihlásit pomocí jména a hesla

Uživatel:
Heslo:

zapomenuté heslo

 

založit nový uživatelský účet

zaregistrujte se

 
zavřít

Nahlásit spam

Opravdu chcete tento příspěvek nahlásit pro porušování pravidel fóra?

Nahlásit Zrušit

Chyba

zavřít

feedback