Webbserverprogrammering 1 · område 3 · lektion 21–22
Vad prov 2 prövar
Osäkerhet inför ett prov kostar mer än innehållet. Den här sidan säger vad som kommer, vad som inte kommer, och hur frågorna ser ut. Tre av de fyra frågetyperna har kod i sig – de finns nedan, körda och klara.
- 9 nov Inlämning 3, kl 23:59 Att göra klart uppgiften är den bästa provförberedelsen som finns.
- 10 nov Prov 2 – komponenter, routing och layout 80 minuter, utan dator.
1. Formen
- Åttio minuter. Sluttiden skrivs på tavlan.
- Ingen dator, ingen telefon, inga anteckningar. Papper och penna.
- Fjorton frågor. Poängen står vid varje fråga.
- Läs hela provet innan du börjar svara.
- Kod som är nästan rätt ger poäng. En komponent utan
[Parameter]men med allt annat rätt är värd mer än ett tomt svar.
2. Vad som kommer
| Område | Ungefär | Typiskt innehåll |
|---|---|---|
| Komponent kontra sida | 2 frågor | Vad @page gör, var en komponent kan användas |
| Parametrar | 4 frågor | [Parameter], public, typade parametrar, förvalda värden |
| Dataflöde | 2 frågor | Vem bestämmer vad, varför data går nedåt |
RenderFragment | 1 fråga | ChildContent och namngivna fragment |
| Routing | 3 frågor | Ruttparameter, :int, frågesträng, 404 |
| Layout och livscykel | 2 frågor | @Body, OnInitialized mot OnParametersSet |
Det här kommer säkert: skillnaden mellan en komponent och en sida. Vad
[Parameter] gör. Vad :int gör. Varför
/filmer/99 ska svara 404 och inte 200. Och när
OnParametersSet körs.
Det här kommer inte: ingen CSS, inga metodnamn ur ramverket som inte använts i kursen, ingenting om databaser eller tjänster.
Att något kompilerar räcker aldrig som svar på om det är rätt. Det är områdets kärna, och den syns i provet.
3. Frågetyp 1 – vad skrivs ut?
Du får en komponent och en sida som använder den, och skriver vad som hamnar på skärmen.
Komponenten:
<p>
@Titel (@Ar) talas på @Sprak.
</p>
@code {
[Parameter]
[EditorRequired]
public string Titel { get; set; } = "";
[Parameter]
[EditorRequired]
public int Ar { get; set; }
[Parameter]
public string Sprak { get; set; } = "japanska";
}
Sidan:
@page "/provtraning/1"
@* Frågetyp 1: vad skrivs ut? *@
<h1>Provfråga 1</h1>
<Sats Titel="Sju samurajer" Ar="1954" />
<Sats Titel="Cykeltjuven" Ar="1948" Sprak="italienska" />
@code {
}
Svara innan du klickar.
| Fråga | Svar |
|---|---|
| Vad står på sidan? | Sju samurajer (1954) talas på japanska. och
Cykeltjuven (1948) talas på italienska. |
| Varför står det japanska på första raden, när sidan aldrig nämner något språk? | Sprak har ett förvalt värde. En parameter med förval är frivillig att sätta – sätts den inte används förvalet. Det är fällan i den här frågan. |
Vad hade hänt om Titel utelämnats? |
Ingenting alls vid bygget. [EditorRequired] är en varning i editorn, inte ett krav. Sidan hade renderat med tom titel. |
4. Frågetyp 2 – vad är fel?
Ett kodstycke som bygger utan fel och utan varningar, kör utan att krascha – och ändå svarar fel.
@page "/provtraning/2"
@page "/provtraning/2/{sida:int}"
@* Frågetyp 2: vad är fel? Sidan bygger, kraschar inte, och svarar ändå fel. *@
<h1>Sida @Sida av 4</h1>
<p>Visar poster @((Sida - 1) * 10 + 1) till @(Sida * 10).</p>
@code {
[Parameter]
public int Sida { get; set; } = 1;
}
Sidan finns på två adresser. Vad blir fel, och på vilken?
| Fråga | Svar |
|---|---|
Vad visar /provtraning/2/3? |
Sida 3 av 4 och Visar poster 21 till 30. Helt rätt. |
Vad visar /provtraning/2? |
Sida 0 av 4 och Visar poster -9 till 0. Fel, utan ett enda felmeddelande. |
| Varför? | Blazor sätter varje parameter vid varje rendering. Den som inte finns i adressen sätts till typens tomma värde – 0 för int. Startvärdet = 1 skrivs över innan sidan renderas. |
| Rättningen? | public int? Sida { get; set; } och @(Sida ?? 1) där värdet används. Med int? är det tomma värdet null, och då går det att skilja "saknas" från "noll". |
5. Frågetyp 3 – skriv koden
Du får en beskrivning och skriver komponenten för hand. Så här kan den lyda:
Skriv en komponent
Lagerstatussom tar emot ett antal somintoch visar Slut när antalet är noll, Få kvar (N) när det är lågt och I lager (N) annars. Gränsen för "lågt" ska gå att ändra utifrån, men ska vara 3 om ingen säger något.
Ett fullpoängssvar:
<span class="@Klass()">@Text()</span>
@code {
[Parameter]
[EditorRequired]
public int Antal { get; set; }
[Parameter]
public int Grans { get; set; } = 3;
private string Klass() => Antal == 0 ? "etikett etikett-nej" : "etikett etikett-ja";
private string Text()
{
if (Antal == 0)
{
return "Slut";
}
if (Antal <= Grans)
{
return $"Få kvar ({Antal})";
}
return $"I lager ({Antal})";
}
}
Och en sida som använder den:
@page "/provtraning/3"
@* Frågetyp 3: skriv koden. Det här är ett fullpoängssvar. *@
<h1>Provfråga 3</h1>
<Lagerstatus Antal="7" />
<Lagerstatus Antal="0" />
<Lagerstatus Antal="2" Grans="5" />
@code {
}
[Parameter] på båda, public på båda, rätt typ
(int, inte string), och ett förvalt värde på
Grans så att den blir frivillig. Att logiken ligger i en metod och
inte i markupen ger poäng men är inte ett krav.
Handskriven kod behöver inte kompilera på papper. Ett saknat semikolon kostar
ingenting – ett saknat [Parameter] gör det.
6. Frågetyp 4 – förklara
En mening om varför något är som det är. Den här typen har ingen kod, och den går inte att plugga in kvällen före – den kräver att du byggt något och tänkt på varför.
Exempel på hur de kan låta:
- Varför måste en parameter vara
public? - Varför kan inte en komponent ändra i listan den fick?
- Varför är det ett problem att en sida som säger "finns inte" svarar 200?
- Varför spelar det roll var uppslagningen ligger, när båda metoderna körs en gång var ändå?
7. Fjorton repetitionsfrågor
Svara högt för dig själv innan du klickar på raden. Att känna igen ett svar är inte samma sak som att kunna det.
| Fråga | Svar |
|---|---|
| Vad skiljer en sida från en komponent? | En rad: @page. Med den har komponenten en egen adress. |
Vad heter taggen för en fil som heter FilmKort.razor? | <FilmKort />. Taggen är filnamnet, och stor begynnelsebokstav krävs. |
Vad gör [Parameter]? | Gör en egenskap mottaglig utifrån. Utan attributet vägrar Blazor sätta den. |
Varför måste parametern vara public? | En private egenskap går inte att sätta utifrån, hur många attribut man än sätter på den. |
Vad händer om [Parameter] glöms? | Projektet bygger utan fel och utan varningar. Sidan svarar 500 när den öppnas. |
| Vad gör ett förvalt värde på en parameter? | Gör den frivillig att sätta. Sätts den inte används förvalet. |
| Vad betyder att data flödar nedåt? | Sidan bestämmer vad komponenten ska visa. Komponenten kan inte svara tillbaka – annars måste man läsa varenda komponent för att veta vad som händer med datan. |
Vad är skillnaden mellan en string-parameter och en RenderFragment? | En string skickar in ett värde. En RenderFragment skickar in markup: stycken, listor, till och med andra komponenter. |
Varför måste den heta just ChildContent? | Blazor letar efter exakt det namnet när det står markup mellan öppnings- och stängningstaggen. Ett annat namn måste skrivas ut som en tagg. |
Vad gör :int i {id:int}? | Rutten matchar bara om delen är ett heltal, och Blazor gör om texten till int. Utan den kraschar sidan på /filmer/abc. |
Vad är skillnaden mellan /filmer/3 och /filmer?sok=cykel? | Det första säger vilken sak som ska visas och måste finnas. Det andra säger hur den ska visas och är frivilligt. |
| Varför räcker det inte att skriva "finns inte" på sidan? | Statuskoden blir då 200. Sökmotorer, övervakning och andra program läser koden, inte texten. NavigationManager.NotFound() ger 404. |
Vad är @Body? | Hålet i layouten, av typen RenderFragment – samma typ som ChildContent. Routern fyller det med sidan. |
När körs OnAfterRender vid statisk serverrendering? | Aldrig. Servern bygger HTML, skickar i väg den, och komponenten är borta. Det finns ingen sida i webbläsaren att prata med. |
Gör klart inlämningen. Provet frågar om exakt det du bygger där – och den som fått sin egen detaljsida att svara 404 på ett id som inte finns behöver inte plugga på den frågan.