Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Autor: Steve Smith
ASP.NET Core MVC je bohatá architektura pro vytváření webových aplikací a rozhraní API pomocí vzoru návrhu Model-View-Controller.
Vzor MVC
Architektonický vzor Model-View-Controller (MVC) odděluje aplikaci do tří hlavních skupin komponent: Modely, pohledy a kontrolery. Tento model pomáhá dosáhnout oddělení obav. Pomocí tohoto vzoru se požadavky uživatelů směrují na kontroler, který je zodpovědný za práci s modelem za provádění uživatelských akcí nebo načítání výsledků dotazů. Kontroler zvolí zobrazení, které se má uživateli zobrazit, a poskytne mu všechna data modelu, která vyžaduje.
Následující diagram znázorňuje tři hlavní komponenty a na které odkazují ostatní:
Toto vymezení zodpovědností vám pomůže škálovat aplikaci z hlediska složitosti, protože je jednodušší kódovat, ladit a testovat něco (model, zobrazení nebo kontroler), která má jednu úlohu. Je obtížnější aktualizovat, testovat a ladit kód, který má závislosti rozložené do dvou nebo více těchto tří oblastí. Logika uživatelského rozhraní se například obvykle mění častěji než obchodní logika. Pokud se kód prezentace a obchodní logika zkombinují do jednoho objektu, musí se při každé změně uživatelského rozhraní upravit objekt obsahující obchodní logiku. To často představuje chyby a vyžaduje opětovné testování obchodní logiky po každé minimální změně uživatelského rozhraní.
Poznámka:
Zobrazení i kontroler závisí na modelu. Model ale nezávisí na zobrazení ani kontroleru. Toto je jedna z klíčových výhod oddělení. Toto oddělení umožňuje sestavit a otestovat model nezávisle na vizuální prezentaci.
Odpovědnosti modelu
Model v aplikaci MVC představuje stav aplikace a všechny obchodní logiky nebo operace, které by měly být provedeny. Obchodní logika by měla být zapouzdřena v modelu spolu s jakoukoli logikou implementace pro zachování stavu aplikace. Zobrazení se silnými typy obvykle používají typy ViewModel navržené tak, aby obsahovaly data, která se mají zobrazit v daném zobrazení. Kontroler vytvoří a naplní tyto instance Modelu ViewModel z modelu.
Zobrazit odpovědnosti
Zobrazení zodpovídají za prezentaci obsahu prostřednictvím uživatelského rozhraní. Pomocí Razor modulu zobrazení vloží kód .NET do kódu HTML. V zobrazeních by měla být minimální logika a každá logika by v nich měla souviset s prezentováním obsahu. Pokud zjistíte, že při zobrazení souborů potřebujete provádět velkou logiku, abyste mohli zobrazit data ze složitého modelu, zvažte použití komponenty zobrazení, modelu ViewModel nebo šablony zobrazení ke zjednodušení zobrazení.
Odpovědnost správce
Kontrolery jsou komponenty, které zpracovávají interakci uživatelů, pracují s modelem a nakonec vyberou zobrazení, které se má vykreslit. V aplikaci MVC se v zobrazení zobrazují pouze informace; kontroler zpracovává uživatelský vstup a interakci a reaguje na ně. V modelu MVC je kontroler počátečním vstupním bodem a zodpovídá za výběr typů modelů, se kterými se má pracovat, a za vykreslení zobrazení (proto se jmenuje kontroler – řídí, jak aplikace reaguje na konkrétní požadavek).
Poznámka:
Kontrolery by neměly být příliš složité, protože mají příliš mnoho zodpovědností. Aby se předešlo přílišné složitosti logiky kontroleru, přesuňte obchodní logiku z kontroleru do doménového modelu.
Tip
Pokud zjistíte, že akce kontroleru často provádějí stejné druhy akcí, přesuňte tyto běžné akce do filtrů.
ASP.NET Core MVC
Architektura ASP.NET Core MVC je odlehčená opensourcová a vysoce testovatelná prezentační architektura optimalizovaná pro použití s ASP.NET Core.
ASP.NET Core MVC poskytuje způsob založený na vzorcích, jak vytvářet dynamické weby, které umožňují čisté oddělení zájmů. Poskytuje úplnou kontrolu nad značkováním, podporuje vývoj přátelský k TDD a používá nejnovější webové standardy.
Směrování
ASP.NET Core MVC je založený na směrování ASP.NET Core, výkonném komponentu pro mapování adres URL, který umožňuje vytvářet aplikace, které mají čitelné a vyhledatelné adresy URL. To vám umožní definovat vzory pojmenování adres URL vaší aplikace, které dobře fungují pro optimalizaci vyhledávacích webů (SEO) a generování odkazů bez ohledu na to, jak jsou soubory na webovém serveru uspořádané. Trasy můžete definovat pomocí vhodné syntaxe šablony trasy, která podporuje omezení hodnoty trasy, výchozí hodnoty a volitelné hodnoty.
Směrování založené na konvencích umožňuje globálně definovat formáty adres URL, které vaše aplikace přijímá, a způsob, jakým se každý z těchto formátů mapuje na konkrétní metodu akce na daném kontroleru. Při přijetí příchozího požadavku směrovací modul parsuje adresu URL a shoduje se s ní s jedním z definovaných formátů url a potom zavolá metodu akce přidruženého kontroleru.
routes.MapRoute(name: "Default", template: "{controller=Home}/{action=Index}/{id?}");
Směrování pomocí atributů umožňuje určit informace o směrování tím, že označíte své kontrolery a akce atributy, které definují trasy vaší aplikace. To znamená, že definice tras se umístí vedle kontroleru a akce, ke které jsou přidružené.
[Route("api/[controller]")]
public class ProductsController : Controller
{
[HttpGet("{id}")]
public IActionResult GetProduct(int id)
{
...
}
}
Vazba modelu
ASP.NET Core MVC vazba modelu převádí data požadavku klienta (hodnoty formuláře, směrovací data, parametry řetězce dotazu, hlavičky HTTP) na objekty, které může řadič zpracovat. V důsledku toho logika kontroleru nemusí provádět práci na zjišťování příchozích dat požadavků; jednoduše obsahuje data jako parametry svých metod akcí.
public async Task<IActionResult> Login(LoginViewModel model, string returnUrl = null) { ... }
Ověření modelu
ASP.NET Core MVC podporuje ověřování označením vašeho modelového objektu ověřovacími atributy datových anotací. Ověřovací atributy jsou kontrolovány na straně klienta před odesláním hodnot na server, stejně jako na serveru před zavolání akce kontroleru.
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; }
}
Akce kontroleru:
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);
}
Architektura zpracovává ověřování dat požadavků v klientovi i na serveru. Logika ověřování zadaná u typů modelů se přidá do vykreslených zobrazení jako nerušivé poznámky a vynucuje se v prohlížeči pomocí ověřování jQuery.
Injektáž závislostí
ASP.NET Core má integrovanou podporu injektáže závislostí (DI). V ASP.NET Core MVC mohou kontrolery vyžadovat potřebné služby prostřednictvím jejich konstruktorů, což jim umožní dodržovat zásadu explicitních závislostí.
Aplikace může také použít injektáž závislostí v zobrazení souborů pomocí direktivy @inject :
@inject SomeService ServiceName
<!DOCTYPE html>
<html lang="en">
<head>
<title>@ServiceName.GetTitle</title>
</head>
<body>
<h1>@ServiceName.GetTitle</h1>
</body>
</html>
Filtry
Filtry pomáhají vývojářům zapouzdřit průřezové otázky, jako je zpracování výjimek nebo autorizace. Filtry umožňují spouštění vlastní logiky předběžného zpracování a následného zpracování pro metody akcí a je možné je nakonfigurovat tak, aby běžely v určitých bodech v rámci kanálu provádění pro daný požadavek. Filtry lze použít na kontrolery nebo akce jako atributy (nebo je možné je spustit globálně). Součástí architektury je několik filtrů (například Authorize).
[Authorize] je atribut, který se používá k vytvoření autorizačních filtrů MVC.
[Authorize]
public class AccountController : Controller
Oblasti
Oblasti poskytují způsob, jak rozdělit velkou webovou aplikaci ASP.NET Core MVC do menších funkčních seskupení. Oblast je struktura MVC uvnitř aplikace. V projektu MVC se logické komponenty, jako je model, kontroler a zobrazení, uchovávají v různých složkách a MVC používá zásady vytváření názvů k vytvoření vztahu mezi těmito komponentami. U velké aplikace může být výhodné rozdělit aplikaci do samostatných oblastí funkcí vysoké úrovně. Například aplikace elektronického obchodování s několika obchodními jednotkami, jako je pokladna, fakturace a vyhledávání atd. Každá z těchto jednotek má vlastní zobrazení, kontrolery a modely logických komponent.
Webová rozhraní API
Kromě skvělé platformy pro vytváření webů má ASP.NET Core MVC skvělou podporu pro vytváření webových rozhraní API. Můžete vytvářet služby, které se dostanou do široké škály klientů, včetně prohlížečů a mobilních zařízení.
Tato architektura zahrnuje podporu vyjednávání obsahu HTTP s integrovanou podporou formátování dat jako JSON nebo XML. Napište vlastní formátovací moduly , které přidávají podporu pro vlastní formáty.
K povolení podpory hypermedií použijte generování odkazů. Snadno povolte podporu Cross-Origin Resource Sharing (CORS) tak, aby vaše API mohla být sdílena napříč více webovými aplikacemi.
Schopnost být testován
Použití rozhraní a injektáž závislostí činí framework vhodným pro jednotkové testování a framework obsahuje funkce (jako je TestHost a poskytovatel InMemory pro Entity Framework), které také zjednodušují a urychlují integrační testy. Přečtěte si další informace o tom, jak testovat logiku kontroleru.
Razor zobrazovací engine
ASP.NET Core MVC používá modul pro zobrazení k vykreslení pohledů. Razor je kompaktní, výrazný a fluidní jazyk značek šablon pro definování zobrazení pomocí vloženého kódu jazyka C#. Razor slouží k dynamickému generování webového obsahu na serveru. Kód serveru můžete čistě kombinovat s obsahem a kódem na straně klienta.
<ul>
@for (int i = 0; i < 5; i++) {
<li>List item @i</li>
}
</ul>
Razor Pomocí modulu zobrazení můžete definovat rozložení, částečná zobrazení a nahraditelné oddíly.
Zobrazení silného typu
Razor zobrazení v MVC mohou být silně typovaná na základě vašeho modelu. Kontrolery můžou předat silně typovaný model, který umožňuje zobrazením kontrolu typů a podporu IntelliSense.
Například následující zobrazení vykreslí model typu IEnumerable<Product>:
@model IEnumerable<Product>
<ul>
@foreach (Product p in Model)
{
<li>@p.Name</li>
}
</ul>
Pomocníci značek
Pomocníci značek umožňují, aby se kód na straně serveru zúčastnil vytváření a vykreslování prvků HTML v Razor souborech. Pomocné rutiny značek můžete použít k definování vlastních značek (například <environment>) nebo ke změně chování existujících značek (například <label>). Pomocníci značek se váží na konkrétní prvky na základě názvu elementu a jeho atributů. Poskytují výhody vykreslování na straně serveru při zachování prostředí pro úpravy HTML.
Existuje mnoho předdefinovaných pomocníků značek pro běžné úlohy, například vytváření formulářů, odkazů, načítání assets a další – a ještě více dostupných ve veřejných úložištích GitHubu a jako balíčky NuGet. Tag Helpery jsou vytvořené v jazyce C# a cílí na HTML elementy na základě názvu elementu, názvu atributu nebo rodičovské značky. Například integrovaný LinkTagHelper lze použít k vytvoření odkazu na Login akci AccountsControllerakce:
<p>
Thank you for confirming your email.
Please <a asp-controller="Account" asp-action="Login">Click here to Log in</a>.
</p>
EnvironmentTagHelper lze použít k zahrnutí různých skriptů do zobrazení (například nezpracovaných nebo minifikovaných) na základě běhového prostředí, jako je vývoj, staging nebo produkce.
<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>
Pomocné prvky značek poskytují prostředí pro vývoj přátelské pro HTML a bohaté prostředí IntelliSense pro vytváření HTML a Razor značek. Většina předdefinovaných pomocníků značek cílí na existující elementy HTML a poskytuje serverové atributy pro element.
Zobrazit komponenty
Zobrazit komponenty umožňují zabalit logiku vykreslování a opakovaně ji používat v celé aplikaci. Podobají se částečným zobrazením, ale mají přidruženou logiku.
Kompatibilita – verze
Metoda SetCompatibilityVersion povolila aplikaci vyjádřit výslovný souhlas nebo vyjádřit výslovný nesouhlas s potenciálně zásadními změnami chování zavedeným v ASP.NET Core MVC 2.1 nebo novějším. Metoda je no-op pro aplikace ASP.NET Core 3.0 a novější a je odebraná v ASP.NET Core 11. Další informace najdete v článcích Verze kompatibility pro MVC v ASP.NET Core a Odebrané možnosti kompatibility MVC.
Další materiály
- MyTested.AspNetCore.Mvc – Fluent Testing Library for ASP.NET Core MVC: Knihovna pro unit testy se silným typováním, která poskytuje fluentní rozhraní pro testování aplikací MVC a webového API. (Microsoft neudržuje ani nepodporuje.)
- Injektáž závislostí v ASP.NET Core