webForumDet fria alternativet

Visa att man är på en sida

.NET

21 svar · 611 visningar · startad av echoSwe

Medlem sedan nov. 20041 189 inlägg
Frågan#1

Hej!

Jag ställer en snabb fråga:

säg att jag har en meny - hur sätter jag class="active" på rätt listitem <li> på smidigast möjliga sätt?

Följdfråga:
Hur gör man samma sak, fast man väljer istället vilken javascript funktion som ska anropas?

Medlem sedan juli 200498 inlägg
#2

Hej,

Hur dynamiskt vill du ha det?

kan ju vara helt statiskt ("hårdkoda" det) eller att man har menyn i ex. en XML-fil eller i en databas.

/m

Medlem sedan sep. 20026 425 inlägg
#3

Jag använder mig av HtmlAnchors och lägger till ett attribut till det menyvärde jag vill när användaren är inne på sidan.

<a href="default.aspx" id="m1" runat="server">Startsidan</a>
<a href="default.aspx?x=2" id="m2" runat="server">Foto</a>

codebehind:

dim str as string = request.querystring("x")

select case x

case ""
m1.attributes.add("class","active")

case 2
m2.attributes.add("class","active")

case else
'etc.

end select
Medlem sedan nov. 20041 189 inlägg
#4

Tjena Ahlen...

Självklart vill jag ju inte ha det statiskt om jag frågar i ett ASP .Net forum... Jag är inte så (hmm... osmart?) att jag inte kan skriva dit en active i fall jag har en .aspx/.htm/.html sida för varje sida jag har :D. Men jag hade gärna hämtat datan från en databas eller från XML - Säg med en repeater... Finns det i så fall något sätt att göra detta?

Men eftersom jag har en liknande struktur som martin har så tror jag att jag ska använda mig av hans lösning.

Men hur gör du när du har subkategorier på din hemsida?
"default.aspx?CatId=2&SubId=2" ser ju dina länkar ut som. Använder du en databas då?

Hur gör ni för att ha många sidor på en sajt - jag har en usercontrol för varje sida och så kollar jag querystring varje gång Default.aspx laddas för att se om det finns en fil vid det namnet.

Det funkar bra, men jag funderar på om man kan skriva en lösning som listar alla .ascx filer, gör det möjligt att deleta och adda nya .ascx filer utan att ha lösenordet till ftpn för att göra det manuellt... Tror ni detta går?

Sen funderar jag också på en annan sak - om nu alla .ascx filer ligger i samma mapp, dvs rootmappen på servern, blir det inte lite väl fullt i längden? Vad hade varit en bättre lösning? Databaser är ju bra för att lagra data, men säg att varje sida ska vara annorlunda, dvs. en kontaktsida, en gästbok, en log-in sida etc- om man då lagrar html koden i en databas så går det ju inte att göra något speciellt dynamiskt med just den html-en.

Vidare funderade jag då på om man hade kunnat kombinera dem. Så tex. att Default.aspx leder vidare till alla .ascx genom querystring, men sedan har man även en sida som heter Articles.aspx där allt laddas ur en databas. Denna databas skall till exempel ha en tabell för varje typ av artiklar, tex. om man har artiklar som är blog inlägg, artiklar som är tutorials och artiklar som är en cv till exempel... Detta förpassas alltså till databasen. Lite mer avancerade sidor till ascx filer...

Någon som har någon större sajt uppbyggt på detta viset?

Men bilder då?
Hur blir det?
Ska man bara länka till en fysisk plats på servern när man skriver artiklarna? Tex. skriver jag ett blog-inlägg och vill ha 2 bilder i texten... Skriver jag bara in en img tagg i samma cell som resten av texten lagras i, eller finns det något smidigare sätt att lösa detta? Har funderat på XML...

Medlem sedan sep. 20026 425 inlägg
#5

Sånt här är kul. Så här strukturerar jag upp min sajt:

Jag har en sida, default.aspx, där jag har en placeholder. Beroende på vad querystringen jag skickar med innehåller för värden lägger jag till olika användarkontroller till denna placeholder.

Just nu har jag 12 användarkontroller och det behövs definitivt inte mer för min sajt i alla fall. Hur bra överblick man får över sina användarkontroller i en mapp beror på hur man döper användarkontrollerna. Jag kan lugnt säga att jag skulle kunna ha minst 100 användarkontroller i en och samma mapp och ändå veta vilken jag använder till vad - enbart genom att kolla vad jag döpt respektive användarkontroll till.

Jag använder en databas för mina artikar, där även intervjuer och nyheter räknas in.

Att ha olika tabeller för sina olika artikelkategorier skulle inte jag ha. Lagra i stället olika värden i en speciell kolumn i en tabell och lista sedan artiklarna från en viss kategori när det behövs.

Och det här med bilder.. jag anger direkt i artikeln/dyl. adressen till bilden eller bilderna jag vill ha med.

Med detta är det dock inte sagt att hur jag gör är det ultimata. Just nu fungerar det dock utmärkt för mig och säkert för andra användare också ifall om de skulle få komma in i mitt adminsystem.

Medlem sedan nov. 20041 189 inlägg
#6

Hej igen!

Håller med... E skoj :) annars hade jag inte sysslat med det.

Jag skrev om i C#:

public class menu : System.Web.UI.UserControl
{
	protected HtmlAnchor nav1, nav2, nav3, nav4, nav5, nav6, nav7;
	
	private void Page_Load(object obj, EventArgs e)
	{
		string str = Request.QueryString["id"];
		switch (str)
		{
			case "1":
				nav1.Attributes.Add("class", "active");
				break;
			case "2":
				nav2.Attributes.Add("class","active");
				break;
			case "3":
				nav3.Attributes.Add("class","active");
				break;
			case "4":
				nav4.Attributes.Add("class","active");
				break;
			case "5":
				nav5.Attributes.Add("class","active");
				break;
			case "6":
				nav6.Attributes.Add("class","active");
				break;
			default:
				break;
		}
	}
}

Finns det nåt sätt att slippa få en sån här extremt lång lista? Typ något automatiserat? (den är egentligen längre)

Sen är det så (https://www.borgarskolan.tk) att jag har flera grupper.
Varje grupp visas genom att funktionen
SwitchMenu('sub1'); där sub1 byts ut till sub1-sub4, anropas, varpå rätt meny visas. Kan man på nåt sätt klämma in detta i scriptet?

Nu ligger i alla fall första delen av detta uppe på https://www.borgarskolan.tk :) i menyn.

Medlem sedan juli 200498 inlägg
#7

Hej,

Det jag menar med statiskt är inte att du sätter "active" på vald sida, som du skrev.

Det jag menade med statiskt var mera åt Martin Söderlunds håll, för om han lägger till ett meny alternativ så måste ju han in i VB.net koden; som jag kallar statiskt.

Dynamiskt är mera åt det hära hållet: Du läser in menyn från en data-källa, skriver ut och kollar ifall det stämmer med ett meny alternativ; då blir det "aktivt". Ett sätt är att kolla det i en loop.

Ex.

... ' Databas rutin osv.

For Each MyDataRow In MyDataSet.Tables("Mintabell").Rows
     If Request.Querystring("ID") = MyDataRow("articleID") Then
          ' kör find kontroll eller skriv ut det direkt, finns fler alternativ
     End if
Next

Hoppas du förstod det mesta av vad jag skrev.

/m

Medlem sedan nov. 20041 189 inlägg
#8

Hmm, jo.

Så du kollar om räknaren på varje rad överensstämmer med querystring? Om den gör det så ska ju active sättas som class... Hur skriver man i så fall för att dynamiskt bygga en navigationslista?

*rynkar pannan och startar dreamweaver*

Martin? Hur ser scriptet du använder ut som kollar i fall man ska ladda från en användarkontroll eller från en databas?

Medlem sedan sep. 20026 425 inlägg
#9

Jag laddar alltid en användarkontroll. Beroende på vilken querystringen är så kör jag olika procedurer. Tyvärr just nu så kör jag en select case i page-klassen och en likadan select case i usercontrol-klassen jag har. Lite dumt kanske men det fungerar superbt för mig.

Lite pseudokod för page-klassen:

sub page_load(sender as object, e as eventargs)

select case request.querystring("x")

case ""
_placeholder.controls.add("main.ascx")

case 2
_placeholder.controls.add("blabla.ascx")

'etc..

end select

end sub

En likadan kodsnutt kör jag i usercontrol-klassen fast där kör jag procedurer i stället för att ladda usercontrols ;) :

sub page_load(sender as object, e as eventargs)

select case request.querystring("x")

case ""
main_()

case 2
blabla()

'etc..

end select

end sub

'procedur för main
sub main_()

'...

end sub

'etc

Om detta med att jag kör två likadana select case-satser, en i page-klassen och en i usercontrol-klassen.. Jag kommunicerar mot mina databaser på usercontrol-nivå och ej på page-nivå.

Medlem sedan nov. 20041 189 inlägg
#10

*trycker CTRL + T och skriver "google procedures ASP .net c#"*

*rynkar pannan och funderar på om jag skulle ta och sätta på te*

btw, tack :)

Medlem sedan sep. 20026 425 inlägg
#11

Och återigen - ta det i beaktning att min struktur ej är den bästa, även om den är bra. ;)

Medlem sedan juli 200498 inlägg
#12

Hej igen,

Jag byggde en site exakt så där förut, med Select Case och byggde upp med undermenyer också. Jag tröttnade när jag skulle uppdatera menyn jämnt och ständigt. Meny strukturen hamnade i papperskorgen. Nu har jag inte byggt en statisk meny på jätte länge och jag är hel nöjd ;-)

Mitt tips, ska du uppdatera siten ~en gång i månaden? Kör på dynamiskt. Ska du aldrig uppdatera? Kör på statiskt. Om någon annan ska ändra? Hur blir det då? Man ska tänka lång siktikt.

/m

Medlem sedan sep. 20026 425 inlägg
#13

Jag har inga problem alls med att uppdatera hur ofta jag vill. Vem som helst kan också uppdatera hur ofta den vill, om jag skulle ge vem som helst åtkomst till min admin. :)

Vad var det för menystruktur som var så "kass", ahlen? Min menystruktur kommer jag aldrig eller sällan behöva ändra på. Behöver jag lägga till en sektion till på min sajt så visst - in med två rader kod och skapa en användarkontroll (eventuellt) och voila - klart!

Medlem sedan nov. 20041 189 inlägg
#14

Nej, du har rätt... Jag uppfattar det också som lite väl statiskt, om än riktigt mycket bekvämare än när man var riktig rookie och satt och funderade på om det enda sättet att ha samma layout på alla sidor var att använda iframes.

Men som sagt ahlen. Hur bygger du menyn dynamiskt?

pHolder.Controls.Add ul
foreach (myDataRow in myDataSet.Tables["meny"].Rows) 
//för att använda datarows måste man väl använda 
//en adapter till att få datan? (en OleDbDataReader funkar väl inte)
{
pHolder.Controls.Add li
pHolder.Controls.Add HyperLink h;
h.Text = MyDataRow["text"];
h.Navigateurl = MyDataRow["address"];
    if (Request.Querystring["ID"] = MyDataRow["linkID"]
{
h.Attributes.Add("class","active");

}
}

...som ni ser haltar det ganska rejält... har ni lust att förklara hur man hade kunnat göra detta?

Medlem sedan juli 200498 inlägg
#15

Hmm, ge administratörs rättigheter till VB.net koden?! Eller vad menar du? ;-)

Söderlund, hur kan du vara säker på att den som ska lägga till ett meny alternativ har kunskap i VB.net eller allmän programmering? Då känns det tryggare med ett dynamiskt alternativ via en lätt hanterlig administrations sektion för menyn.

/m

Medlem sedan sep. 20026 425 inlägg
#16

ahlen: förvisso sant, men jag har byggt min sajt i åtanke att ingen mer än jag kommer att uppdatera den. :p

echoSwe: du får använda en datatable tillsammans med ditt dataset? Vad är det som ej fungerar? :)

Medlem sedan juli 200498 inlägg
#17

Söderlund,

Jag tänkte mer på trådskaparens site, det var ju till en skola, när han slutar på skolan... vad händer då?

Min rekomendation är att ex. använda en repeater eller datalist, sen så har du den koden i ItemDataBound eller liknande. Sen kör du FindControl.

Inga kod exempel nu inte (ska iväg)

/m

Medlem sedan nov. 20041 189 inlägg
#18

När jag slutar på skolan så ska it snubben "ha lärt sig asp .net", vilket jag betvivlar. Men när jag lär mig mer asp så kommer jag ju göra den mer och mer dynamisk.

Har man tillgång till servern så är det ju lätt att uppdatera den redan nu eftersom jag kör usercontrols för varje sida.

Kodexempel:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpref/html/frlrfsystemwebuiwebcontrolsdatalistclassitemdataboundtopic.asp
jag tror jag fattar hur du menar. när datan binds så kör itemDataBound och i denna funktion har man sedan scriptet som du skickade?

Medlem sedan juli 200498 inlägg
#19

Hej,

Måste bara fråga en sak, löste du det?

/m

Medlem sedan apr. 20012 266 inlägg
#20

Trevligaste lösningen torde väl vara att skriva en egen kontroll som man binder en datakälla till som innehåller menyalternativen, detta gör det möjligt att snabbt skriva ut egen HTML utan att behöva blanda in andra kontroller i onödan.

278 ms totalt · 4 externa anrop · v20260731065814-full.a51de22e
137 ms — deklarationer (db)
0 ms — hämta statistik (cache)
138 ms — hämta tråd, inlägg och bilagor (db)
133 ms — ändringar (db)