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.
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
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.
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 ?
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!
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"))
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..
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
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
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
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: