Delen via


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 de Home controller en de actie Privacy op.
  • https://localhost:5001/Movies/Edit/5: is een aanvraag om de film met ID=5 te bewerken met behulp van de Movies controller en de Edit-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.

Solution Explorer klikt u met de rechtermuisknop op Controllers >> Controller toevoegen

Selecteer in het dialoogvenster Nieuw gestructureerd item toevoegen de optie Lege MVC-controller>en klik op Toevoegen.

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 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.

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.

browservenster met een app-antwoord van Dit is mijn standaardactie

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 de Index methode van de HelloWorldController-klasse wordt uitgevoerd. U hoeft alleen naar localhost:5001/HelloWorld te bladeren en de Index 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.

browservenster dat het toepassingsantwoord 'Dit is de welkomstactiemethode' weergeeft

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.

Browservenster dat een toepassingsantwoord toont van: Hallo Rick, NumTimes is: 4

In de vorige afbeelding:

  • Het URL-segment Parameters wordt niet gebruikt.
  • De parameters name en numTimes 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 parameter id die overeenkomt met de URL-sjabloon in de methode MapControllerRoute.
  • 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 parameter id die overeenkomt met de URL-sjabloon in de methode MapControllerRoute.
  • De afsluitende ? (in id?) geeft aan dat de parameter id 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 de Home controller en de actie Privacy op.
  • https://localhost:5001/Movies/Edit/5: is een aanvraag om de film met ID=5 te bewerken met behulp van de Movies controller en de Edit-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.

Solution Explorer met de rechtermuisknop klikken op Controllers > Controller toevoegen >

Selecteer in het dialoogvenster Nieuw gescaffold item toevoegenLege MVC-controller>Toevoegen.

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.

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.

browservenster met een app-antwoord van Dit is mijn standaardactie

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 de Index methode van de HelloWorldController-klasse wordt uitgevoerd. U hoeft alleen naar localhost:5001/HelloWorld te bladeren en de Index 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.

browservenster met een toepassingsantwoord van Dit is de welkomstactiemethode

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.

Browservenster met een toepassingsantwoord van Hallo Rick, NumTimes is: 4

In de vorige afbeelding:

  • Het URL-segment Parameters wordt niet gebruikt.
  • De parameters name en numTimes 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 parameter id die overeenkomt met de URL-sjabloon in de methode MapControllerRoute.
  • 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 parameter id die overeenkomt met de URL-sjabloon in de methode MapControllerRoute.
  • De afsluitende ? (in id?) geeft aan dat de parameter id 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 de Home controller en de actie Privacy op.
  • https://localhost:5001/Movies/Edit/5: is een aanvraag om de film met ID=5 te bewerken met behulp van de Movies controller en de Edit-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.

Solution Explorer klikt u met de rechtermuisknop op Controllers >> Controller toevoegen

Selecteer in het dialoogvenster Nieuw gestructureerd item toevoegen de optie Lege MVC-controller>Toevoegen.

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.

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.

browservenster met een app-antwoord van Dit is mijn standaardactie

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 de Index methode van de HelloWorldController-klasse wordt uitgevoerd. U hoeft alleen naar localhost:5001/HelloWorld te bladeren en de Index 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.

browservenster met een toepassingsantwoord van Dit is de welkomstactiemethode

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.

browservenster dat het toepassingsantwoord weergeeft: Hallo Rick, NumTimes is: 4

In de vorige afbeelding:

  • Het URL-segment Parameters wordt niet gebruikt.
  • De parameters name en numTimes 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 parameter id die overeenkomt met de URL-sjabloon in de methode MapControllerRoute.
  • 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 parameter id die overeenkomt met de URL-sjabloon in de methode MapControllerRoute.
  • De afsluitende ? (in id?) geeft aan dat de parameter id 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 de Home controller en de actie Privacy op.
  • https://localhost:5001/Movies/Edit/5: is een aanvraag om de film met ID=5 te bewerken met behulp van de Movies controller en de Edit-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.

Solution Explorer klikt u met de rechtermuisknop op Controllers >> Controller toevoegen

Selecteer in het dialoogvenster Nieuw Scaffolded Item Toevoegen de optie MVC-controller - Leeg>Toevoegen.

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:

  • 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.

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.

browservenster met een app-antwoord van Dit is mijn standaardactie

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 de Index methode van de HelloWorldController-klasse wordt uitgevoerd. U hoeft alleen naar localhost:5001/HelloWorld te bladeren en de Index 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.

Browservenster met een toepassingsreactie: Dit is de welkomstactiemethode

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.

Browservenster met een toepassingsantwoord met Hallo Rick, NumTimes is: 4

In de vorige afbeelding:

  • Het URL-segment Parameters wordt niet gebruikt.
  • De parameters name en numTimes 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 parameter id die overeenkomt met de URL-sjabloon in de methode MapControllerRoute.
  • 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 parameter id die overeenkomt met de URL-sjabloon in de methode MapControllerRoute.
  • De afsluitende ? (in id?) geeft aan dat de parameter id 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 de Home controller en de actie Privacy op.
  • https://localhost:5001/Movies/Edit/5: is een aanvraag om de film met ID=5 te bewerken met behulp van de Movies controller en de Edit-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.

Solution Explorer klikt u met de rechtermuisknop op Controllers >> Controller toevoegen

Selecteer in het dialoogvenster Scaffold toevoegen de optie MVC-controller - Leeg.

MVC-controller toevoegen en deze een naam geven

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.

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.

browservenster met een app-antwoord van Dit is mijn standaardactie

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 de Index methode van de HelloWorldController-klasse wordt uitgevoerd. U hoeft alleen naar localhost:5001/HelloWorld te bladeren en de Index 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.

browservenster met een toepassingsantwoord van Dit is de welkomstactiemethode

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.

Browservenster dat een toepassingsantwoord toont van Hallo Rick, NumTimes is: 4

In de vorige afbeelding:

  • Het URL-segment Parameters wordt niet gebruikt.
  • De parameters name en numTimes 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 parameter id die overeenkomt met de URL-sjabloon in de methode MapControllerRoute.
  • 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 parameter id die overeenkomt met de URL-sjabloon in de methode MapControllerRoute.
  • De afsluitende ? (in id?) geeft aan dat de parameter id optioneel is.