webForumDet fria alternativet

Funktion som körs i slutet av sidan

.NET

15 svar · 347 visningar · startad av erka

Medlem sedan dec. 19996 522 inlägg
Frågan#1

Hej!

Jag håller på och pillar lite med ett forum i asp.net för att lära mig ado.net lite bättre. Men nu när jag ska göra en funktion för "nya inlägg sedan senaste besöket" har jag stött på lite problem.

Jag har tänkt så här. När man är på ett forums index sida tex
visa_forum.aspx?ForumId=2 så sätter man en cookie efter man skrivit ut hela sidan med information om när man besökte forumet och vilket forum det var.

Tidigare på sidan där jag skriver ut alla topics som finns i forumet kör jag en liten funktion som kollar datumet/tiden för topicens senaste inlägg. Är "TopicLastReplyTime" större än värdet som finns i cookien skriver jag ut en liten ikon som talar om att det finns ett inlägg sedans mitt förra besök här. Eftersom fler kan vara inne på forumet samtidigt ska forumens index sida laddas om varje gång man anropar sidan. Om jag sätter cookien med information om när man besökte forumet och vilket forum det var direkt i page_load så kommer den ju alltid köras innan jag skriver ut alla topics och då blir inga inlägg markerade som nya även om det finns nya inlägg eftersom värdet i cookien är just det värde som skapades när sidan visades.

Hoppas någon förstår vad jag menar.

Jag var tidigare inne på att man skulle sätta en cookie när man läser en topic med information om tiden man senast läste den och vilket id man läste, på sidan där jag visar alla topics i ett forum så skulle jag då bara köra en funktion som kollar av om topicen jag är på i min repeater (som listar alla topics i forumet) har någon cookie med info om senaste gången jag kikade på den osv. Dock kom jag ju på att om man är ny medlem så ser man alla inlägg som nya tills det att man läser den en gång.

tacksam för tipps

Medlem sedan dec. 19996 522 inlägg
#2

Jag behöver alltså få reda på hur jag sätter en cookie efter det att repeatern har skrivits ut. Innan kunde jag ju bara skapa ett
skriptblock längst ner på sidan men det verkar man ju inte kunna med asp.net

min kod för sätta cookien ser nu ut

Public Function PutTimeStampCookie(UsrId,ForumId)
	Dim rightNow as DateTime = Date.Now
	Dim TimeNow As String = rightNow
	dim cookie as HttpCookie = New HttpCookie("ForumId"& ForumId &"")
	cookie.Values.Add("LastCheck",TimeNow)
	Response.Appendcookie(cookie)
End Function
Medlem sedan mars 20002 836 inlägg
#3

du får läsa cookien först INNAN du börjar att arbeta med den och spara undan innehållet i tex Session.

Arbetsgång:
Kontroller om just det sessionet har ett värde, isåfall använd det, annars hämta cookie, spara cookie till session, spara nytt besöksdatum till cookien, fortsätt att processa inläggen och jämför datum mot Sessionet.

hoppas du förstod lite av "svammlet"

cya,
PatrikB

Medlem sedan dec. 19996 522 inlägg
#4

Nej det där var förvirrat patrikb :(

Just nu krö jag följande
1.När jag skriver ut min repeater har följande i min itemtemplate

<asp:image id="ImgNewReplySinceLastVisit" runat="server" ImageUrl="Files/Images/Icons/Icon_BlueArrowRightGray.gif" visible='<%#PrintReplySinceLastVisitIcon(DataBinder.Eval(Container.DataItem, "Pk_TopicId"),DataBinder.Eval(Container.DataItem,"TopicLastReplyDate"))%>' />

funktionen jag anropar kollar om topicens senaste inläggs datum är större än det jag har i min cookie (om den inte finns en cookie skriver den ut en ny bild), är den det skriver jag ut en bild för att det är ett nytt inlägg i denna topic sedans mitt förra besök.

Det är nu efter att jag har gjort allt det här jag vill sätta cookien. Nu har jag ju bara en koll som sätter datumet och tiden på just det forumet man besöker, menar du att jag ska sätta det på varje topic när man läser den ?

Medlem sedan juni 20011 732 inlägg
#5

Så här kan du göra. Sätt cookien i samma funktion som fyller din repeater, efter att den är fylld.

funktion {
  hämta data och lägg i en datatable
  lägg till en kolumn med "nytt-inlägg-bilden" genom att jämföra inläggets datum med kakan, typ:
datatable.Columns.Add(new Column("new", typeof(string)));
for (int i=0; i<datatable.Rows.Count; i++) {
  if(cookiedatum < inläggdatum)  
datatable.Rows[i]["new"] = new Image();
  }
}
  Fyll din repeater
  sätt nytt datum/tid i kakan
}

Problemet som du har löser du alltså genom att inte använda latebound... kolumnen med bilden som visar om inlägget är nytt eller inte slänger du in i ditt dataset _innan_ du fyller din repeater!

Medlem sedan dec. 19996 522 inlägg
#6

Tack network och PatrikB, jag har nu stött på lite problem med cookiekollen

Public Function PrintReplySinceLastVisitIcon(ForumId As Integer,LastVisit As DateTime)
	Dim Mycookie as HttpCookie = Request.Cookies("ForumId"& ForumId &"")("LastCheck")
	
	If Mycookie Is Nothing Then
		Return "True"
	Else
		Dim myCookieTimeStamp = Mycookie.LastCheck
		If myCookieTimeStamp < LastVisit Then
			Return "True"
		Else
			Return "False"
		End If		
	End If
End Function

Jag sätter cookien på samma sätt som i mitt andra inlägg i denna tråd.

Jag får felmeddelandet
Value of type 'String' cannot be converted to 'System.Web.HttpCookie'.

på "Dim Mycookie as HttpCookie.." raden, hur ska jag annars skriva för att kolla värdet i LastCheck. Jag har provat med
Mycookie.LastCheck men det fungerar inte heller.

Redigering:
Löste det genom att
Dim MyCookie As HttpCookie = Request.Cookies("ForumId"& ForumId &"")
Response.Write(MyCookie.Values("LastVisitDate"))

Snurrigt

Medlem sedan dec. 19996 522 inlägg
#7

Tack nu har jag kommit rätt långt. Dock har jag inte fattat hur jag lägger till en bild, jag tänkte dunka i det i samma funktion eftersom om det inte är ett nytt inlägg ska jag inte skriva ut någon bild. Samt att denna funktion kommer aldrig användas på något annat ställe.

koden jag har nu ser ut på följande

Dim ForumId As Integer = Request.Querystring("IntForumId")
Dim MyCookieCheck As HttpCookie = Request.Cookies("ForumId"& ForumId &"")
Dim MyCookie As HttpCookie = Request.Cookies("ForumId"& ForumId &"")
Dim i As Integer
Dim objLayerForum as businessLayerForums = New businessLayerForums 

'################## Här får jag ett datatable, lägger till en kolumn
Dim myDataTable As DataTable = objLayerForum.GetForumTopics(ForumId)
myDataTable.Columns.Add("NewReplyImage")

'##################Loopa igenom raderna i min datatabel
For i = 0 To (myDataTable.Rows.Count -1)
		If MyCookieCheck Is Nothing Then
			myDataTable.Rows(i)("NewReplyImage") = "PIL"
		Else
			If MyCookie.Values("LastVisitDate") < myDataTable.Rows(i)("TopicLastReplyDate") Then
				myDataTable.Rows(i)("NewReplyImage") = "PIL"
			Else
				myDataTable.Rows(i)("NewReplyImage") = "INGEN PIL"
			End If		
		End If
	Next 
'##################SLUT PÅ LOOP
	
rptListaForum.DataSource = myDataTable
rptListaForum.Databind()
objLayerForum = Nothing

Problemet är hur jag lägger till en ny bild i denna kolumn, jag behöver ju inte ha någon webkontroll utan det går utmärkt med en htmlkontroll tex HtmlImage. Men hur lägger jag till en sådan dynamiskt som jag har tänkt att göra här..

Stort tack till den som hjälper :)

Medlem sedan dec. 19996 522 inlägg
#8
Dim MyImage As New Image()
MyImage.ImageUrl = "Files/Images/Icons/Icon_BlueArrowRightGray.gif"
MyDataTable.Rows(i)("NewReplyImage") = Controls.Add(MyImage)

tycker jag borde fungera,så har jag lagt till kontroller tidigare.. men jag får

BC30491: Expression does not produce a value.

Jag har också provat med

MyDataTable.Rows(i)("NewReplyImage").Controls.Add(MyImage)

men får då

System.MissingMemberException: Public member 'Controls' on type 'DBNull' not found.

Medlem sedan juni 20011 732 inlägg
#9

Använder du rätt namespace? Image finns nämligen i flera namespace... prova det här:

System.Web.UI.WebControls.Image()

Medlem sedan dec. 19996 522 inlägg
#10

Tack men jag hade provat det också, nu har jag följande kod

Dim ForumId As Integer = Request.Querystring("IntForumId")
Dim objLayerForum as businessLayerForums = New businessLayerForums 
Dim myDataTable As DataTable = objLayerForum.GetForumTopics(ForumId)
myDataTable.Columns.Add("NewReplyImage")
Dim i As Integer
Dim MyCookieCheck As HttpCookie = Request.Cookies("ForumId"& ForumId &"")
Dim MyCookie As HttpCookie = Request.Cookies("ForumId"& ForumId &"")

For i = 0 To (myDataTable.Rows.Count -1)
	If MyCookieCheck Is Nothing Then
		Dim MyImage As Image = New System.Web.UI.WebControls.Image()
		MyImage.ImageUrl = "Files/Images/Icons/Icon_BlueArrowRightGray.gif"
		myDataTable.Rows(i)("NewReplyImage") = MyImage	
	Else
		If MyCookie.Values("LastVisitDate") < myDataTable.Rows(i)("TopicLastReplyDate") Then
			Dim MyImage As New System.Web.UI.WebControls.Image()
			MyImage.ImageUrl = "Files/Images/Icons/Icon_BlueArrowRightGray.gif"
			MyDataTable.Rows(i)("NewReplyImage").Controls.Add(MyImage)
		Else
			myDataTable.Rows(i)("NewReplyImage") = ""
		End If		
	End If
Next 
	
rptListaForum.DataSource= myDataTable
rptListaForum.Databind()

Får felmeddelandet
System.MissingMemberException: Public member 'Controls' on type 'DBNull' not found.

Fan det här knäcker mig, borde ju inte vara så svårt

Medlem sedan dec. 19996 522 inlägg
#11

Jag försöker ju lägga in kontrollen i min datatable, det kanske inte går utan jag kanske måste lägga till ett textvärde i den istället, sedan i min repeater så kör jag en funktion som skriver ut rätt bild beroende på värdet i NewReplyImage

Medlem sedan juni 20011 732 inlägg
#12

Tjaa, du kan ju göra en fuling... det gör jag ibland när jag inte orkar.

myDataTable.Rows(i)("NewReplyImage") = "<img src='bild.gif'>"

Usch! ;)

Medlem sedan dec. 19996 522 inlägg
#13

Jag löste det genom att lägga till ett värde i kolumnen, sen i min repeater anropar jag en funktion som kollar av värdet bara.

Tack för hjälpen iaf!

Medlem sedan feb. 20038 inlägg
#14

Jag ser att du löste problemet men jag tänkte ändå visa hur jag löste det.
Tidpunkten för senaste besök hämtade jag från besökarens cookie till en DateTime som heter LastVisit.
Databastabellen för trådarna i forumet har ett fält "latest_entry" som jag jämför LastVisit mot.
Bilden för ett nytt inlägg är bara synlig om ett nytt inlägg finns:

<asp:Image Runat="server" ID="newentry"  ImageUrl="images/newentry.gif" Visible='<%#Container.DataItem("latest_entry")>YourLastVisit%>' >
Medlem sedan jan. 20012 204 inlägg
#15

:)

Välkommen till Webforum Kalli!

Medlem sedan feb. 20038 inlägg
#16

Tack ! :D

277 ms totalt · 4 externa anrop · v20260731065814-full.a51de22e
127 ms — deklarationer (db)
0 ms — hämta statistik (cache)
147 ms — hämta tråd, inlägg och bilagor (db)
117 ms — ändringar (db)