Deel 2: een controller toevoegen aan een ASP.NET Core MVC-app
Notitie
Dit is niet de nieuwste versie van dit artikel. Zie de .NET 9-versie van dit artikelvoor de huidige release.
Waarschuwing
Deze versie van ASP.NET Core wordt niet meer ondersteund. Zie de .NET- en .NET Core-ondersteuningsbeleidvoor meer informatie. Zie de .NET 9-versie van dit artikelvoor de huidige release.
Belangrijk
Deze informatie heeft betrekking op een pre-releaseproduct dat aanzienlijk kan worden gewijzigd voordat het commercieel wordt uitgebracht. Microsoft geeft geen garanties, uitdrukkelijk of impliciet, met betrekking tot de informatie die hier wordt verstrekt.
Zie de .NET 9-versie van dit artikelvoor de huidige release.
Door Rick Anderson
Het Model-View-Controller (MVC) architectuurpatroon scheidt een app in drie hoofdcomponenten: Model, View, en Controller. Met het MVC-patroon kunt u apps maken die testbaar en gemakkelijker kunnen worden bijgewerkt dan traditionele monolithische apps.
Op MVC gebaseerde apps bevatten:
-
Models: klassen die de gegevens van de app vertegenwoordigen. De modelklassen gebruiken validatielogica om bedrijfsregels voor die gegevens af te dwingen. Modelobjecten halen de modelstatus meestal op en slaan deze op in een database. In deze zelfstudie haalt het
Movie
model filmgegevens op uit een database, geeft ze door aan de weergave of werkt ze bij. Bijgewerkte gegevens worden naar een database geschreven. - V: Weergaven zijn de onderdelen die de gebruikersinterface (UI) van de app weergeven. Over het algemeen worden in deze gebruikersinterface de modelgegevens weergegeven.
-
Controllers: Klassen die:
- Browseraanvragen verwerken.
- Modelgegevens ophalen.
- Weergavesjablonen aanroepen die een antwoord retourneren.
In een MVC-app wordt in de weergave alleen informatie weergegeven. De controller verwerkt en reageert op gebruikersinvoer en -interactie. De controller verwerkt bijvoorbeeld URL-segmenten en queryreekswaarden en geeft deze waarden door aan het model. Het model kan deze waarden gebruiken om een query uit te voeren op de database. Bijvoorbeeld:
-
https://localhost:5001/Home/Privacy
: hiermee geeft u deHome
controller en de actiePrivacy
op. -
https://localhost:5001/Movies/Edit/5
: is een aanvraag om de film met ID=5 te bewerken met behulp van deMovies
controller en deEdit
-actie, die verderop in de zelfstudie worden beschreven.
Routegegevens worden verderop in de handleiding uitgelegd.
Het architectuurpatroon van MVC scheidt een app in drie hoofdgroepen onderdelen: Modellen, Weergaven en Controllers. Dit patroon helpt bij het bereiken van scheiding van problemen: de UI-logica hoort in de weergave. Invoerlogica hoort bij de controller. Bedrijfslogica hoort bij het model. Deze scheiding helpt bij het beheren van complexiteit bij het bouwen van een app, omdat hiermee tegelijkertijd wordt gewerkt aan één aspect van de implementatie zonder dat dit van invloed is op de code van een andere. U kunt bijvoorbeeld aan de weergavecode werken zonder dat u afhankelijk bent van de bedrijfslogicacode.
Deze concepten worden geïntroduceerd en gedemonstreerd in deze reeks zelfstudies tijdens het bouwen van een film-app. Het MVC-project bevat mappen voor de Controllers en weergaven.
Een controller toevoegen
Klik in Solution Explorermet de rechtermuisknop op Controllers >> Controller toevoegen.
Selecteer in het dialoogvenster Nieuw gestructureerd item toevoegen de optie Lege MVC-controller>en klik op Toevoegen.
Voer in het dialoogvenster Add New Item - MvcMovieHelloWorldController.cs
in en selecteer Add.
Vervang de inhoud van Controllers/HelloWorldController.cs
door de volgende code:
using Microsoft.AspNetCore.Mvc;
using System.Text.Encodings.Web;
namespace MvcMovie.Controllers;
public class HelloWorldController : Controller
{
//
// GET: /HelloWorld/
public string Index()
{
return "This is my default action...";
}
//
// GET: /HelloWorld/Welcome/
public string Welcome()
{
return "This is the Welcome action method...";
}
}
Elke public
methode in een controller kan worden aangeroepen als een HTTP-eindpunt. In het bovenstaande voorbeeld retourneren beide methoden een tekenreeks. Noteer de opmerkingen voorafgaand aan elke methode.
Een HTTP-eindpunt:
- Is een doel-URL in de webtoepassing, zoals
https://localhost:5001/HelloWorld
. - Combineert:
- Het gebruikte protocol:
HTTPS
. - De netwerklocatie van de webserver, inclusief de TCP-poort:
localhost:5001
. - De doel-URI:
HelloWorld
.
- Het gebruikte protocol:
De eerste opmerking geeft aan dat dit een HTTP GET- methode is die wordt aangeroepen door /HelloWorld/
toe te voegen aan de basis-URL.
De tweede opmerking geeft een HTTP GET- methode op die wordt aangeroepen door /HelloWorld/Welcome/
toe te voegen aan de URL. Verderop in de zelfstudie wordt de scaffolding-engine gebruikt om HTTP POST
methoden te genereren, waarmee gegevens worden bijgewerkt.
Voer de app uit zonder het foutopsporingsprogramma door op Ctrl+F5-te drukken.
Voeg /HelloWorld
toe aan het pad in de adresbalk. De methode Index
retourneert een tekenreeks.
MVC roept controllerklassen aan en de actiemethoden hierin, afhankelijk van de binnenkomende URL. De standaard-URL-routeringslogica die door MVC wordt gebruikt, gebruikt een indeling zoals deze om te bepalen welke code moet worden aangeroepen:
/[Controller]/[ActionName]/[Parameters]
De routeringsindeling wordt ingesteld in het Program.cs
-bestand.
app.MapControllerRoute(
name: "default",
pattern: "{controller=Home}/{action=Index}/{id?}");
Wanneer u naar de app bladert en geen URL-segmenten opgeeft, wordt deze standaard ingesteld op de controller 'Home' en de methode 'Index' die is opgegeven in de sjabloonregel die hierboven is gemarkeerd. In de voorgaande URL-segmenten:
- Het eerste URL-segment bepaalt de controllerklasse die moet worden uitgevoerd. Daarom wordt
localhost:5001/HelloWorld
toegewezen aan de klasse HelloWorld Controller. - Het tweede deel van het URL-segment bepaalt de actiemethode voor de klasse.
localhost:5001/HelloWorld/Index
zorgt er dus voor dat deIndex
methode van deHelloWorldController
-klasse wordt uitgevoerd. U hoeft alleen naarlocalhost:5001/HelloWorld
te bladeren en deIndex
methode is standaard aangeroepen.Index
is de standaardmethode die op een controller wordt aangeroepen als er niet expliciet een methodenaam is opgegeven. - Het derde deel van het URL-segment (
id
) is voor routegegevens. Routegegevens worden verderop in de handleiding uitgelegd.
Blader naar: https://localhost:{PORT}/HelloWorld/Welcome
. Vervang {PORT}
door uw poortnummer.
De methode Welcome
wordt uitgevoerd en retourneert de tekenreeks This is the Welcome action method...
. Voor deze URL is de controller HelloWorld
en de actiemethode is Welcome
. U hebt het [Parameters]
deel van de URL nog niet gebruikt.
Wijzig de code om bepaalde parametergegevens van de URL door te geven aan de controller. Bijvoorbeeld /HelloWorld/Welcome?name=Rick&numtimes=4
.
Wijzig de methode Welcome
om twee parameters op te nemen, zoals wordt weergegeven in de volgende code.
// GET: /HelloWorld/Welcome/
// Requires using System.Text.Encodings.Web;
public string Welcome(string name, int numTimes = 1)
{
return HtmlEncoder.Default.Encode($"Hello {name}, NumTimes is: {numTimes}");
}
De voorgaande code:
- Gebruikt de functie optionele C#-parameter om aan te geven dat de
numTimes
parameter standaard 1 is als er geen waarde wordt doorgegeven voor die parameter. - Gebruikt
HtmlEncoder.Default.Encode
om de app te beschermen tegen schadelijke invoer, zoals via JavaScript. - Gebruikt geïnterpoleerde tekenreeksen in
$"Hello {name}, NumTimes is: {numTimes}"
.
Voer de app uit en blader naar: https://localhost:{PORT}/HelloWorld/Welcome?name=Rick&numtimes=4
. Vervang {PORT}
door uw poortnummer.
Probeer verschillende waarden voor name
en numtimes
in de URL. De MVC-modelbinding systeem wijst automatisch de benoemde parameters van de queryreeks toe aan parameters in de methode. Zie Modelbinding voor meer informatie.
In de vorige afbeelding:
- Het URL-segment
Parameters
wordt niet gebruikt. - De parameters
name
ennumTimes
worden doorgegeven in de queryreeks. - De
?
(vraagteken) in de bovenstaande URL is een scheidingsteken, waarna de querytekenreeks volgt. - Het
&
teken scheidt veld-waardeparen.
Vervang de Welcome
methode door de volgende code:
public string Welcome(string name, int ID = 1)
{
return HtmlEncoder.Default.Encode($"Hello {name}, ID: {ID}");
}
Voer de app uit en voer de volgende URL in: https://localhost:{PORT}/HelloWorld/Welcome/3?name=Rick
In de voorgaande URL:
- Het derde URL-segment komt overeen met de routeparameter
id
. - De methode
Welcome
bevat een parameterid
die overeenkomt met de URL-sjabloon in de methodeMapControllerRoute
. - Met de afsluitende
?
wordt de queryreeksgestart.
app.MapControllerRoute(
name: "default",
pattern: "{controller=Home}/{action=Index}/{id?}");
In het voorgaande voorbeeld:
- Het derde URL-segment komt overeen met de routeparameter
id
. - De methode
Welcome
bevat een parameterid
die overeenkomt met de URL-sjabloon in de methodeMapControllerRoute
. - De afsluitende
?
(inid?
) geeft aan dat de parameterid
optioneel is.
Het architectuurpatroon Model-View-Controller (MVC) scheidt een app in drie hoofdonderdelen: Model, View en Controller. Met het MVC-patroon kunt u apps maken die testbaar en gemakkelijker kunnen worden bijgewerkt dan traditionele monolithische apps.
Op MVC gebaseerde apps bevatten:
-
Models: klassen die de gegevens van de app vertegenwoordigen. De modelklassen gebruiken validatielogica om bedrijfsregels voor die gegevens af te dwingen. Modelobjecten halen de modelstatus meestal op en slaan deze op in een database. In deze zelfstudie haalt een
Movie
-model filmgegevens op uit een database, biedt deze gegevens aan de weergave of werkt ze bij. Bijgewerkte gegevens worden naar een database geschreven. - V: Weergaven zijn de onderdelen die de gebruikersinterface (UI) van de app weergeven. Over het algemeen worden in deze gebruikersinterface de modelgegevens weergegeven.
-
Controllers: klassen die:
- Browseraanvragen verwerken.
- Modelgegevens ophalen.
- Weergavesjablonen aanroepen die een antwoord retourneren.
In een MVC-app wordt in de weergave alleen informatie weergegeven. De controller verwerkt en reageert op gebruikersinvoer en -interactie. De controller verwerkt bijvoorbeeld URL-segmenten en queryreekswaarden en geeft deze waarden door aan het model. Het model kan deze waarden gebruiken om een query uit te voeren op de database. Bijvoorbeeld:
-
https://localhost:5001/Home/Privacy
: hiermee geeft u deHome
controller en de actiePrivacy
op. -
https://localhost:5001/Movies/Edit/5
: is een aanvraag om de film met ID=5 te bewerken met behulp van deMovies
controller en deEdit
-actie, die verderop in de zelfstudie worden beschreven.
Routegegevens worden verderop in de handleiding uitgelegd.
Het architectuurpatroon van MVC scheidt een app in drie hoofdgroepen onderdelen: Modellen, Weergaven en Controllers. Dit patroon helpt bij het bereiken van scheiding van problemen: de UI-logica hoort in de weergave. Invoerlogica hoort bij de controller. Bedrijfslogica hoort bij het model. Deze scheiding helpt bij het beheren van complexiteit bij het bouwen van een app, omdat hiermee tegelijkertijd wordt gewerkt aan één aspect van de implementatie zonder dat dit van invloed is op de code van een andere. U kunt bijvoorbeeld aan de weergavecode werken zonder dat u afhankelijk bent van de bedrijfslogicacode.
Deze concepten worden geïntroduceerd en gedemonstreerd in deze reeks zelfstudies tijdens het bouwen van een film-app. Het MVC-project bevat mappen voor de Controllers en weergaven.
Een controller toevoegen
Klik in Solution Explorermet de rechtermuisknop op Controllers >> Controller toevoegen.
Selecteer in het dialoogvenster Nieuw gescaffold item toevoegenLege MVC-controller>Toevoegen.
Voer in het dialoogvenster Add New Item - MvcMovieHelloWorldController.cs
in en selecteer Add.
Vervang de inhoud van Controllers/HelloWorldController.cs
door de volgende code:
using Microsoft.AspNetCore.Mvc;
using System.Text.Encodings.Web;
namespace MvcMovie.Controllers;
public class HelloWorldController : Controller
{
//
// GET: /HelloWorld/
public string Index()
{
return "This is my default action...";
}
//
// GET: /HelloWorld/Welcome/
public string Welcome()
{
return "This is the Welcome action method...";
}
}
Elke public
methode in een controller kan worden aangeroepen als een HTTP-eindpunt. In het bovenstaande voorbeeld retourneren beide methoden een tekenreeks. Noteer de opmerkingen voorafgaand aan elke methode.
Een HTTP-eindpunt:
- Een doelbare URL in de webtoepassing, zoals
https://localhost:5001/HelloWorld
. - Combineert:
- Het gebruikte protocol:
HTTPS
. - De netwerklocatie van de webserver, inclusief de TCP-poort:
localhost:5001
. - De doel-URI:
HelloWorld
.
- Het gebruikte protocol:
De eerste opmerking geeft aan dat dit een HTTP GET- methode is die wordt aangeroepen door /HelloWorld/
toe te voegen aan de basis-URL.
De tweede opmerking geeft een HTTP GET- methode op die wordt aangeroepen door /HelloWorld/Welcome/
toe te voegen aan de URL. Later in de zelfstudie wordt de scaffolding-engine gebruikt om HTTP POST
-methoden te genereren, waarmee gegevens worden bijgewerkt.
Voer de app uit zonder het foutopsporingsprogramma door op Ctrl+F5-te drukken.
Voeg /HelloWorld
toe aan het pad in de adresbalk. De methode Index
retourneert een tekenreeks.
MVC roept controllerklassen aan en de actiemethoden hierin, afhankelijk van de binnenkomende URL. De standaard-URL-routeringslogica die door MVC wordt gebruikt, gebruikt een indeling zoals deze om te bepalen welke code moet worden aangeroepen:
/[Controller]/[ActionName]/[Parameters]
De routering wordt ingesteld in het Program.cs
-bestand.
app.MapControllerRoute(
name: "default",
pattern: "{controller=Home}/{action=Index}/{id?}");
Wanneer u naar de app bladert en geen URL-segmenten opgeeft, wordt deze standaard ingesteld op de controller 'Home' en de methode 'Index' die is opgegeven in de sjabloonregel die hierboven is gemarkeerd. In de voorgaande URL-segmenten:
- Het eerste URL-segment bepaalt de controllerklasse die moet worden uitgevoerd. Daarom wordt
localhost:5001/HelloWorld
toegewezen aan de klasse HelloWorld Controller. - Het tweede deel van het URL-segment bepaalt de actiemethode voor de klasse.
localhost:5001/HelloWorld/Index
zorgt er dus voor dat deIndex
methode van deHelloWorldController
-klasse wordt uitgevoerd. U hoeft alleen naarlocalhost:5001/HelloWorld
te bladeren en deIndex
methode is standaard aangeroepen.Index
is de standaardmethode die op een controller wordt aangeroepen als er niet expliciet een methodenaam is opgegeven. - Het derde deel van het URL-segment (
id
) is voor routegegevens. Routegegevens worden verderop in de handleiding uitgelegd.
Blader naar: https://localhost:{PORT}/HelloWorld/Welcome
. Vervang {PORT}
door uw poortnummer.
De methode Welcome
wordt uitgevoerd en retourneert de tekenreeks This is the Welcome action method...
. Voor deze URL is de controller HelloWorld
en is Welcome
de actiemethode. U hebt het [Parameters]
deel van de URL nog niet gebruikt.
Wijzig de code om bepaalde parametergegevens van de URL door te geven aan de controller. Bijvoorbeeld /HelloWorld/Welcome?name=Rick&numtimes=4
.
Wijzig de methode Welcome
om twee parameters op te nemen, zoals wordt weergegeven in de volgende code.
// GET: /HelloWorld/Welcome/
// Requires using System.Text.Encodings.Web;
public string Welcome(string name, int numTimes = 1)
{
return HtmlEncoder.Default.Encode($"Hello {name}, NumTimes is: {numTimes}");
}
De voorgaande code:
- Gebruikt de functie optionele C#-parameter om aan te geven dat de
numTimes
parameter standaard 1 is als er geen waarde wordt doorgegeven voor die parameter. - Gebruikt
HtmlEncoder.Default.Encode
om de app te beschermen tegen schadelijke invoer, zoals via JavaScript. - Gebruikt geïnterpoleerde tekenreeksen in
$"Hello {name}, NumTimes is: {numTimes}"
.
Voer de app uit en blader naar: https://localhost:{PORT}/HelloWorld/Welcome?name=Rick&numtimes=4
. Vervang {PORT}
door uw poortnummer.
Probeer verschillende waarden voor name
en numtimes
in de URL. De MVC-modelbinding systeem wijst automatisch de benoemde parameters van de queryreeks toe aan parameters in de methode. Zie Modelbinding voor meer informatie.
In de vorige afbeelding:
- Het URL-segment
Parameters
wordt niet gebruikt. - De parameters
name
ennumTimes
worden doorgegeven in de queryreeks. - De
?
(vraagteken) in de bovenstaande URL is een scheidingsteken en de querystring volgt. - Het
&
teken scheidt veld-waardeparen.
Vervang de Welcome
methode door de volgende code:
public string Welcome(string name, int ID = 1)
{
return HtmlEncoder.Default.Encode($"Hello {name}, ID: {ID}");
}
Voer de app uit en voer de volgende URL in: https://localhost:{PORT}/HelloWorld/Welcome/3?name=Rick
In de voorgaande URL:
- Het derde URL-segment komt overeen met de routeparameter
id
. - De methode
Welcome
bevat een parameterid
die overeenkomt met de URL-sjabloon in de methodeMapControllerRoute
. - Met de afsluitende
?
wordt de queryreeksgestart.
app.MapControllerRoute(
name: "default",
pattern: "{controller=Home}/{action=Index}/{id?}");
In het voorgaande voorbeeld:
- Het derde URL-segment komt overeen met de routeparameter
id
. - De methode
Welcome
bevat een parameterid
die overeenkomt met de URL-sjabloon in de methodeMapControllerRoute
. - De afsluitende
?
(inid?
) geeft aan dat de parameterid
optioneel is.
Het Model-View-Controller (MVC) architectuurpatroon scheidt een app in drie hoofdonderdelen: M-odel, View, en Controller. Met het MVC-patroon kunt u apps maken die testbaar en gemakkelijker kunnen worden bijgewerkt dan traditionele monolithische apps.
Op MVC gebaseerde apps bevatten:
-
Models: klassen die de gegevens van de app vertegenwoordigen. De modelklassen gebruiken validatielogica om bedrijfsregels voor die gegevens af te dwingen. Modelobjecten halen de modelstatus meestal op en slaan deze op in een database. In deze zelfstudie haalt een
Movie
-model filmgegevens uit een database op, verstrekt deze aan de weergave of werkt ze bij. Bijgewerkte gegevens worden naar een database geschreven. - V: Weergaven zijn de onderdelen die de gebruikersinterface (UI) van de app weergeven. Over het algemeen worden in deze gebruikersinterface de modelgegevens weergegeven.
-
Controllers: klassen die:
- Browseraanvragen verwerken.
- Modelgegevens ophalen.
- Weergavesjablonen aanroepen die een antwoord retourneren.
In een MVC-app wordt in de weergave alleen informatie weergegeven. De controller verwerkt en reageert op gebruikersinvoer en -interactie. De controller verwerkt bijvoorbeeld URL-segmenten en queryreekswaarden en geeft deze waarden door aan het model. Het model kan deze waarden gebruiken om een query uit te voeren op de database. Bijvoorbeeld:
-
https://localhost:5001/Home/Privacy
: hiermee geeft u deHome
controller en de actiePrivacy
op. -
https://localhost:5001/Movies/Edit/5
: is een aanvraag om de film met ID=5 te bewerken met behulp van deMovies
controller en deEdit
-actie, die verderop in de zelfstudie worden beschreven.
Routegegevens worden later in de handleiding uitgelegd.
Het architectuurpatroon van MVC scheidt een app in drie hoofdgroepen onderdelen: Modellen, Weergaven en Controllers. Dit patroon helpt bij het bereiken van scheiding van problemen: de UI-logica hoort in de weergave. Invoerlogica hoort bij de controller. Bedrijfslogica hoort bij het model. Deze scheiding helpt bij het beheren van complexiteit bij het bouwen van een app, omdat hiermee tegelijkertijd wordt gewerkt aan één aspect van de implementatie zonder dat dit van invloed is op de code van een andere. U kunt bijvoorbeeld aan de weergavecode werken zonder dat u afhankelijk bent van de bedrijfslogicacode.
Deze concepten worden geïntroduceerd en gedemonstreerd in deze reeks zelfstudies tijdens het bouwen van een film-app. Het MVC-project bevat mappen voor de Controllers en Views.
Een controller toevoegen
Klik in Solution Explorermet de rechtermuisknop op Controllers >> Controller toevoegen.
Selecteer in het dialoogvenster Nieuw gestructureerd item toevoegen de optie Lege MVC-controller>Toevoegen.
Voer in het dialoogvenster Add New Item - MvcMovieHelloWorldController.cs
in en selecteer Add.
Vervang de inhoud van Controllers/HelloWorldController.cs
door de volgende code:
using Microsoft.AspNetCore.Mvc;
using System.Text.Encodings.Web;
namespace MvcMovie.Controllers;
public class HelloWorldController : Controller
{
//
// GET: /HelloWorld/
public string Index()
{
return "This is my default action...";
}
//
// GET: /HelloWorld/Welcome/
public string Welcome()
{
return "This is the Welcome action method...";
}
}
Elke public
methode in een controller kan worden aangeroepen als een HTTP-eindpunt. In het bovenstaande voorbeeld retourneren beide methoden een tekenreeks. Noteer de opmerkingen voorafgaand aan elke methode.
Een HTTP-eindpunt:
- Is een aanspreekbare URL in de webtoepassing, zoals
https://localhost:5001/HelloWorld
. - Combineert:
- Het gebruikte protocol:
HTTPS
. - De netwerklocatie van de webserver, inclusief de TCP-poort:
localhost:5001
. - De doel-URI:
HelloWorld
.
- Het gebruikte protocol:
De eerste opmerking geeft aan dat dit een HTTP GET- methode is die wordt aangeroepen door /HelloWorld/
toe te voegen aan de basis-URL.
De tweede opmerking geeft een HTTP GET- methode op die wordt aangeroepen door /HelloWorld/Welcome/
toe te voegen aan de URL. Verderop in de zelfstudie wordt de scaffolding-engine gebruikt om HTTP POST
methoden te genereren, waarmee gegevens worden bijgewerkt.
Voer de app uit zonder het foutopsporingsprogramma door op Ctrl+F5-te drukken.
Voeg /HelloWorld
toe aan het pad in de adresbalk. De methode Index
retourneert een tekenreeks.
MVC roept controllerklassen aan en de actiemethoden hierin, afhankelijk van de binnenkomende URL. De standaard-URL-routeringslogica die door MVC wordt gebruikt, gebruikt een indeling zoals deze om te bepalen welke code moet worden aangeroepen:
/[Controller]/[ActionName]/[Parameters]
De routeringsformaat wordt ingesteld in het Program.cs
-bestand.
app.MapControllerRoute(
name: "default",
pattern: "{controller=Home}/{action=Index}/{id?}");
Wanneer u naar de app bladert en geen URL-segmenten opgeeft, wordt deze standaard ingesteld op de controller 'Home' en de methode 'Index' die is opgegeven in de sjabloonregel die hierboven is gemarkeerd. In de voorgaande URL-segmenten:
- Het eerste URL-segment bepaalt de controllerklasse die moet worden uitgevoerd. Daarom wordt
localhost:5001/HelloWorld
toegewezen aan de klasse HelloWorld Controller. - Het tweede deel van het URL-segment bepaalt de actiemethode voor de klasse.
localhost:5001/HelloWorld/Index
zorgt er dus voor dat deIndex
methode van deHelloWorldController
-klasse wordt uitgevoerd. U hoeft alleen naarlocalhost:5001/HelloWorld
te bladeren en deIndex
methode is standaard aangeroepen.Index
is de standaardmethode die op een controller wordt aangeroepen als er niet expliciet een methodenaam is opgegeven. - Het derde deel van het URL-segment (
id
) is voor routegegevens. Routegegevens worden verderop in de handleiding uitgelegd.
Blader naar: https://localhost:{PORT}/HelloWorld/Welcome
. Vervang {PORT}
door uw poortnummer.
De methode Welcome
wordt uitgevoerd en retourneert de tekenreeks This is the Welcome action method...
. Voor deze URL is de controller HelloWorld
en is Welcome
de actiemethode. U hebt het [Parameters]
deel van de URL nog niet gebruikt.
Wijzig de code om bepaalde parametergegevens van de URL door te geven aan de controller. Bijvoorbeeld /HelloWorld/Welcome?name=Rick&numtimes=4
.
Wijzig de methode Welcome
om twee parameters op te nemen, zoals wordt weergegeven in de volgende code.
// GET: /HelloWorld/Welcome/
// Requires using System.Text.Encodings.Web;
public string Welcome(string name, int numTimes = 1)
{
return HtmlEncoder.Default.Encode($"Hello {name}, NumTimes is: {numTimes}");
}
De voorgaande code:
- Gebruikt de functie optionele C#-parameter om aan te geven dat de
numTimes
parameter standaard 1 is als er geen waarde wordt doorgegeven voor die parameter. - Gebruikt
HtmlEncoder.Default.Encode
om de app te beschermen tegen schadelijke invoer, zoals via JavaScript. - Gebruikt geïnterpoleerde tekenreeksen in
$"Hello {name}, NumTimes is: {numTimes}"
.
Voer de app uit en blader naar: https://localhost:{PORT}/HelloWorld/Welcome?name=Rick&numtimes=4
. Vervang {PORT}
door uw poortnummer.
Probeer verschillende waarden voor name
en numtimes
in de URL. De MVC-modelbinding systeem wijst automatisch de benoemde parameters van de queryreeks toe aan parameters in de methode. Zie Modelbinding voor meer informatie.
In de vorige afbeelding:
- Het URL-segment
Parameters
wordt niet gebruikt. - De parameters
name
ennumTimes
worden doorgegeven in de queryreeks. - De
?
(vraagteken) in de bovenstaande URL is een scheidingsteken en de queryreeks komt daarna. - Het
&
teken scheidt veld-waardeparen.
Vervang de Welcome
methode door de volgende code:
public string Welcome(string name, int ID = 1)
{
return HtmlEncoder.Default.Encode($"Hello {name}, ID: {ID}");
}
Voer de app uit en voer de volgende URL in: https://localhost:{PORT}/HelloWorld/Welcome/3?name=Rick
In de voorgaande URL:
- Het derde URL-segment komt overeen met de routeparameter
id
. - De methode
Welcome
bevat een parameterid
die overeenkomt met de URL-sjabloon in de methodeMapControllerRoute
. - Met de afsluitende
?
wordt de queryreeksgestart.
app.MapControllerRoute(
name: "default",
pattern: "{controller=Home}/{action=Index}/{id?}");
In het voorgaande voorbeeld:
- Het derde URL-segment komt overeen met de routeparameter
id
. - De methode
Welcome
bevat een parameterid
die overeenkomt met de URL-sjabloon in de methodeMapControllerRoute
. - De afsluitende
?
(inid?
) geeft aan dat de parameterid
optioneel is.
Het architectuurpatroon Model-View-Controller (MVC) verdeelt een app in drie hoofdonderdelen: Model, View en Controller. Met het MVC-patroon kunt u apps maken die testbaar en gemakkelijker kunnen worden bijgewerkt dan traditionele monolithische apps.
Op MVC gebaseerde apps bevatten:
-
Models: klassen die de gegevens van de app vertegenwoordigen. De modelklassen gebruiken validatielogica om bedrijfsregels voor die gegevens af te dwingen. Modelobjecten halen de modelstatus meestal op en slaan deze op in een database. In deze zelfstudie haalt een
Movie
model filmgegevens op uit een database, biedt ze aan de weergave aan of werkt ze bij. Bijgewerkte gegevens worden naar een database geschreven. - V: Weergaven zijn de onderdelen die de gebruikersinterface (UI) van de app weergeven. Over het algemeen worden in deze gebruikersinterface de modelgegevens weergegeven.
-
Controllers: Klassen die:
- Browseraanvragen verwerken.
- Modelgegevens ophalen.
- Weergavesjablonen aanroepen die een antwoord retourneren.
In een MVC-app wordt in de weergave alleen informatie weergegeven. De controller verwerkt en reageert op gebruikersinvoer en -interactie. De controller verwerkt bijvoorbeeld URL-segmenten en queryreekswaarden en geeft deze waarden door aan het model. Het model kan deze waarden gebruiken om een query uit te voeren op de database. Bijvoorbeeld:
-
https://localhost:5001/Home/Privacy
: hiermee geeft u deHome
controller en de actiePrivacy
op. -
https://localhost:5001/Movies/Edit/5
: is een aanvraag om de film met ID=5 te bewerken met behulp van deMovies
controller en deEdit
-actie, die verderop in de zelfstudie worden beschreven.
Routegegevens worden verderop in de zelfstudie uitgelegd.
Het architectuurpatroon van MVC scheidt een app in drie hoofdgroepen onderdelen: Modellen, Weergaven en Controllers. Dit patroon helpt bij het bereiken van scheiding van problemen: de UI-logica hoort in de weergave. Invoerlogica hoort bij de controller. Bedrijfslogica hoort bij het model. Deze scheiding helpt bij het beheren van complexiteit bij het bouwen van een app, omdat hiermee tegelijkertijd wordt gewerkt aan één aspect van de implementatie zonder dat dit van invloed is op de code van een andere. U kunt bijvoorbeeld aan de weergavecode werken zonder dat u afhankelijk bent van de bedrijfslogicacode.
Deze concepten worden geïntroduceerd en gedemonstreerd in deze reeks zelfstudies tijdens het bouwen van een film-app. Het MVC-project bevat mappen voor de Controllers en weergaven.
Een controller toevoegen
Klik in Solution Explorermet de rechtermuisknop op Controllers >> Controller toevoegen.
Selecteer in het dialoogvenster Nieuw Scaffolded Item Toevoegen de optie MVC-controller - Leeg>Toevoegen.
Voer in het dialoogvenster Add New Item - MvcMovieHelloWorldController.cs
in en selecteer Add.
Vervang de inhoud van Controllers/HelloWorldController.cs
door de volgende code:
using Microsoft.AspNetCore.Mvc;
using System.Text.Encodings.Web;
namespace MvcMovie.Controllers
{
public class HelloWorldController : Controller
{
//
// GET: /HelloWorld/
public string Index()
{
return "This is my default action...";
}
//
// GET: /HelloWorld/Welcome/
public string Welcome()
{
return "This is the Welcome action method...";
}
}
}
Elke public
methode in een controller kan worden aangeroepen als een HTTP-eindpunt. In het bovenstaande voorbeeld retourneren beide methoden een tekenreeks. Noteer de opmerkingen voorafgaand aan elke methode.
Een HTTP-eindpunt:
- Het is een doelbare URL in de webtoepassing, zoals
https://localhost:5001/HelloWorld
. - Combineert:
- Het gebruikte protocol:
HTTPS
. - De netwerklocatie van de webserver, inclusief de TCP-poort:
localhost:5001
. - De doel-URI:
HelloWorld
.
- Het gebruikte protocol:
De eerste opmerking geeft aan dat dit een HTTP GET- methode is die wordt aangeroepen door /HelloWorld/
toe te voegen aan de basis-URL.
De tweede opmerking geeft een HTTP GET- methode op die wordt aangeroepen door /HelloWorld/Welcome/
toe te voegen aan de URL. Later in de zelfstudie wordt de scaffolding-engine gebruikt om HTTP POST
-methoden te genereren, die gegevens bijwerken.
Voer de app uit zonder het foutopsporingsprogramma.
Voeg 'HelloWorld' toe aan het pad in de adresbalk. De methode Index
retourneert een tekenreeks.
MVC roept controllerklassen aan en de actiemethoden hierin, afhankelijk van de binnenkomende URL. De standaard-URL-routeringslogica die door MVC wordt gebruikt, gebruikt een indeling zoals deze om te bepalen welke code moet worden aangeroepen:
/[Controller]/[ActionName]/[Parameters]
Het routeringsformaat wordt ingesteld in het Program.cs
-bestand.
app.MapControllerRoute(
name: "default",
pattern: "{controller=Home}/{action=Index}/{id?}");
Wanneer u naar de app bladert en geen URL-segmenten opgeeft, wordt deze standaard ingesteld op de controller 'Home' en de methode 'Index' die is opgegeven in de sjabloonregel die hierboven is gemarkeerd. In de voorgaande URL-segmenten:
- Het eerste URL-segment bepaalt de controllerklasse die moet worden uitgevoerd. Daarom wordt
localhost:5001/HelloWorld
toegewezen aan de klasse HelloWorld Controller. - Het tweede deel van het URL-segment bepaalt de actiemethode voor de klasse.
localhost:5001/HelloWorld/Index
zorgt er dus voor dat deIndex
methode van deHelloWorldController
-klasse wordt uitgevoerd. U hoeft alleen naarlocalhost:5001/HelloWorld
te bladeren en deIndex
methode is standaard aangeroepen.Index
is de standaardmethode die op een controller wordt aangeroepen als er niet expliciet een methodenaam is opgegeven. - Het derde deel van het URL-segment (
id
) is voor routegegevens. Routegegevens worden verderop in de handleiding uitgelegd.
Blader naar: https://localhost:{PORT}/HelloWorld/Welcome
. Vervang {PORT}
door uw poortnummer.
De methode Welcome
wordt uitgevoerd en retourneert de tekenreeks This is the Welcome action method...
. Voor deze URL is de controller HelloWorld
en is Welcome
de actiemethode. U hebt het [Parameters]
deel van de URL nog niet gebruikt.
Wijzig de code om bepaalde parametergegevens van de URL door te geven aan de controller. Bijvoorbeeld /HelloWorld/Welcome?name=Rick&numtimes=4
.
Wijzig de methode Welcome
om twee parameters op te nemen, zoals wordt weergegeven in de volgende code.
// GET: /HelloWorld/Welcome/
// Requires using System.Text.Encodings.Web;
public string Welcome(string name, int numTimes = 1)
{
return HtmlEncoder.Default.Encode($"Hello {name}, NumTimes is: {numTimes}");
}
De voorgaande code:
- Gebruikt de functie optionele C#-parameter om aan te geven dat de
numTimes
parameter standaard 1 is als er geen waarde wordt doorgegeven voor die parameter. - Gebruikt
HtmlEncoder.Default.Encode
om de app te beschermen tegen schadelijke invoer, zoals via JavaScript. - Gebruikt geïnterpoleerde tekenreeksen in
$"Hello {name}, NumTimes is: {numTimes}"
.
Voer de app uit en blader naar: https://localhost:{PORT}/HelloWorld/Welcome?name=Rick&numtimes=4
. Vervang {PORT}
door uw poortnummer.
Probeer verschillende waarden voor name
en numtimes
in de URL. De MVC-modelbinding systeem wijst automatisch de benoemde parameters van de queryreeks toe aan parameters in de methode. Zie Modelbinding voor meer informatie.
In de vorige afbeelding:
- Het URL-segment
Parameters
wordt niet gebruikt. - De parameters
name
ennumTimes
worden doorgegeven in de queryreeks. - De
?
(vraagteken) in de bovenstaande URL is een scheidingsteken en de queryreeks volgt. - Het
&
teken scheidt veld-waardeparen.
Vervang de Welcome
methode door de volgende code:
public string Welcome(string name, int ID = 1)
{
return HtmlEncoder.Default.Encode($"Hello {name}, ID: {ID}");
}
Voer de app uit en voer de volgende URL in: https://localhost:{PORT}/HelloWorld/Welcome/3?name=Rick
In de voorgaande URL:
- Het derde URL-segment komt overeen met de routeparameter
id
. - De methode
Welcome
bevat een parameterid
die overeenkomt met de URL-sjabloon in de methodeMapControllerRoute
. - Met de afsluitende
?
wordt de queryreeksgestart.
app.MapControllerRoute(
name: "default",
pattern: "{controller=Home}/{action=Index}/{id?}");
In het voorgaande voorbeeld:
- Het derde URL-segment komt overeen met de routeparameter
id
. - De methode
Welcome
bevat een parameterid
die overeenkomt met de URL-sjabloon in de methodeMapControllerRoute
. - De afsluitende
?
(inid?
) geeft aan dat de parameterid
optioneel is.
Het Model-View-Controller (MVC) architectuurpatroon verdeelt een app in drie hoofdcomponenten: Model, View, en Controller. Met het MVC-patroon kunt u apps maken die testbaar en gemakkelijker kunnen worden bijgewerkt dan traditionele monolithische apps.
Op MVC gebaseerde apps bevatten:
-
Models: klassen die de gegevens van de app vertegenwoordigen. De modelklassen gebruiken validatielogica om bedrijfsregels voor die gegevens af te dwingen. Modelobjecten halen de modelstatus meestal op en slaan deze op in een database. In deze zelfstudie haalt een
Movie
-model filmgegevens op uit een database en verstrekt deze aan de view of werkt deze bij. Bijgewerkte gegevens worden naar een database geschreven. - V: Weergaven zijn de onderdelen die de gebruikersinterface (UI) van de app weergeven. Over het algemeen worden in deze gebruikersinterface de modelgegevens weergegeven.
-
Controllers: klassen die:
- Browseraanvragen verwerken.
- Modelgegevens ophalen.
- Weergavesjablonen aanroepen die een antwoord retourneren.
In een MVC-app wordt in de weergave alleen informatie weergegeven. De controller verwerkt en reageert op gebruikersinvoer en -interactie. De controller verwerkt bijvoorbeeld URL-segmenten en queryreekswaarden en geeft deze waarden door aan het model. Het model kan deze waarden gebruiken om een query uit te voeren op de database. Bijvoorbeeld:
-
https://localhost:5001/Home/Privacy
: hiermee geeft u deHome
controller en de actiePrivacy
op. -
https://localhost:5001/Movies/Edit/5
: is een aanvraag om de film met ID=5 te bewerken met behulp van deMovies
controller en deEdit
-actie, die verderop in de zelfstudie worden beschreven.
Routegegevens worden later in de handleiding uitgelegd.
Het architectuurpatroon van MVC scheidt een app in drie hoofdgroepen onderdelen: Modellen, Weergaven en Controllers. Dit patroon helpt bij het bereiken van scheiding van problemen: de UI-logica hoort in de weergave. Invoerlogica hoort bij de controller. Bedrijfslogica hoort bij het model. Deze scheiding helpt bij het beheren van complexiteit bij het bouwen van een app, omdat hiermee tegelijkertijd wordt gewerkt aan één aspect van de implementatie zonder dat dit van invloed is op de code van een andere. U kunt bijvoorbeeld aan de weergavecode werken zonder dat u afhankelijk bent van de bedrijfslogicacode.
Deze concepten worden geïntroduceerd en gedemonstreerd in deze reeks zelfstudies tijdens het bouwen van een film-app. Het MVC-project bevat mappen voor de Controllers en weergaven.
Een controller toevoegen
Klik in Solution Explorermet de rechtermuisknop op Controllers >> Controller toevoegen.
Selecteer in het dialoogvenster Scaffold toevoegen de optie MVC-controller - Leeg.
Voer in het dialoogvenster Nieuw item toevoegen - MvcMovieHelloWorldController.cs
in en selecteer Toevoegen.
Vervang de inhoud van Controllers/HelloWorldController.cs
door het volgende:
using Microsoft.AspNetCore.Mvc;
using System.Text.Encodings.Web;
namespace MvcMovie.Controllers
{
public class HelloWorldController : Controller
{
//
// GET: /HelloWorld/
public string Index()
{
return "This is my default action...";
}
//
// GET: /HelloWorld/Welcome/
public string Welcome()
{
return "This is the Welcome action method...";
}
}
}
Elke public
methode in een controller kan worden aangeroepen als een HTTP-eindpunt. In het bovenstaande voorbeeld retourneren beide methoden een tekenreeks. Noteer de opmerkingen voorafgaand aan elke methode.
Een HTTP-eindpunt:
- Een doelgerichte URL in de webtoepassing, zoals
https://localhost:5001/HelloWorld
. - Combineert:
- Het gebruikte protocol:
HTTPS
. - De netwerklocatie van de webserver, inclusief de TCP-poort:
localhost:5001
. - De doel-URI:
HelloWorld
.
- Het gebruikte protocol:
De eerste opmerking geeft aan dat dit een HTTP GET- methode is die wordt aangeroepen door /HelloWorld/
toe te voegen aan de basis-URL.
De tweede opmerking geeft een HTTP GET- methode op die wordt aangeroepen door /HelloWorld/Welcome/
toe te voegen aan de URL. Later in de tutorial wordt de scaffolding-engine gebruikt om HTTP POST
methoden te genereren, waarmee gegevens worden bijgewerkt.
Voer de app uit zonder het foutopsporingsprogramma.
Voeg 'HelloWorld' toe aan het pad in de adresbalk. De methode Index
retourneert een tekenreeks.
MVC roept controllerklassen aan en de actiemethoden hierin, afhankelijk van de binnenkomende URL. De standaard-URL-routeringslogica die door MVC wordt gebruikt, gebruikt een indeling zoals deze om te bepalen welke code moet worden aangeroepen:
/[Controller]/[ActionName]/[Parameters]
De routeringsindeling wordt ingesteld in de methode Configure
in het bestand Startup.cs
.
app.UseEndpoints(endpoints =>
{
endpoints.MapControllerRoute(
name: "default",
pattern: "{controller=Home}/{action=Index}/{id?}");
});
Wanneer u naar de app bladert en geen URL-segmenten opgeeft, wordt deze standaard ingesteld op de controller 'Home' en de methode 'Index' die is opgegeven in de sjabloonregel die hierboven is gemarkeerd. In de voorgaande URL-segmenten:
- Het eerste URL-segment bepaalt de controllerklasse die moet worden uitgevoerd. Dus
localhost:5001/HelloWorld
komt overeen met de Controller-klasse HelloWorld. - Het tweede deel van het URL-segment bepaalt de actiemethode voor de klasse.
localhost:5001/HelloWorld/Index
zorgt er dus voor dat deIndex
methode van deHelloWorldController
-klasse wordt uitgevoerd. U hoeft alleen naarlocalhost:5001/HelloWorld
te bladeren en deIndex
methode is standaard aangeroepen.Index
is de standaardmethode die op een controller wordt aangeroepen als er niet expliciet een methodenaam is opgegeven. - Het derde deel van het URL-segment (
id
) is voor routegegevens. Routegegevens worden verderop in de zelfstudie uitgelegd.
Blader naar: https://localhost:{PORT}/HelloWorld/Welcome
. Vervang {PORT}
door uw poortnummer.
De methode Welcome
wordt uitgevoerd en retourneert de tekenreeks This is the Welcome action method...
. Voor deze URL is de controller HelloWorld
en is Welcome
de actiemethode. U hebt het [Parameters]
deel van de URL nog niet gebruikt.
Wijzig de code om bepaalde parametergegevens van de URL door te geven aan de controller. Bijvoorbeeld /HelloWorld/Welcome?name=Rick&numtimes=4
.
Wijzig de methode Welcome
om twee parameters op te nemen, zoals wordt weergegeven in de volgende code.
// GET: /HelloWorld/Welcome/
// Requires using System.Text.Encodings.Web;
public string Welcome(string name, int numTimes = 1)
{
return HtmlEncoder.Default.Encode($"Hello {name}, NumTimes is: {numTimes}");
}
De voorgaande code:
- Gebruikt de functie optionele C#-parameter om aan te geven dat de
numTimes
parameter standaard 1 is als er geen waarde wordt doorgegeven voor die parameter. - Gebruikt
HtmlEncoder.Default.Encode
om de app te beschermen tegen schadelijke invoer, zoals via JavaScript. - Gebruikt geïnterpoleerde tekenreeksen in
$"Hello {name}, NumTimes is: {numTimes}"
.
Voer de app uit en blader naar: https://localhost:{PORT}/HelloWorld/Welcome?name=Rick&numtimes=4
. Vervang {PORT}
door uw poortnummer.
Probeer verschillende waarden voor name
en numtimes
in de URL. De MVC-modelbinding systeem wijst automatisch de benoemde parameters van de queryreeks toe aan parameters in de methode. Zie Modelbinding voor meer informatie.
In de vorige afbeelding:
- Het URL-segment
Parameters
wordt niet gebruikt. - De parameters
name
ennumTimes
worden doorgegeven in de queryreeks. - De
?
(vraagteken) in de bovengenoemde URL is een scheidingsteken en de queryreeks volgt. - Het
&
teken scheidt veld-waardeparen.
Vervang de Welcome
methode door de volgende code:
public string Welcome(string name, int ID = 1)
{
return HtmlEncoder.Default.Encode($"Hello {name}, ID: {ID}");
}
Voer de app uit en voer de volgende URL in: https://localhost:{PORT}/HelloWorld/Welcome/3?name=Rick
In de voorgaande URL:
- Het derde URL-segment komt overeen met de routeparameter
id
. - De methode
Welcome
bevat een parameterid
die overeenkomt met de URL-sjabloon in de methodeMapControllerRoute
. - Met de afsluitende
?
wordt de queryreeksgestart.
app.UseEndpoints(endpoints =>
{
endpoints.MapControllerRoute(
name: "default",
pattern: "{controller=Home}/{action=Index}/{id?}");
});
In het voorgaande voorbeeld:
- Het derde URL-segment komt overeen met de routeparameter
id
. - De methode
Welcome
bevat een parameterid
die overeenkomt met de URL-sjabloon in de methodeMapControllerRoute
. - De afsluitende
?
(inid?
) geeft aan dat de parameterid
optioneel is.