Webbserverprogrammering 1 · område 5
Inlämning 5 – Från modell till databas och formulär
Din hårdkodade lista ska bli en databas, och din applikation ska kunna få nya poster utan att någon öppnar en kodfil. Fyra saker ska hänga ihop när du är klar: entitetsklassen, migrationen, tjänsten och formuläret. Attributen skrivs en gång på entiteten och styr både vad databasen accepterar och vad formuläret släpper igenom.
- 22 dec Deadline kl 23:59 Repots adress lämnas i itslearning. Inget prov efter det här området.
En applikation som bara kontrollerar i webbläsaren har ingen kontroll alls.
Webbläsaren är besökarens, inte din – allt som händer där går att stänga av
med F12. Och databasen fångar inte heller felet: [Range(1, 5)] blir
ingenting i tabellen, och betyget 99 går rakt in.
Kedjan har exakt ett ställe som håller, och uppgiften kräver att du bevisat att det gör det.
1. Uppdraget
Du börjar inte om. Projektet från område 4 är utgångsläget och växer.
Du får med dig fem saker:
- Guiden, som bygger Filmarkivets databaslager i tolv steg med all kod.
- Referensprojektet Filmarkivet, färdigt att köra och läsa – och
FilmService.csfrån område 4 att jämföra med. - En rad som är hela skillnaden: formuläret som går att lura och det som inte gör det, och DevTools-testet steg för steg.
- Lektionerna 31–33. Genomgångarna ligger på alla tre.
- Ditt projekt från område 4. Tjänsten bakom gränssnittet är det som gör att det här området tar en lektion i stället för en vecka.
2. De tre kontrollerna
Tre saker är lätta att göra själv och avgör om inlämningen är godkänd. Gör dem innan du lämnar in – det är samma kontroller jag gör när jag rättar.
| Kontroll | Gör så här | Vad det bevisar |
|---|---|---|
| 1. Databasen byggs ur din modell | Radera din .db-fil. Kör dotnet ef database update och sedan dotnet run. |
Får du tillbaka dina poster fungerar migrationen och frödata. Får du en tom databas ligger frödata fel. |
| 2. En post överlever omstart | Spara en post via formuläret. Stäng servern med Ctrl+C, starta om, titta igen. | Är den kvar har du en databas. Är den borta har du inte det. |
| 3. Servern håller | F12 på formuläret. Ändra ett fälts type till text, ta bort min/max, skicka ett omöjligt värde. |
Sparas det håller inte valideringen. Svarar servern med felmeddelandet gör den det. |
Den tredje står steg för steg på sidan om validering. Den tar två minuter och är ett C-krav.
Kryssen nedan sparas i din webbläsare, så du kan bocka av allteftersom.
3. Ska-krav — nivå E
Skillnaden mot C är att kedjan är genomtänkt: du kan säga vad varje attribut gör var, och valideringen håller där den ska.
4. Bör-krav — nivå C, utöver E
5. Utmaning — nivå A, utöver C
6. Så bedöms den
Uppgiften prövar två av kursens betygskriterier särskilt.
| Kriterium | Vad det betyder här |
|---|---|
| Datalagring i relationsdatabas | På E ska applikationen ha en databaskoppling och spara data mellan sidvisningar. På C ska lagringen vara permanent och genomtänkt. Migrationen är beviset på att databasen är byggd ur din modell och inte handknackad. |
| Kvalitetssäkring av funktionalitet, säkerhet och kodkvalitet | Serversidesvalidering är det första riktiga säkerhetsmomentet i kursen. Att kringgå sin egen klientvalidering och se att servern håller är precis den sortens kontroll område 7 handlar om. |
Jag läser koden och kör projektet. Tre saker väger tyngst:
- Att databasen byggs ur din modell. Jag klonar repot och kör
dotnet ef database update. Får jag inte din databas med dina sex poster är kravet inte uppfyllt – och det är det enklaste av alla krav att kontrollera själv innan du lämnar in. - Att gränssnittet höll. Jag jämför din
IDittServicemed den från område 4. Har den ändrats mycket har något från datalagret läckt ut i komponenterna. - Att valideringen håller på servern. Jag öppnar ditt formulär, ändrar ett fält i DevTools och skickar in ett värde som ska vara omöjligt. Sparas det är kravet inte uppfyllt, hur snyggt formuläret än ser ut.
"Jag har satt [StringLength(100)] på titeln." Det är en
beskrivning av koden. Den säger ingenting om vad som hände.
"[StringLength(100)] syns inte i tabellen – kolumnen är
TEXT utan längd, för SQLite har ingen. Regeln finns bara i
formuläret, så en titel på 300 tecken går att skriva rakt in i databasen.
Det betyder att valideringen är det enda som håller." Det är texten som
efterfrågas. Den säger vad du såg och vad det betyder.
7. Inlämning
- Kontrollera att projektet startar och att alla sidor svarar.
- Radera din
.db-fil och kördotnet ef database updateigen. Får du tillbaka en databas med dina poster fungerar migrationen. - Spara en post via formuläret, starta om servern och kontrollera att den är kvar.
- Kringgå klientvalideringen med DevTools och kontrollera att servern stoppar.
- Ta skärmbilden av tabellen och lägg den i repot.
- Skriv texterna i
README.md. - Gå igenom kravlistan för den nivå du siktar på.
git add .,git commit -m "…",git push- Öppna ditt repo på github.com och se att
Migrations/finns där – och att.db-filen inte gör det. - Klistra in repots adress i inlämningsrutan i itslearning.
Deadline är tisdag 22 december kl 23:59, samma dag som terminen slutar. Det finns inget prov efter det här området – lämna in och gå på lov.
8. Vanliga misstag
Det här är det som gör att uppgiften underkänns i onödan.
| Misstag | Vad som händer | Undvik det så här |
|---|---|---|
.db-filen committad | Repot innehåller din lokala databas i stället för ett recept | *.db i .gitignore. Migrationen är det som ska delas |
Migrations/ inte committad | Ingen annan kan bygga databasen | Kontrollera på github.com att mappen finns |
| Migration redigerad för hand | Nästa migration blir fel | migrations remove, ändra klassen, lägg till en ny |
| Gamla listan kvar | En sida kan smyga tillbaka till den | Radera den. Bygget blir kontrollen |
AddDbContext i stället för fabriken | A second operation was started on this context | AddDbContextFactory, ett context per metod |
DataAnnotationsValidator glömd | Allt sparas. Attributen läses aldrig | Raden är inte valfri – utan den finns ingen validering |
OnSubmit i stället för OnValidSubmit | Ogiltiga poster sparas | OnValidSubmit körs bara när valideringen gick igenom |
| Bara klientvalidering testad | Du vet inte om servern håller | DevTools-testet. Två minuter |
ErrorMessage saknas | Engelska felmeddelanden mitt i en svensk sajt | Skriv den på varje attribut |
Id som fält i formuläret | Krockar med databasens numrering | Ta bort det. Databasen delar ut id |
| Litar på databasen som skyddsnät | Den fångar ingenting utom tomma fält | [Range] finns bara i valideringen. Se guidens steg 8 |
| Allt committat sista kvällen | Historiken visar inte arbetet | Committa efter varje pass |