← Webbserverprogrammering 1 Område 3 · Komponenter, routing och layout Felsökning

Webbserverprogrammering 1 · område 3 · v.41–46

Komponenter, routing och layout

Applikationen slutar vara sidor och blir byggstenar. Ett kort är en fil, en lista är en fil, och samma kort står på två sidor utan att skrivas två gånger. Adressen börjar bära data: /filmer/2 visar film nummer två. Här väljer du också vad ditt projekt ska handla om – resten av läsåret.

1. Åtta lektioner

Tisdagarna bär det nya, onsdagarna befäster. Kolumnen längst till höger säger vad du gör om du var borta.

#DatumLängdVad vi görMissade du passet?
15ons 7 okt45 min Komponenten som byggsten. Skillnaden mellan en sida och en komponent, och kortet som bryts ut ur sidan. Guiden steg 1–2, och välj din domän
16tis 13 okt85 min Parametrar och dataflöde. [Parameter], typade parametrar, data nedåt, ChildContent. Områdets tyngsta pass. Guiden steg 3–7, sedan övning 29–40
17ons 14 okt45 min Övningspass. Eget arbete med handledning, inget nytt. Övning 29–40
18tis 20 okt85 min Routing. @page med parameter, :int, NavigationManager, frågesträngen, 404. Guiden steg 9–11, sedan övning 41–46
19ons 21 okt45 min Layout, delade komponenter och livscykel. @Body, _Imports.razor, OnParametersSet. Höstlov efter det här passet. Guiden steg 13–15 och övning 47–50
20tis 3 nov85 min Arbetspass. Eget projekt med handledning. Kravlistan och checklistan
21ons 4 nov45 min Sista finputs. Kamratgranskning mot uppgiftens checklista, och sex komponenter som går sönder. De sex komponenterna och vad provet prövar
22tis 10 nov85 min Prov 2. Skriftligt, 80 minuter, utan dator. Går inte att ta igen på egen hand – anmäl frånvaron och gör uppsamlingsprovet

2. Det här ska sitta

3. Felen kommer när sidan öppnas

Det här är den enskilt viktigaste skillnaden mot område 2, och det är värt att läsa två gånger.

Kompilatorn slutar hjälpa dig

En komponenttagg är inte ett metodanrop. <FilmKort Film="film" /> är en beskrivning som slås upp på namn, när sidan renderas. Därför kan du glömma [Parameter], stava en parameter fel eller döpa din RenderFragment till något annat än ChildContent – och få 0 Warning(s), 0 Error(s) ändå.

Felet kommer i stället som 500 när någon öppnar sidan, och meddelandet står i terminalen där dotnet run körs.

Två vanor som gör hela skillnaden i det här området:

Det finns ett undantag: RZ9996 är områdets enda fel som kommer redan vid bygget. Blandar du en namngiven RenderFragment med lös markup vägrar Razor bygga, och meddelandet räknar upp vilka namn komponenten accepterar.

4. Kom igång

Du börjar inte om. Det här området bygger vidare på projektet från område 2 – så kommer det att vara resten av kursen.

StegDet du gör
1Öppna ditt projekt från område 2 och kontrollera att det startar med dotnet run.
2Välj din domän. Kriterierna står på egen sida, och valet ska vara gjort till lektion 16.
3Skriv om din modellklass till den nya domänen. Den behöver ett Id och ett längre beskrivningsfält.
4Flytta listan ut ur sidan, till en egen fil i Models/. Minst sex poster.
5Skapa mapparna Components/Delade/ och en mapp för dina domänkomponenter.
6Skriv domänvalet som en rad i projektets README.md – det är ett krav i inlämningen.

Committa efter varje pass. Höstlovet ligger mitt i området, och den som committar allt sista kvällen har en historik som inte visar något arbete.

5. Felsökning

Sök på felmeddelandet du fick, eller på ett ord ur det. Nästan alla rader nedan är körfel: projektet byggde, sidan svarade 500.

16 rader

SymptomTrolig orsakÅtgärd
has a property matching the name 'X', but it does not have [Parameter]Egenskapen finns, men attributet saknasSätt [Parameter] på raden ovanför. Kontrollera också att den är public.
does not have a property matching the name 'X'Du sätter en parameter som komponenten inte harStavfel, eller så glömdes parametern. Jämför taggen med @code-blocket.
does not have a property matching the name 'ChildContent'Det står markup mellan taggarna, men komponenten har ingen ChildContentNamnet måste vara exakt ChildContent. Innehall fungerar inte.
does not have a property matching the name 'id'Ruttens namn och egenskapens namn skiljer sig{id:int} kräver en egenskap som heter Id. Stavningen måste stämma.
Unable to cast object of type 'System.String' to type 'System.Int32'Rutten saknar :intSkriv {id:int}, inte {id}. Allt i en adress är text tills du säger annat.
AmbiguousMatchException: The request matched multiple endpointsTvå komponenter har samma @pageSök i projektet efter adressen. Oftast en gammal sida som skulle tagits bort.
RZ9996: Unrecognized child content inside component 'X'Namngiven RenderFragment blandad med lös markupSkriv ut <ChildContent> också. Används en namngiven måste alla skrivas ut.
RZ9988: The @page directive must specify a route templateRutten saknar inledande snedstreck@page "/ovningar/41", inte @page "ovningar/41".
CS0103: The name 'Body' does not exist in the current contextLayouten saknar @inheritsLägg @inherits LayoutComponentBase överst i layoutfilen.
Found markup element with unexpected name 'Ruta' (varning)Komponenten hittades inte – taggen behandlas som HTML@using saknas, eller filnamnet är felstavat. Sidan renderar tomt utan att krascha.
CS1526: A new expression requires an argument list@new skrivet direkt i markupenFlytta uttrycket till en metod i @code och anropa den.
Sidan svarar 500 men bygget gav noll felNästan alla fel i det här området är körfelLäs terminalen där dotnet run körs, och öppna sidan efter varje ändring.
/filmer/99 ger tom sida med status 200NotFound() saknas@inject NavigationManager, anropa NotFound() och glöm inte return efter.
NullReferenceException efter NotFound()return saknas – metoden fortsatte med nullLägg return; direkt efter anropet.
Sida 0 när talet saknas i adressenEtt int sätts till 0. Startvärdet skrivs överAnvänd int? och ?? 1. Parametrar som saknas nollställs, de behåller inte startvärden.
Knappen gör ingenting när man klickar@onclick vid statisk serverrenderingAnvänd <form method="get">. Klick finns inte här, och felet lämnar inga spår.

6. Orden

Orden nedan används från och med nu utan förklaring. Träna tills du kan dem – en av provets fyra frågetyper är förklara.

Ordträning

OrdBetyder
komponentEn .razor-fil med markup och @code. Går att använda inuti andra komponenter.
sidaEn komponent som har @page och därför en egen adress.
parameterEtt värde som skickas in i en komponent utifrån.
[Parameter]Attributet som gör en egenskap mottaglig utifrån. Utan det når värdet inte fram.
[EditorRequired]Gör att editorn varnar om parametern glöms. En varning, inte ett krav – koden bygger ändå.
förvalt värdeEtt startvärde på en parameter, som gör den frivillig att sätta.
dataflödeAtt data går nedåt: sidan bestämmer, komponenten visar. Komponenten kan inte svara tillbaka.
RenderFragmentMarkup som skickas in i en komponent, inte bara ett värde.
ChildContentNamnet på den RenderFragment som fylls med det som står mellan taggarna. Namnet är inte fritt valt.
ruttMönstret i @page som avgör vilken adress som leder till komponenten.
ruttparameterEn del av adressen som blir en parameter: {id:int}.
ruttbegränsning:int i {id:int}. Adressen matchar bara om delen är ett heltal.
statuskodServerns svar i siffror. 200 betyder att allt gick bra, 404 att sidan inte finns.
NavigationManagerTjänsten som kan adresser: läsa dem, byta dem och säga att något inte finns.
layoutRamen runt sidan. En komponent med ett hål som routern fyller.
@BodyHålet i layouten. Här renderas den sida rutten pekade ut.
_Imports.razorFilen med @using som gäller mappen och alla undermappar. Bara för .razor.
livscykelDe metoder Blazor kallar på i tur och ordning när en komponent byggs.
OnInitializedKörs en gång när objektet skapats. För sådant som inte beror på parametrarna.
OnParametersSetKörs varje gång parametrarna sätts. För sådant som beror på dem.
körfelEtt fel som uppstår när sidan renderas, inte när projektet byggs. Områdets vanligaste sort.
dependency injectionAtt be ramverket om en tjänst i stället för att skapa den själv. @inject. Område 4 handlar om det.