Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
Door Steve Smith
ASP.NET Core MVC is een uitgebreid framework voor het bouwen van web-apps en API's met behulp van het ontwerppatroon Model-View-Controller.
MVC-patroon
Het architectuurpatroon Model-View-Controller (MVC) scheidt een toepassing in drie hoofdgroepen onderdelen: Modellen, Weergaven en Controllers. Dit patroon helpt bij het bereiken van scheiding van verantwoordelijkheden. Met dit patroon worden gebruikersaanvragen doorgestuurd naar een controller die verantwoordelijk is voor het werken met het model om gebruikersacties uit te voeren en/of resultaten van query's op te halen. De controller kiest de weergave die aan de gebruiker moet worden weergegeven en biedt deze alle modelgegevens die nodig zijn.
In het volgende diagram ziet u de drie hoofdonderdelen en welke naar de andere onderdelen verwijzen:
Deze afbakening van verantwoordelijkheden helpt u bij het schalen van de toepassing in termen van complexiteit, omdat het eenvoudiger is om iets te codeeren, fouten op te sporen en te testen (model, weergave of controller) met één taak. Het is moeilijker om code bij te werken, te testen en fouten op te sporen die afhankelijkheden heeft verspreid over twee of meer van deze drie gebieden. Gebruikersinterfacelogica verandert bijvoorbeeld vaker dan bedrijfslogica. Als presentatiecode en bedrijfslogica worden gecombineerd in één object, moet een object met bedrijfslogica worden gewijzigd telkens wanneer de gebruikersinterface wordt gewijzigd. Dit introduceert vaak fouten en vereist het opnieuw testen van bedrijfslogica na elke minimale wijziging van de gebruikersinterface.
Opmerking
Zowel de weergave als de controller zijn afhankelijk van het model. Het model is echter afhankelijk van noch de weergave, noch de controller. Dit is een van de belangrijkste voordelen van de scheiding. Met deze scheiding kan het model onafhankelijk van de visuele presentatie worden gebouwd en getest.
Modelverantwoordelijkheden
Het model in een MVC-toepassing vertegenwoordigt de status van de toepassing en eventuele bedrijfslogica of bewerkingen die door de toepassing moeten worden uitgevoerd. Bedrijfslogica moet worden ingekapseld in het model, samen met elke implementatielogica voor het behouden van de status van de toepassing. Sterk getypte weergaven maken doorgaans gebruik van ViewModel-typen die zijn ontworpen om de gegevens te bevatten die in die weergave moeten worden weergegeven. De controller maakt en vult deze ViewModel-exemplaren van het model.
Verantwoordelijkheden weergeven
Weergaven zijn verantwoordelijk voor het presenteren van inhoud via de gebruikersinterface. Ze gebruiken de Razor weergave-engine om .NET-code in te sluiten in HTML-markeringen. Er moet minimale logica in weergaven zijn en alle logica in deze weergaven moet betrekking hebben op het presenteren van inhoud. Als u merkt dat u veel logica moet uitvoeren in weergavebestanden om gegevens uit een complex model weer te geven, kunt u overwegen een weergaveonderdeel, ViewModel of een weergavesjabloon te gebruiken om de weergave te vereenvoudigen.
Verantwoordelijkheden controller
Controllers zijn de onderdelen die interactie van gebruikers verwerken, werken met het model en uiteindelijk een weergave selecteren die moet worden weergegeven. In een MVC-toepassing geeft de weergave alleen informatie weer; de controller verwerkt en reageert op gebruikersinvoer en -interactie. In het MVC-patroon is de controller het eerste invoerpunt en is verantwoordelijk voor het selecteren van de modeltypen waarmee moet worden gewerkt en met welke weergave moet worden weergegeven (vandaar de naam. Hiermee bepaalt u hoe de app op een bepaalde aanvraag reageert).
Opmerking
Controllers mogen niet te ingewikkeld zijn door te veel verantwoordelijkheden. Als u wilt voorkomen dat controllerlogica te complex wordt, pusht u bedrijfslogica uit de controller en naar het domeinmodel.
Aanbeveling
Als u merkt dat uw controlleracties vaak dezelfde soorten acties uitvoeren, verplaatst u deze algemene acties naar filters.
ASP.NET Core MVC
Het ASP.NET Core MVC-framework is een lichtgewicht open source, zeer testbaar presentatieframework dat is geoptimaliseerd voor gebruik met ASP.NET Core.
ASP.NET Core MVC biedt een op patronen gebaseerde manier om dynamische websites te bouwen die een schone scheiding van zorgen mogelijk maken. Het biedt u volledige controle over markeringen, ondersteunt TDD-vriendelijke ontwikkeling en maakt gebruik van de nieuwste webstandaarden.
Routebepaling
ASP.NET Core MVC is gebouwd op basis van de routering van ASP.NET Core, een krachtig URL-toewijzingsonderdeel waarmee u toepassingen kunt bouwen die begrijpelijke en doorzoekbare URL's hebben. Hiermee kunt u de URL-naamgevingspatronen van uw toepassing definiëren die goed werken voor zoekmachineoptimalisatie (SEO) en voor het genereren van koppelingen, zonder rekening te houden met de manier waarop de bestanden op uw webserver zijn georganiseerd. U kunt uw routes definiëren met behulp van een handige syntaxis van een routesjabloon die ondersteuning biedt voor beperkingen van routewaarden, standaardwaarden en optionele waarden.
Met routering op basis van conventies kunt u globaal de URL-indelingen definiëren die uw toepassing accepteert en hoe elk van deze indelingen wordt toegewezen aan een specifieke actiemethode op een bepaalde controller. Wanneer een binnenkomende aanvraag wordt ontvangen, parseert de routeringsengine de URL en komt deze overeen met een van de gedefinieerde URL-indelingen en roept de bijbehorende controlleractiemethode aan.
routes.MapRoute(name: "Default", template: "{controller=Home}/{action=Index}/{id?}");
Met kenmerkroutering kunt u routeringsgegevens opgeven door uw controllers en acties te decoreren met kenmerken die de routes van uw toepassing definiëren. Dit betekent dat uw routedefinities worden geplaatst naast de controller en actie waaraan ze zijn gekoppeld.
[Route("api/[controller]")]
public class ProductsController : Controller
{
[HttpGet("{id}")]
public IActionResult GetProduct(int id)
{
...
}
}
Modelbinding
ASP.NET Core MVC-modelbinding converteert clientaanvraaggegevens (formulierwaarden, routegegevens, queryreeksparameters, HTTP-headers) naar objecten die de controller kan verwerken. Als gevolg hiervan hoeft uw controllerlogica niet het werk te doen om de binnenkomende aanvraaggegevens uit te zoeken; het heeft de gegevens gewoon als parameters voor de bijbehorende actiemethoden.
public async Task<IActionResult> Login(LoginViewModel model, string returnUrl = null) { ... }
Modelvalidatie
ASP.NET Core MVC ondersteunt validatie door het modelobject te decoreren met validatiekenmerken voor gegevensaantekening. De validatiekenmerken worden aan de clientzijde gecontroleerd voordat waarden op de server worden geplaatst, evenals op de server voordat de controlleractie wordt aangeroepen.
using System.ComponentModel.DataAnnotations;
public class LoginViewModel
{
[Required]
[EmailAddress]
public string Email { get; set; }
[Required]
[DataType(DataType.Password)]
public string Password { get; set; }
[Display(Name = "Remember me?")]
public bool RememberMe { get; set; }
}
Een controlleractie:
public async Task<IActionResult> Login(LoginViewModel model, string returnUrl = null)
{
if (ModelState.IsValid)
{
// work with the model
}
// At this point, something failed, redisplay form
return View(model);
}
Het framework verwerkt het valideren van aanvraaggegevens zowel op de client als op de server. Validatielogica die is opgegeven voor modeltypen, wordt toegevoegd aan de weergegeven weergaven als onopvallende aantekeningen en wordt afgedwongen in de browser met jQuery-validatie.
Afhankelijkheidsinjectie
ASP.NET Core heeft ingebouwde ondersteuning voor afhankelijkheidsinjectie (DI). In ASP.NET Core MVC kunnen controllers de benodigde services aanvragen via hun constructors, zodat ze het principe expliciete afhankelijkheden kunnen volgen.
Uw app kan ook afhankelijkheidsinjectie gebruiken in weergavebestanden met behulp van de @inject instructie:
@inject SomeService ServiceName
<!DOCTYPE html>
<html lang="en">
<head>
<title>@ServiceName.GetTitle</title>
</head>
<body>
<h1>@ServiceName.GetTitle</h1>
</body>
</html>
Filteren
Met filters kunnen ontwikkelaars kruislingse problemen inkapselen, zoals het verwerken van uitzonderingen of autorisatie. Filters maken het uitvoeren van aangepaste voor- en naverwerkingslogica mogelijk voor actiemethoden en kunnen worden geconfigureerd voor uitvoering op bepaalde punten in de uitvoeringspijplijn voor een bepaalde aanvraag. Filters kunnen worden toegepast op controllers of acties als kenmerken (of kunnen globaal worden uitgevoerd). Er zijn verschillende filters (zoals Authorize) opgenomen in het framework.
[Authorize] is het kenmerk dat wordt gebruikt voor het maken van MVC-autorisatiefilters.
[Authorize]
public class AccountController : Controller
Areas
Gebieden bieden een manier om een grote ASP.NET Core MVC-web-app te partitioneren in kleinere functionele groeperingen. Een gebied is een MVC-structuur binnen een toepassing. In een MVC-project worden logische onderdelen zoals Model, Controller en Weergave in verschillende mappen bewaard en gebruikt MVC naamconventies om de relatie tussen deze onderdelen te maken. Voor een grote app kan het voordelig zijn om de app te partitioneren in afzonderlijke gebieden met functionaliteit op hoog niveau. Bijvoorbeeld een e-commerce-app met meerdere bedrijfseenheden, zoals afrekenen, facturering en zoeken, enzovoort. Elk van deze eenheden heeft zijn eigen weergaven, controllers en modellen voor logische onderdelen.
Web API's
Naast een geweldig platform voor het bouwen van websites, biedt ASP.NET Core MVC uitstekende ondersteuning voor het bouwen van web-API's. U kunt services bouwen die een breed scala aan clients bereiken, waaronder browsers en mobiele apparaten.
Het framework bevat ondersteuning voor HTTP-inhoudsonderhandeling met ingebouwde ondersteuning voor het opmaken van gegevens als JSON of XML. Schrijf aangepaste formatters om uw eigen indelingen te ondersteunen.
Gebruik koppelingsgeneratie om ondersteuning voor hypermedia in te schakelen. Schakel eenvoudig ondersteuning in voor CORS (Cross-Origin Resource Sharing), zodat uw web-API's kunnen worden gedeeld in meerdere webtoepassingen.
Testbaarheid
Het gebruik van interfaces en afhankelijkheidsinjectie van het framework maakt het geschikt voor eenheidstests en het framework bevat functies (zoals een TestHost- en InMemory-provider voor Entity Framework) die integratietests ook snel en eenvoudig maken. Meer informatie over het testen van controllerlogica.
Razor view engine
ASP.NET Core MVC-weergaven gebruiken de Razor weergave-engine om weergaven weer te geven. Razor is een compacte, expressieve en vloeiende opmaaktaal voor sjablonen voor het definiëren van weergaven met behulp van ingesloten C#-code. Razor wordt gebruikt voor het dynamisch genereren van webinhoud op de server. U kunt servercode op schone wijze combineren met inhoud en code aan de clientzijde.
<ul>
@for (int i = 0; i < 5; i++) {
<li>List item @i</li>
}
</ul>
Met behulp van de Razor weergave-engine kunt u indelingen, gedeeltelijke weergaven en vervangbare secties definiëren.
Sterk getypte weergaven
Razor weergaven in MVC kunnen sterk getypt worden op basis van uw model. Controllers kunnen een sterk getypeerd model doorgeven aan weergaven, zodat uw weergaven typecontrole en IntelliSense-ondersteuning kunnen hebben.
In de volgende weergave wordt bijvoorbeeld een model van het type IEnumerable<Product>weergegeven:
@model IEnumerable<Product>
<ul>
@foreach (Product p in Model)
{
<li>@p.Name</li>
}
</ul>
Taghelpers
Tag Helpers zorgen ervoor dat code aan de serverzijde kan deelnemen aan het maken en weergeven van HTML-elementen in Razor bestanden. U kunt taghelpers gebruiken om aangepaste tags te definiëren (bijvoorbeeld <environment>) of om het gedrag van bestaande tags te wijzigen (bijvoorbeeld <label>). Tag Helpers binden aan specifieke elementen op basis van de elementnaam en de bijbehorende kenmerken. Ze bieden de voordelen van rendering aan de serverzijde, terwijl ze nog steeds een HTML-bewerkingservaring behouden.
Er zijn veel ingebouwde Tag Helpers voor algemene taken, zoals het maken van formulieren, koppelingen, het laden van assets en meer, en nog meer beschikbaar in openbare GitHub-opslagplaatsen en als NuGet-pakketten. TagHelpers zijn geschreven in C# en ze richten zich op HTML-elementen op basis van elementnaam, kenmerknaam of bovenliggende tag. De ingebouwde LinkTagHelper kan bijvoorbeeld worden gebruikt om een koppeling te maken naar de Login actie van de AccountsController.
<p>
Thank you for confirming your email.
Please <a asp-controller="Account" asp-action="Login">Click here to Log in</a>.
</p>
U kunt EnvironmentTagHelper gebruiken om verschillende scripts in uw weergaven op te nemen (bijvoorbeeld onbewerkt of gecomprimeerd) op basis van de uitvoeromgeving, zoals Ontwikkeling, Test of Productie.
<environment names="Development">
<script src="~/lib/jquery/dist/jquery.js"></script>
</environment>
<environment names="Staging,Production">
<script src="https://ajax.aspnetcdn.com/ajax/jquery/jquery-2.1.4.js"
asp-fallback-src="~/lib/jquery/dist/jquery.js"
asp-fallback-test="window.jQuery">
</script>
</environment>
Tag Helpers bieden een html-vriendelijke ontwikkelervaring en een uitgebreide IntelliSense-omgeving voor het maken van HTML en Razor markeringen. De meeste ingebouwde Tag Helpers richten zich op bestaande HTML-elementen en bieden kenmerken aan de serverzijde voor het element.
Onderdelen weergeven
Met De weergaveonderdelen kunt u renderinglogica verpakken en opnieuw gebruiken in de hele toepassing. Ze zijn vergelijkbaar met gedeeltelijke weergaven, maar met gekoppelde logica.
Compatibiliteitsversie
Met de SetCompatibilityVersion methode kan een app zich aanmelden of afmelden voor mogelijk belangrijke gedragswijzigingen die zijn geïntroduceerd in ASP.NET Core MVC 2.1 of hoger.
Zie de compatibiliteitsversie voor ASP.NET Core MVC voor meer informatie.
Aanvullende bronnen
- MyTested.AspNetCore.Mvc - Fluent Testing Library voor ASP.NET Core MVC: Sterk getypeerde bibliotheek voor eenheidstests, die een vloeiende interface biedt voor het testen van MVC- en web-API-apps. (Niet onderhouden of ondersteund door Microsoft.)
- Afhankelijkheidsinjectie in ASP.NET Core