WK 2010 Pool in ASP.NET (met source code)

  Toegevoegd op dinsdag 18 mei 2010 @ 09:53:00
  Door: Christian Peeters  |    Hits: 1346  |    Reacties: 16  |    Tags: Visual Studio.NET  

WK 2010 Pool in ASP.NET (met source code)

Het wereldkampioenschap voetbal 2010 staat weer voor de deur. Tijd voor chips, bier, gezonde spanning en WK pools! Om te kijken wie er op de zaak of van je vrienden het meeste verstand heeft van voetbal (of het meeste geluk), is het wel zo leuk om je eigen pool op te zetten. Ik heb me daarom gestort op een online WK pool, gemaakt met ASP.NET in combinatie met LINQ to SQL.

Functionaliteiten
De applicatie maakt gebruik van de memberschip-functionaliteit van ASP.NET zodat gebruikers zich kunnen registreren en inloggen. Ik heb 2 rollen aangemaakt: 1 voor de gebruikers die mee spelen in de WK pool en 1 voor de Admin. Gebruikers met een Admin rol kunnen naar de pagina in de 'admin' folder waar de uitslagen van de wedstrijden in te vullen zijn.

Voor de spelers zijn er 2 belangrijke pagina's. Op de homepage staat de stand van de pool. Dus de ranking van de gebruikers en het aantal punten dat ze gescoord hebben. Tevens kunnen gebruikers een bericht plaatsen. Deze worden onder elkaar getoond. Zo kan iedereen elkaar succes wensen, op jutten of andere berichten plaatsen die de spanning nog wat kan opvoeren.

De andere pagina is de pagina waar de gebruikers hun voorspellingen kunnen invoeren. Voor alle wedstrijden kan de gebruiker het aantal doelpunten voor en tegen opgeven. Daarnaast kan iedereen voorspellen welke landen er in de achtste-, kwart-, halve- en hoofdfinale staan. En natuurlijk de winnaar van het WK. Ook is er een veld voor wat open vragen zoals, 'wie wordt de topscorer van het toernooi'. Deze laatste vraag wordt niet automatisch berekend maar in de database kan er voor elke gebruiker een aparte score worden opgegeven.

Als een gebruiker de juiste uitslag voor een wedstrijd heeft voorspeld, dan krijgt hij 5 punten, als de winnaar goed is voorspeld, dan krijgt hij er 2. Deze scores zijn volledig instelbaar via de web.config, evenals de scores voor het voorspellen van de landen in de verschillende finales.

WK 2010 Pool in ASP.NET 4.0

Open Source
Graag wil ik de source code aan iedereen aanbieden zodat je er zelf gebruik van kan maken , aanpassingen kan doen, tweaken, verbeteren enz. Je kunt de code en de database backup hier gewoon downloaden, maar natuurlijk zou ik het wel super waarderen als je laat weten of je ’t ook daadwerkelijk hebt ingezet, welke aanpassingen je eventueel gemaakt hebt en wat er nog verbeterd zou kunnen worden. Wellicht hebben we dan over 2 jaar weer een veel betere pool.

Garantie
Deze pool is door mij gemaakt en net als alle andere software ontwikkelaars kan ook ik fouten maken. Als je gebruik maakt van deze code, test dan alles goed door en laat even weten wat je wellicht gevonden hebt.

Samengevat, ik ben dus nergens aansprakelijk voor :). Veel succes en veel plezier met de wedstrijden!


Download bestand Souce code Masterit WKPool2010 ASP.NET.zip

Update 02-06-2010
N.a.v. de reacties is er nu ook een SQL 2005 versie van de database beschikbaar.

Download bestand WKPool2010 SQL2005_clean.zip

NUjij.nl eKudos MSN Reporter Furl del.icio.us del.icio.us

Reacties (16) op "WK 2010 Pool in ASP.NET (met source code)"
Maurice zegt op 19 mei 2010 @ 12:42:52 PM

Hallo,

Super dat je deze pool Open Source hebt gemaakt.

Ga hem zeker gebruiken.

Mischien voor de volgende keer, een inleg optie in bouwen zodat men kan kiezen voor een pool met of zonder inleg.

Gr Maurice.

Erwin zegt op 20 mei 2010 @ 4:28:01 PM

Hallo,

Hoe installeer ik deze pool ?

grtz Erwin

Vincent zegt op 20 mei 2010 @ 4:40:42 PM

Het valt met op dat je je DataContext's niet opruimt.
Je kunt ze natuurlijk buiten scope laten vallen en de gc zijn werk laten doen, maar zou dit niet beter zijn:

using (PoolClassesDataContext db = new PoolClassesDataContext())
{

// ... Do work here ...

}

Christian zegt op 20 mei 2010 @ 4:43:23 PM

Beste Maurice,

In je SQL server (Express) maak je een database aan en dan restore je de database-backup naar deze database.
In Visual Studio (liefst 2010) open je een "existing" Website en selecteer je de map waarin de aspx pagina's staan. In de Web.config kun je dan de connection string aanpassen naar je database. En dan zou het moeten werken. Deployen kan op de gebruikelijke manieren "copy website tool" of "Precompiled website".

Mocht je SQLExpress gebruiken en de database "MasteritWKpool" noemen, dan heb je waarschijnlijk Visual studio niet eens nodig, maar kun je de code direct in onder een application in IIS plaatsen.

frank zegt op 20 mei 2010 @ 5:03:56 PM

Ik heb je pool aan de praat, 2 opmerkingen. Ik kon het admin wachtwoord niet vinden, dus heb ik maar een user aangemaakt en de password hash naar de admin gekopieerd in de database. Daarnaast staat er nog Japen ipv Japan in de database.

Wat ik me afvroeg heb je ook een pagina opgenomen waarin de stand van alle deelnemers staat? Ik kon hem zo snel niet vinden.

Christian zegt op 20 mei 2010 @ 9:19:00 PM

Beste Erwin,

Ja, da's inderdaad een mooie discussie. Bij het gebruik van SqlConnections gebruik je inderdaad "using" (en dus de "dispose") om te voorkomen dat er connecties naar de Database in open blijven.
Ook een datacontext heeft een "Dispose", maar de datacontext heeft niet de eigenschap dat er connecties naar de database open blijven. Eventueel zou het afsluiten van de datacontext problemen met het deferred execution en lazy loading kunnen geven. In andere specifieke situaties zou "using" wel iets sneller geheugen kunnen vrij geven, maar in deze applicatie zal het eigenlijk geen noemenswaardige voor- of nadelen hebben.

Op internet wordt de discussie inderdaad vaak gevoerd. Ik baseer me nu op de cursussen van Microsoft en de volgende uitspraak van Scott Guthrie (manager ASP.NET team):

Short answer: It is generally not critical to call Dispose on Datacontext.

Longer answer:
All objects in .NET are eventually disposed automatically by the automatic garbage collector. The reason developers are paranoid about calling it explicitly is that if an object contains an expensive resource like an open database connection, then we can't afford to wait around for garbage collection, it would have a big impact on scalability.
The good news is that DataContext objects do not keep open database connections like some ADO.Net objects do, so it doesn't really hurt to let the garbage collector do it for you.

Bedankt voor je vraag... leuk om eens in te duiken ;-)

Christian zegt op 20 mei 2010 @ 9:36:41 PM

Hi Frank,

Bedankt voor je "Japen" vondst... ik zal binnenkort een nieuwe backup neer zetten.
Het Password voor de admin is "ma5t3r1t", maar ik raad je aan om een nieuwe gebruiker aan te maken en dan deze "admin" rechten te geven. Dit zou eventueel via de database kunnen in de "aspnet_UsersInRoles" tabel, maar veel makkelijker is het om dit te doen via de "ASP.NET website adminstration tool". Dat is het knopje met wereldbolletje en de hamer boven aan de Solution Explorer van Visual Studio.

De stand komt op de homepage te staan. Om te voorkomen dat de admin er ook bij zou komen te staan heb ik ervoor gekozen alleen personen te tonen die voorspellingen hebben ingevoerd. Waarschijnlijk zie je daarom nu nog niets staan op de homepage.

Christian

Daan zegt op 26 mei 2010 @ 11:26:59 AM

Server Error in "/SouceCode-MasteritWKPool2010-ASP.NET" Application.
--------------------------------------------------------------------------------
Runtime Error
Description: An application error occurred on the server. The current custom error settings for this application prevent the details of the application error from being viewed remotely (for security reasons). It could, however, be viewed by browsers running on the local server machine.
Details: To enable the details of this specific error message to be viewable on remote machines, please create a <customErrors> tag within a "web.config" configuration file located in the root directory of the current web application. This <customErrors> tag should then have its "mode" attribute set to "Off".

<configuration>
<system.web>
<customErrors mode="Off"/>
</system.web>
</configuration>

Notes: The current error page you are seeing can be replaced by a custom error page by modifying the "defaultRedirect" attribute of the application's <customErrors> configuration tag to point to a custom error page URL.

<configuration>
<system.web>
<customErrors mode="RemoteOnly" defaultRedirect="mycustompage.htm"/>
</system.web>
</configuration>
--------------------------------------------------------------------------------

Deze melding krijg ik. Iemand enig idee?

Christian zegt op 26 mei 2010 @ 11:33:00 AM

Beste Daan,

Dit is de melding dat er "iets" is fout gegaan. Omdat de foutmelingen uitstaan krijg je geen gedetailleerde informatie. In de web.config kun je inderdaad (zoals de melding aangeeft) de error mode op "Off" zetten zodat we wel de echte fout te zien krijgen. Tevens heb ik wat informatie nodig over welke .Net versie je draait (Het is gebouwd op .Net 4.0 en Sql2008).
En wanneer krijg je deze melding? Vanuit Visual Studio?
Stuur anders een mailtje naar christian.peeters@master-it.nl

Groeten Christian

Kristof Derdale zegt op 29 mei 2010 @ 1:17:34 PM

Beste Christian,

Bij het restoren van de database krijg ik volgende error:

An exception occurred while executing a Transact-SQL statement or batch. (Microsoft.SqlServer.ConnectionInfo)
The media family on device 'C:\WKpool_clean.bak' is incorrectly formed. SQL Server cannot process this media family.
RESTORE HEADERONLY is terminating abnormally. (Microsoft SQL Server, Error: 3241)

Zou het kunnen dat de bak-file corrupt is? kun je de database eens opnieuw posten of eens doorsturen naar kderdaele@hotmail.com?

Alvast bedankt,
Kristof

Christian zegt op 30 mei 2010 @ 8:34:36 PM

Beste Kristof,

Welke versie van SQL server gebruik je? De melding doet me vermoeden dat je deze backup probeert te restoren in een SQL versie ouder dan SQL2008.
Ik kan eventueel een SQL2005 backup op deze blog plaatsen. Laat maar weten.

Groeten Christian

Christian zegt op 31 mei 2010 @ 4:10:08 PM

UPDATE:
Ik ben nog een bugje tegen gekomen. De open vragen worden niet opgeslagen.
In het bestand “Matches.aspx.cs” moet een regel worden toe gevoegd in het click event van de button, vlak voor de "sb.submitChanges". Namelijk:
db.PoolPlayers.Single(dbp => dbp.ID == p.ID).OpenQuestions = p.OpenQuestions;

Het wordt dan : (de middelste regel moet worden toegevoegd)

p.OpenQuestions = tbOpenquestions.Text;
//deze regel ontbreekt
db.PoolPlayers.Single(dbp => dbp.ID == p.ID).OpenQuestions = p.OpenQuestions;
db.SubmitChanges();

Deze fix is inmiddels in de download bijgewerkt

Marko zegt op 02 juni 2010 @ 10:32:04 AM

Beste Christian,

Zou je een SQL2005 backup kunnen plaatsen. Heb namelijk ook de problemen om de .bak file te restoren op een 2005 SQL server.

Alvast bedankt,

Marko

Christian zegt op 02 juni 2010 @ 1:24:12 PM

Beste Marko,

De sql2005 backup kun je hierboven inmiddels terug vinden.

Christian

martijn zegt op 09 juni 2010 @ 6:51:27 PM

Beste Christian,

ik heb de pool ook aan de gang na veel kunst en vlieg werk.
er zijn nog een aantal bugs, ik kan nergens als ik ingelogd ben de changepassword link vinden terwijl er wel een pagina voor is.

voor het admin wachtwoord heb ik ook een trukje uitgehaald. omdat die van een aantal post hierboven niet werkte.

Christian zegt op 10 juni 2010 @ 9:51:44 AM

Beste Martijn,

Leuk dat je de pool aan de gang hebt.
Het password was in de SQL2005 back-up file inderdaad wel een andere. Via de website administration tool in Visual Studio is het makkelijk te regelen dat een bepaalde gebruiker "admin" rechten heeft.

Er is inderdaad gaan link naar de "ChangePassword.aspx", maar deze kun je uiteraard zelf toe voegen.

Bedankt voor de Feedback! En veel kijk en pool plezier de komende weken.

Plaats je reactie

Vul onderstaand formulier volledig in om een reactie op dit bericht te plaatsen.

Naam:

E-mailadres (wordt niet getoond):

Reactie:




Voor de SPAM-botjes; geef bovenstaande letters in: