← Webbserverprogrammering 1 Område 6 · Datadriven applikation Felsökning

Webbserverprogrammering 1 · område 6 · v.2–10

Datadriven applikation – CRUD, relationer och inloggning

Vårterminens första och största projekt. Höstens delar sätts ihop till en riktig applikation: komponenterna visar, tjänsterna gör arbetet, och databasen minns. Din applikation får alla fyra operationerna, en kategori i en egen tabell, en sökning som görs av databasen, och en inloggning som skyddar allt som ändrar något.

1. Fjorton lektioner

Sju genomgångar i början, sedan mest arbetspass. Kolumnen längst till höger säger vad du gör om du var borta.

#DatumLängdVad vi görMissade du passet?
35ons 13 jan45 min Vårterminen: från övningar till projekt. Projekt 1 delas ut och läses tillsammans. Vad en projektplan är, och varför den bedöms. Uppgiften: så är den uppdelad, etapp 1, och vårens fyra projekt
36tis 19 jan85 min CRUD i praktiken. Ändra och ta bort, och listvyn med sortering och sidor i adressen. Guiden steg 1–4, särskilt de två fällorna i steg 3
37ons 20 jan45 min Relationer i code-first. Kategorin, den främmande nyckeln, och migrationen som kan gå sönder på din egen databas. Projektplanen committad. Guiden steg 5–9, särskilt steg 6
38tis 26 jan85 min LINQ: filtrera, sortera och söka. SQL-loggningen, sökningen i databasen, och varför databasen inte kan svenska. Guiden steg 10–13
39ons 27 jan45 min Egen validering. Ett eget attribut, en regel över två fält, och en regel som kräver databasen. Guiden steg 14–16
40tis 2 feb85 min Inloggning och behörighet. Identity, inloggningssidan, och att skydda sidan i stället för att dölja länken. Guiden steg 17–23, särskilt steg 21
41ons 3 feb45 min Kodningsstandard och dokumentation. Kodgranskning i par. Guiden steg 24 och granskningen i etapp 4
42tis 9 feb85 min Arbetspass. Milstolpe 1: kategorin, relationen och migrationen. Etapp 2, med milstolpens kontroll
43ons 10 feb45 min Renderingslägen: statisk och interaktiv. Varför knapparna i en tabell inte gör något. Sportlov veckan efter. Guiden steg 25–26
44tis 23 feb85 min Arbetspass. Alla fyra operationerna, inför milstolpen dagen efter. Etapp 3
45ons 24 feb45 min Arbetspass. Milstolpe 2: alla fyra CRUD-operationerna, kontrollerade av någon annan. Etapp 3, med milstolpens kontroll
46tis 2 mars85 min Arbetspass. Avstämning med läraren, en och en, och självgranskningen. Etapp 4, med självgranskningen och avstämningens fyra kontroller
47ons 3 mars45 min Arbetspass och sista finputs. Uppföljningen, README.md, och vad provet prövar. Etapp 5 och vad prov 4 prövar
48tis 9 mars85 min Prov 4 – databas och datadriven applikation. 80 minuter, utan dator. Vad prov 4 prövar

2. Det här ska sitta

3. Fel som inte syns

Hittills har de flesta fel sagt ifrån: bygget misslyckas, migrationen avbryts, sidan svarar 500. Det här området har fler fel än något tidigare som inte säger någonting alls.

Det du serDet som händeGuiden
Ändringen sparades, sidan gick tillbaka till listanÄndringen är borta – = i stället för ??=Steg 3
Ändringen sparadesDet blev en post till – det dolda fältet för Id saknasSteg 3
Detaljsidan ser ut som förutKategorin skulle ha stått där – Include saknasSteg 7
Menylänken är borta för den som är utloggadSidan svarar ändå, för den som vet adressenSteg 21
Utloggningsformuläret har en tokenIngen kontrollerar den, och vilken sajt som helst kan logga ut besökarenSteg 23
Gör Kontrollera-raden, också när allt ser rätt ut

Varje steg i guiden slutar med en kontroll. I det här området är den inte en formalitet: den är det enda sättet att se felen ovan. Och varje etapp i uppgiften har en kontroll du gör själv, med samma skäl.

4. Kom igång

Du börjar inte om. Området bygger vidare på projektet från område 5.

StegDet du gör
1Starta ditt projekt från område 5. Lägg till en post via formuläret, stoppa servern och starta igen. Finns posten kvar är du redo. Ny dator efter lovet? Klona repot och kör dotnet ef database update.
2Kontrollera att dotnet ef --version svarar. Gör den inte det: dotnet tool install --global dotnet-ef, en gång.
3Läs uppgiften från början till slut, och se hur den är uppdelad i etapper.
4Fyll i guidens översättningstabell för din domän. Den blir första delen av projektplanen.
5Skriv PROJEKTPLAN.md och committa den senast onsdag 20 januari – etapp 1.
dotnet ef --version
dotnet ef database update

Mappstrukturen du är på väg mot:

DittProjekt/
├── Components/
│   ├── Layout/
│   │   └── NavMenu.razor        AuthorizeView runt administrationens länkar
│   └── Pages/
│       ├── AdminPoster.razor    listvyn: sortering och sidor i adressen  [Authorize]
│       ├── NyPost.razor         formuläret från område 5, med rullista    [Authorize]
│       ├── AndraPost.razor      samma formulär mot en befintlig post      [Authorize]
│       ├── TaBortPost.razor     bekräftelse, och en POST som tar bort     [Authorize]
│       ├── Kategorisidan.razor  en kategori och dess poster
│       └── LoggaIn.razor
├── Data/
│   └── DittProjektContext.cs    IdentityDbContext, två DbSet
├── Migrations/                  minst tre – redigeras aldrig för hand
├── Models/                      huvudentiteten och kategorin
├── Services/                    två tjänster, två gränssnitt
├── Validering/                  ditt eget attribut
├── PROJEKTPLAN.md
├── README.md
└── UPPFOLJNING.md

Committa efter varje pass. Uppgiften kräver commits på minst åtta olika dagar, och historiken är det som visar hur arbetet gick.

5. Felsökning

Sök på felmeddelandet du fick, eller på ett ord ur det. Kolumnen när säger om felet kommer vid bygget, vid migrationen, vid sidvisningen – eller aldrig, och då är det de tysta felen ovan. Den fullständiga tabellen står i guiden.

18 rader

SymptomNärTrolig orsakÅtgärd
SQLite Error 19: 'FOREIGN KEY constraint failed' vid database updatemigrationenDina egna rader fick 0 som kategorimigrations remove, HasDefaultValue med ett id som finns, ny migration. Steg 6.
Migrationen står som (Pending)migrationendatabase update misslyckades eller kördes aldrigLäs felet och kör database update igen.
The entity type 'IdentityPasskeyData' requires a primary keymigrationenbase.OnModelCreating(byggare) saknasLägg raden först i OnModelCreating. Steg 17.
The seed entity for entity type … has the navigation … setmigrationenFrödatan anger kategorin som objektAnge den främmande nyckeln, inte navigationsegenskapen.
CS0182: An attribute argument must be a constant expressionbyggetNågot som räknas ut i ett attributs argumentSkriv ett eget attribut. Steg 14.
RZ10012 om AuthorizeViewbygget@using saknas@using Microsoft.AspNetCore.Components.Authorization i _Imports.razor.
Cannot parse the value 'abc' as type – 500sidvisningEn parameter ur adressen är int?Läs den som string? och tolka med int.TryParse. Steg 2.
The LINQ expression … could not be translated – 500sidvisningNågot i Where finns inte i SQLEF.Functions.Like, eller filtrera i C# efter hämtningen – och motivera det.
There is no registered service of type 'SignInManager…'sidvisning.AddSignInManager() saknasSist i kedjan efter AddIdentityCore. Steg 18.
Authorization requires a cascading parameter – 500 på varje sidasidvisningAddCascadingAuthenticationState saknasEn rad i Program.cs.
Utloggad hamnar på /Account/Login och får 404sidvisningConfigureApplicationCookie saknasLoginPath = "/konto/logga-in". Steg 18.
En POST svarar 400sidvisningAntiforgery-token saknasEditForm eller <AntiforgeryToken />.
Fel e-post eller lösenord. med rätt uppgiftersidvisningAnvändaren skapades aldrig – lösenordet var för kortMinst åtta tecken. Kontrollera AspNetUsers.
Ändringen sparas intealdrig= i stället för ??=Steg 3.
En ändring blir en ny postaldrigDolda fältet för Id saknas eller heter felname="Film.Id" – modellens namn, punkt, egenskapen.
Kategorin syns intealdrigInclude saknasSteg 7.
Utloggad kommer åt en sida som ändrar dataaldrigBara menylänken är dold[Authorize] på sidan. Steg 22.
Sökningen hittar inget med versaleraldrigSQLite viker bara A–ZFörväntat. Välj var sökningen görs, och skriv varför. Steg 12.

6. Orden

Orden nedan används från och med nu utan förklaring. Träna tills du kan dem – prov 4 frågar efter flera av dem i klartext.

Ordträning

OrdBetyder
CRUDCreate, Read, Update, Delete – de fyra sakerna man gör med data.
främmande nyckelEn kolumn som pekar på en rad i en annan tabell. GenreId pekar på en genre.
navigationsegenskapEn egenskap som håller det relaterade objektet. Ligger inte i någon kolumn, och är tom tills den beställs.
en-till-mångaMånga poster hör till en kategori. En kategori har många poster.
IncludeSäger åt EF Core att hämta relaterad data i samma fråga. Blir en JOIN.
cascade deleteTas kategorin bort, tas dess poster bort också. ON DELETE CASCADE.
LINQMetoderna Where, OrderBy, Select med flera – samma namn i C# och mot databasen.
IQueryableEn fråga som inte körts än. Den går till databasen först vid ToListAsync.
frågesträngDelen av adressen efter ?, till exempel ?sortera=titel&sida=2. Skrivs av besökaren.
ValidationAttributeBasklassen för [Required] och [Range] – och för dina egna attribut.
IValidatableObjectEtt gränssnitt för regler som gäller hela objektet. Körs efter attributen, och bara om de gick igenom.
ValidationMessageStoreStället där formulärets fel samlas. Dit lägger du ett fel som kräver databasen.
IdentityASP.NET Cores system för användare, lösenord och inloggning.
hashEn envägsomvandling av lösenordet. Går att jämföra med, men inte att räkna tillbaka.
autentiseringAtt ta reda på vem du är. Inloggningen.
auktoriseringAtt avgöra vad du får göra. [Authorize].
AuthorizeViewVisar innehåll bara för den som är inloggad. Bestämmer vad som ritas, inte vad som går att nå.
endpointEn adress som svarar på förfrågningar utan att vara en sida. app.MapPost.
antiforgery-tokenEtt värde i formuläret som bevisar att det kom från din egen sajt. Skyddar bara om servern kontrollerar det.
open redirectEn sida som skickar besökaren vidare till en adress ur frågesträngen, också till andra sajter.
renderingslägeOm en komponent renderas en gång på servern, eller hålls levande över en uppkoppling.
kretsUppkopplingen och komponenten som lever på servern i interaktivt läge.
förrenderingAtt en interaktiv komponent först renderas statiskt, så att något syns direkt. Livscykeln körs därför två gånger.