freddykMedlem sedan okt. 2006103 inlägg Tjena,
Skulel behöva er hjälp. Jag vill visa nyheter via en repeater. Hämtar in ID och Titel på nyheten men vill samtidigt se ifall titeln är för lång, och i så fall begränsa visade tecken till ex 30 st. Hur kan jag göra detta? Det är alltså Text-fälten i Hyperlinkarna nedan som jag vill begränsa till en längdf av 30 tecken...
Min kod nedan. Kör asp.net 2.0 och sql server 2005, samt VS 2005
<asp:Repeater runat="server" ID="MyTopNews">
<HeaderTemplate><table width="260px"></HeaderTemplate>
<ItemTemplate>
<tr>
<td width="260px">
<asp:HyperLink ID="HyperLinkNews" runat="server" CssClass="nyhetsTextAbstractDefault"
NavigateUrl='<%# DataBinder.Eval(Container.DataItem,"ArtikelID","~/news.aspx?id={0}") %>'
Text='<%# DataBinder.Eval(Container.DataItem,"Title") %>' ToolTip='<%# DataBinder.Eval(Container.DataItem,"Title") %>'>
</asp:HyperLink>
</td>
</tr>
</ItemTemplate>
<AlternatingItemTemplate>
<tr>
<td width="260px">
<asp:HyperLink ID="HyperLinkNews" runat="server" CssClass="nyhetsTextAbstractDefault2"
NavigateUrl='<%# DataBinder.Eval(Container.DataItem,"ArtikelID","~/news.aspx?id={0}") %>'
Text='<%# DataBinder.Eval(Container.DataItem,"Title") %>' ToolTip='<%# DataBinder.Eval(Container.DataItem,"Title") %>' >
</asp:HyperLink>
</td>
</tr>
</AlternatingItemTemplate>
<FooterTemplate></table></FooterTemplate>
</asp:Repeater>
Tackar!
ZaimanMedlem sedan dec. 20014 239 inlägg freddykMedlem sedan okt. 2006103 inlägg
Zaiman skrev:
http://www.syncfusion.com/FAQ/aspnet/WEB_c16c.aspx
Kan denna hjälpa dig tro?
Google är min vän :)
Kanske... :)
Tack för hjälpen ska kolla igenom den tråden och återkommer med svar.
freddykMedlem sedan okt. 2006103 inlägg hmm...
Nej. Hittade inget vettigt där tyvärr....
Något annat förslag? :)
Tack igen!
ordellMedlem sedan sep. 200278 inlägg Du kan ju anropa en metod som automatiskt formaterar strängen i text-attributet, eller använda dig av eventet OnItemCreated för repeatern.
Oavsett är det en rätt enkel manöver. Själva funktionen kan se ut nåt sånt här...
protected string FormatLinkText(string text) {
if (text.Length > 30)
return text.Substring(0, 30)
return text;
}
Sen kan du i t.ex. text-attributet anropa metoden
<asp:hyperlink ... Text='<%# FormatLinkText((string) DataBinder.Eval(Container.DataItem,"Title")) %>' />
inspiroMedlem sedan sep. 2005673 inlägg Det är väl bättre att köra substring redan i din sql-sats, borde vara snabbare och så sparar du lite trafik mellan din db.
ordellMedlem sedan sep. 200278 inlägg Usch och fy. Affärs-/presentationslogik hör inte hemma i databaser. :)
erkaMedlem sedan dec. 19996 522 inlägg OT: MS verkar tycka annurlunda om vi snackar b-logic :) Det finns fördelar med bägge förhållningssätten, och man har kanske inte tillgång till en dedikerad applikationsserver alltid
inspiroMedlem sedan sep. 2005673 inlägg
ordell skrev:
Usch och fy. Affärs-/presentationslogik hör inte hemma i databaser. :)
Om du hämtar en post så kanske det inte spelar någon större roll men en hel lista som du fyller i en repeater så blir det ju en himla massa overhead! Måste ju rimligtvis spara prestanda att ha en substring redan i sql så man slipper hämta en massa text som ändå aldrig komemr att visas? Eller är det en principsak? :)
Annars är väl i ItemDataBound-eventet ett bättre val om man vill göra det i BL.
GladhMedlem sedan maj 20012 812 inlägg
inspiro skrev:
ordell skrev:
Usch och fy. Affärs-/presentationslogik hör inte hemma i databaser.
Om du hämtar en post så kanske det inte spelar någon större roll men en hel lista som du fyller i en repeater så blir det ju en himla massa overhead! Måste ju rimligtvis spara prestanda att ha en substring redan i sql så man slipper hämta en massa text som ändå aldrig komemr att visas? Eller är det en principsak?
Jag håller med inspiro. Att här kan man redan i sin SQL-sats hämta ut bara det som man behöver. Jag ser inte det som logik i databaslagret, då urvalet faktiskt görs i den SQL sats som hämtar datan från databasen, och den sql-sats antagligen är placerad i affärslagret.
Om man ser det ur ett större perspektiv så skulle det ju betyda att du måste hämta upp ALL DATA från databasen varje gång som du vill göra något, och sedan i affärslagret filtrera ut just den delmängd du vill ha. Eftersom en vanlig WHERE sats i din SQL sats faktiskt är en "affärs/presentationslogik" som ju påverkar datan från databasen.
Så jag håller med inspiro, se till att göra begränsningen redan i din SQL sats om du kan det. Oftas kan man inte det eftersom man ändå vill ha med all text. Själv brukar jag förkorta ner texterna som jag visar till en viss längd och sedan lägga hela texten i ToolTip-funktionen, då får man ju hela texten om man för musen över objektet men samtidigt ser det bra ut på sidan. Och detta gör jag i ItemDataBound event i min codebehind-fil.
- M
ordellMedlem sedan sep. 200278 inlägg Vad som är rätt och fel är väl lite subjektivt så.
Jag skulle inte göra det i databasen (SQL-frågan) av den enkla anledning att jag inte vill ändra på SQL-frågan (som jag skulle ha i ett eget klassbibliotek) om jag plötsligt får för mig att visa 40 tecken istället för 30. Det kallar jag ren och skär presentationslogik och det anser jag hör hemmma i .aspx(.cs/.vb)-filen.
Sen är det ju en viss skillnad på att hämta ALL data från databasen, eller hämta all data man behöver.
Och jag hade absolut valt att implementera den logiken i OnItemCreated, inte som ett metodanrop från .aspx-filen, den lösningen föreslog jag för att jag var lat ;)
inspiroMedlem sedan sep. 2005673 inlägg
ordell skrev:
Jag skulle inte göra det i databasen (SQL-frågan) av den enkla anledning att jag inte vill ändra på SQL-frågan (som jag skulle ha i ett eget klassbibliotek) om jag plötsligt får för mig att visa 40 tecken istället för 30. Det kallar jag ren och skär presentationslogik och det anser jag hör hemmma i .aspx(.cs/.vb)-filen.
Varför vill du hellre ändra i din kod än i en sql-fråga? Då måste du ju kompilera om och skicka upp en ny dll? I min värld är det enklare att logiken i presentationslagret visar upp det som stoppas in. Om det är långa uppsatser som hämats men du bara vill visa första meningen, skulle du ändå hämta allt?
Sen är det ju en viss skillnad på att hämta ALL data från databasen, eller hämta all data man behöver.
Men det är ju just det du inte gör, du hämtar ju data du inte behöver. ;)
freddykMedlem sedan okt. 2006103 inlägg Hallå alla,
Jag tackar för era oerhört bra inlägg. Jag vet inte så mycket själv om vart det är bäst att lägga denna "formatering" men jag valde att lägga den i SQL-satsen mha Left(). Det den gör är att hämta de senaste 5 nyheternas rubrik, ingress och ID. Kortar av Rubriken till max 30 tecken och lägger in "... läs mer" i asp:hyperlinkens text. Sedan lägger jag ingressen till nyheten i asp:hyperlinkens tooltip (som Gladh föreslog).
Valde det eftersom det enda den sql:en gör är att hämta några få fält i databasen, så jag tyckte den lika gärna kunde formatera den direkt. Men jag kan inte motivera det på ngt annat vettigt sätt. Alla era förslag är vettiga och jag lärt mig av dem. :) En mtk bra och givande diskussion.
Man tackar så hjärtligt!
GladhMedlem sedan maj 20012 812 inlägg
ordell skrev:
Vad som är rätt och fel är väl lite subjektivt så.
Det är därför det är så kul att diskutera arkitektur för det finns egentligen bara ett rätt sätt och det är mitt sätt. Skämt och sidor, det finns inget sätt som är rätt eller fel, precis som du säger, utan man lyssnar på argument från alla sidor och så plockar man ut de bitar som passar en själv.
Visst finns det riktlinjer om att man skall dela upp sin arkitektur i flera lager där man inte har beroende på 2 håll utan endast på 1 osv osv. Men det finns inte ett projekt där man inte tummar på något av riktlinjerna för att man skall kunna lösa sina problem på effektiva sätt.
Och på samma sätt som du har rätt när du säger att det är presentationslogik om man skall visa 30 eller 40 tecken, så blir det ett ohållbart argument när man så fall kan hävda att det är prestandalogik om du skall visa förnamn och efternamn också. Då måste du hämta alla information om kunden även om du bara vill visa namnet på honom. Och då bryter man mot prestandareglerna som säger, hämta inte mer data än du behöver, vilket i sin tur gör att man gör många små anrop mot databasen istället för få stora (som faktiskt är bättre prestandamässigt), bara för att det är onödigt att hämta information som man inte visar.... härligt moment 22...
Så man utvärderar varje problem för sig och är det så att man inser att jag knappast behöver något annat än namnet på min kund när den skall presenteras så finns det ingen anledning att hämta upp alla information om kunden, och skulle man vilja ha möjligheten att snabbt lägga till mer information om kunden, jag då tar man och hämtar mer information från databasn.
- M
GladhMedlem sedan maj 20012 812 inlägg
freddyk skrev:
Jag vet inte så mycket själv om vart det är bäst att lägga denna "formatering" men jag valde att lägga den i SQL-satsen mha Left
Bara för att göra dig lite deprimerad så är oftas de scriptspråk som finns till databaser långsammare än att göra samma sak i vanlig kod... Fast det kan ju ändå bli snabbare om du på detta vis slipper en massa event och funktionsanrop som endast skall hantera din uttagning av 30 tecken, samt att du faktiskt skickar mindre data över nätverket från din databas, vilket i sig är bra prestandamässigt...
Som sagt, det finns inget rätt/fel enkelt/svårt sätt... det finns bara olika lösningar, om din lösning passar dig bra så kör på den, för man kan alltid hit fel/problem, motsättnignar med de lösningar som föreslås.
Ta 2 kriterier för nästan alla utveckling, prestanda och skalbarhet. Dessa 2 är båda viktiga punkter att tänka på när man utvecklar, men tyvärr så motarbetar de varandra. Om du satsar på ren prestanda så minskar skalbarheten och satsar du på skalbarhet så minskar prestandan.
Upplevelsen för kunden kan bli rätt/fel beroende på vilken premiser du har innan du börjar utvecklar. Säg att du har en samtidig besökare på din site, då är det prestanda du skall satsa på, för ju mer skalbarhet du implementerar destu mer onödig kod och anrop till andra maskiner genomför du och det tar längre tid att visa sidan. Men om du istället hade haft 1000 samtidiga besökare så kommer det upplevas som snabbare för besökaren om du satsat på skalbarhet istället för prestanda, visst varje sida tar dubbelt så lång tid att visa jämfört med om du bara hade haft en besökare, men samtidigt så slipper alla besökare stå och vänta på att de andra skall bli färdiga (för att hårddra det..).
- M
freguzMedlem sedan feb. 2005280 inlägg För att inte tala om det något ofina argumentet ... "Jag vill ha lön också!" :-) dvs om kunden är nöjd, allt funkar fint, prestanda är bra, inga hårdkodningar, jag har fått en rimlig ersättning... så skit i samma? (medvetet provokativ, jag håller inte riktigt med mig själv här)
Dessutom kanske det är så enkelt att den som betalar avgör, fråga kunden; " det här är snyggare arkitektur, fast tar 2 dar extra att göra, betalar du för det?"
ZaimanMedlem sedan dec. 20014 239 inlägg freddyk, Är du nöjd med något av svaren som löst ditt problem kan du kanske markera tråden som lös. Då hittar fler lättare om de har samma problem.
freddykMedlem sedan okt. 2006103 inlägg Är nöjd med alla svaren. Kul att läsa inlägg från duktiga personer här på wF. :)
GladhMedlem sedan maj 20012 812 inlägg
frequz skrev:
Dessutom kanske det är så enkelt att den som betalar avgör, fråga kunden; " det här är snyggare arkitektur, fast tar 2 dar extra att göra, betalar du för det?"
Japp, cash is king. Tyvärr så har många kunder för lite kunskap i underhåll av kod, vilket gör att man får göra "dåligt arkitektiska lösningar" när man genomför projekten eftersom de inte är intresserade att betala för bra arkitektur, men sedan så får de skrämselhicka när de får reda på vad det kostar att implementera nya funktioner, eftersom man måste bygga om halv applikationen för att de snålat i början...
Eller som ett system som jag jobbar mot som är från 80-talet och kör med filer som databaser där varje fält har en fastlängd. Det är inte bara så man lägger till ett tecken någonstans, eftersom halva applikationen så fall måste byggas om... Där får man vackert bita i det sura äpplet och hitta lösningar runt det, för ändra i applikationen det görs inte...
- M
- M