webForumDet fria alternativet

Behöver hjälp med att få länken att forma sig efter vilken sida den är inne på (query

.NET

9 svar · 518 visningar · startad av haxx

Medlem sedan maj 200654 inlägg
Frågan#1

Hej!

Håller på med en webbshop, tillsammans med en kamrat, och som snart är klar. Jag landade dock på ett litet problem. Det är en asp:HypeLink Länk som via en Datalist i en Web User Control finns på de flesta sidor på hemsidan och behöver olika länkar beroende på vilken sida den är inne på.

Jag vill att när DepartmentID=# ingår i navigeringsfältet i webbläsaren att asp:HyperLinkens länk ska vara ”product.aspx?ProductID=#&DepartmentID=#” men när jag inte har uppe DepartmentID=# ska länken bara vara ”product.aspx?ProductID=#”. Hur ska jag göra?

Medlem sedan jan. 20012 204 inlägg
#2

Hur se det ut när du skapar länken? Känns som det är enklast att kontrollera fallet där.

Medlem sedan maj 200654 inlägg
#3
<asp:DataList>
  <ItemTemplate>
    <table>
        <tr>
            <td>
                <asp:HyperLink ID="ProductLink" runat="server" NavigateUrl='<%# "../Product.aspx?ProductID=" + Eval("ProductID") %>'><img class="PruductImage" src='ProductImages1/<%# Eval("Image1FileName") %>' border="0"/></asp:HyperLink>     
            </td>
        </tr>
    </table>
Medlem sedan maj 200654 inlägg
#4

Ungefär så här just nu, har tagit bort den kod som inte är lika viktig

Medlem sedan maj 20012 812 inlägg
#5

NU använder jag aldrig Eval() funktionen på det viset som du gör det av prestandaskäl (och att man lägger affärslogik i prestationssidan.

Så jag skulle råda dig att istället lägga det i codebehind filen med hjälp av eventen som finns på DataList (titta på OnItemCreate / OnItemBound) eventetn så kommer du få mer information.

Men om du envisas med att ha kvar Eval() funktionen så skall du istället kalla på en metod() i din kodbehind som kan returnera en sträng tillbaka till ASP.NET sidan och med denna sträng, modifiera din navigationUrl till dig, Tyvärr kan jag inte hjälpa dig med hur koden skall se ut, då jag inte har en anning om hur det skall göras, då jag aldrig skulle ta den lösningen ;)

- M

Medlem sedan maj 200654 inlägg
#6

Okej, tackar för informationen! Ska titta vidare på det du beskrev.

Undrar bara, vad ska man använda Eval() funktionen till om den inte är så bra i detta fal?

Medlem sedan maj 20012 812 inlägg
#7

haxx skrev:

Undrar bara, vad ska man använda Eval() funktionen till om den inte är så bra i detta fal?

Det finns säkert fall då man skall använda sig av Eval(), även om jag inte kommer på någon just nu.

Men många av de exempel som man ser på nätet är oftas inte optimerade för vad de skall användas till. Utan mer bara ett exempel på hur man snabbt och enkelt kan få fram önskat resultat, men inte på ett optimal sätt, samt att just i ditt fall, så önskar du ju faktiskt använda Eval() på ett sätt som inte det var tänkt på i exemplet.

Rent generellt så skall du undvika att lägga någon kod i ASPX sidan utan se till så den placeras i codebehind-filerna.

- Magnus

Medlem sedan maj 200654 inlägg
#8

Bra sagt och tack för hjälpen! Ska plugga vidare på egen hand nu .

Medlem sedan maj 200654 inlägg
#9

Men tillsvidare så har jag kommit på en smart grej (tror jag)!
Kolla här:

NavigateUrl='<%# false.ToString() == [red]Request.QueryString["DepartmentID"][/red] ?
"../Product.aspx?ProductID=" + Eval("ProductID") : "../Product.aspx?DepartmentID=" + Request.QueryString["DepartmentID"] + "&ProductID=" +
Eval("ProductID")  %>

Problemet är bara att jag inte vet vad jag ska göra av med den rödmarkerade texten, man får ju ändra den så att den levererar antingen true eller false, alltså om DepartmentID finns med eller inte i querysträngen. Men jag tror inte detta fungerar ändå.. :(

Och sedan än anna jobbig sak.. Detta hade löst sig mycket enklare om jag bara hade kunnat hitta mina bilder, länkar och texter via codebehindfilerna, om ni förstår vad jag menar, men nu kan jag inte det och jag vet inte varför. Kan det vara så för att de är inne i en DataList, eller? Hur ska jag göra för att komma i kontakt med dem i codebihindfilen?

Medlem sedan maj 20012 812 inlägg
#10

Antagligen så kan du inte hitta dem eftersom de inte finns ;). Man kan inte hitta dem via id:et eftersom kontrollerna skapas efterhand, man vet ju inte på förhand hur många rader din datalist behöver.

Här kommer dock ett exempel på hur du använder codebehind filen.

ASPX-sidan

	<asp:datalist id="dlArticles" runat="server" onitemdatabound="dlArticles_onItemDataBound">
		<itemtemplate>
			<div class="articleRef">
				<asp:panel id="panelCategory" runat="server" cssclass="articleListCategory" visible="false">
					Kategori: <asp:label id="lblCategory"  cssclass="color" runat="server" />
				</asp:panel>
				
				<ts:clickablepanel id="panelArticle" runat="server" onclick="clickablePanel_Click"  cssclass="panelArticle">
					<h2 style="margin: 0px 0px 3px 0px;">
						<asp:image id="imgArticleHeader" skinid="imgArticleHeader" runat="server" />
						<asp:label id="lblHeader" runat="server"></asp:label>
					</h2>
					<div>
						<asp:label id="lblMessage" runat="server" />
					</div>
				</ts:clickablepanel>
			</div>
		</itemtemplate>
	</asp:datalist>

i codebehind-filen

	protected void dlArticles_onItemDataBound(object sender, DataListItemEventArgs dataListEventArgs)
	{
		switch (dataListEventArgs.Item.ItemType)
		{
			case ListItemType.AlternatingItem:
			case ListItemType.Item:
				HandleCategory(dataListEventArgs.Item);
				HandleArticle(dataListEventArgs.Item);
				break;
		}
	}

	private void HandleCategory(DataListItem dataListItem)
	{
		//-- Get item
		Article entity = dataListItem.DataItem as Article;

		//-- Check if this category is same as old one
		if (entity.Category == null || (_Category != null && _Category.Identifier == entity.CategoryIdentifier))
			return;

		//-- this is not same category
		_Category = entity.Category;
		((Panel)dataListItem.FindControl("panelCategory")).Visible = true;
		((Label)dataListItem.FindControl("lblCategory")).Text = _Category.Name;
	}
	private void HandleArticle(DataListItem dataListItem)
	{
		//-- Get item
		Article entity = (Article)dataListItem.DataItem;

		if (entity == null)
			return;

		((ClickablePanel)dataListItem.FindControl("panelArticle")).Attributes.Add("identifier", entity.Identifier.ToString());
		((Label)dataListItem.FindControl("lblHeader")).Text = (entity.Subject.Length > 60 ? entity.Subject.Substring(0,57) + "..." : entity.Subject);
        ((Label)dataListItem.FindControl("lblHeader")).ToolTip = entity.Subject;
        ((Label)dataListItem.FindControl("lblMessage")).ToolTip = entity.Subject;
        ((Label)dataListItem.FindControl("lblMessage")).Text = (entity.HTMLMessageNoBold.Length > 200 ? entity.HTMLMessageNoBold.Substring(0, 200) + "..." : entity.HTMLMessageNoBold);
        

	}

Hoppas det kan ge dig lite vägledning...

- M

263 ms totalt · 4 externa anrop · v20260731065814-full.6fe65c25
129 ms — deklarationer (db)
0 ms — hämta statistik (cache)
131 ms — hämta tråd, inlägg och bilagor (db)
128 ms — ändringar (db)