Zpracování požadavků pomocí kontrolerů v ASP.NET Core MVC
Steve Smith a Scott Addie
Kontrolery, akce a výsledky akcí jsou základní součástí toho, jak vývojáři vytvářejí aplikace pomocí ASP.NET Core MVC.
Co je kontroler?
Kontroler slouží k definování a seskupení sady akcí. Akce (nebo metoda akce) je metoda na kontroleru, který zpracovává požadavky. Kontrolery logicky seskupí podobné akce dohromady. Tato agregace akcí umožňuje souhrnně použít společné sady pravidel, jako je směrování, ukládání do mezipaměti a autorizace. Požadavky se mapují na akce prostřednictvím směrování. Kontrolery se aktivují a vyřaďte na každý požadavek.
Podle konvence třídy kontroleru:
- Nachází se ve složce Řadiče kořenové úrovně projektu.
- Dědit z
Microsoft.AspNetCore.Mvc.Controller
.
Kontroler je okamžitě dostupná třída, obvykle veřejná, ve které platí alespoň jedna z následujících podmínek:
- Název třídy je příponou
Controller
. - Třída dědí z třídy, jejíž název je příponou
Controller
. - Atribut
[Controller]
se použije na třídu.
Třída kontroleru nesmí mít přidružený [NonController]
atribut.
Kontrolery by měly dodržovat zásadu explicitních závislostí. Existuje několik přístupů k implementaci tohoto principu. Pokud více akcí kontroleru vyžaduje stejnou službu, zvažte použití injektáže konstruktoru k vyžádání těchto závislostí. Pokud je služba potřebná pouze jednou metodou akce, zvažte použití injektáže akce k vyžádání závislosti.
V rámci modelu ontroller Model-View-C zodpovídá kontroler za počáteční zpracování požadavku a vytvoření instance modelu. Obecně platí, že obchodní rozhodnutí by se měla provádět v rámci modelu.
Kontroler převezme výsledek zpracování modelu (pokud existuje) a vrátí buď správné zobrazení a jeho přidružená data zobrazení, nebo výsledek volání rozhraní API. Další informace najdete v přehledu ASP.NET Core MVC a začínáme s ASP.NET Core MVC a sadou Visual Studio.
Kontroler je abstrakce na úrovni uživatelského rozhraní. Jeho odpovědností je zajistit, aby data požadavku byla platná a zvolila, které zobrazení (nebo výsledek pro rozhraní API) se má vrátit. V dobře faktorovaných aplikacích nezahrnuje přímý přístup k datům ani obchodní logiku. Místo toho správce deleguje na služby, které tyto povinnosti zpracovávají.
Definování akcí
Veřejné metody v kontroleru s výjimkou těch, které mají [NonAction]
atribut, jsou akce. Parametry akcí jsou vázané na data požadavku a ověřují se pomocí vazby modelu. K ověření modelu dochází pro vše, co je vázané na model. Hodnota ModelState.IsValid
vlastnosti označuje, zda vazby modelu a ověření proběhlo úspěšně.
Metody akcí by měly obsahovat logiku pro mapování požadavku na obchodní problém. Obchodní obavy by se obvykle měly reprezentovat jako služby, ke kterým kontroler přistupuje prostřednictvím injektáže závislostí. Akce pak namapuje výsledek obchodní akce na stav aplikace.
Akce můžou vrátit cokoli, ale často vrací instanci IActionResult
(nebo Task<IActionResult>
pro asynchronní metody), která vytváří odpověď. Metoda akce zodpovídá za výběr typu odpovědi. Výsledek akce odpovídá.
Pomocné metody kontroleru
Kontrolery obvykle dědí z Controller, i když to není povinné. Odvozování z Controller
poskytuje přístup ke třem kategoriím pomocných metod:
1. Metody, které vedou k prázdnému textu odpovědi
Není zahrnuta žádná Content-Type
hlavička odpovědi HTTP, protože tělo odpovědi neobsahuje obsah k popisu.
V této kategorii existují dva typy výsledků: Přesměrování a Stavový kód HTTP.
Stavový kód HTTP
Tento typ vrátí stavový kód HTTP. Několik pomocných metod tohoto typu jsou
BadRequest
,NotFound
aOk
. Napříkladreturn BadRequest();
při spuštění vytvoří stavový kód 400. Pokud jsou metody, jakoBadRequest
je ,NotFound
aOk
jsou přetíženy, již nejsou kvalifikovány jako reakce stavového kódu HTTP, protože probíhá vyjednávání obsahu.Přesměrovat
Tento typ vrátí přesměrování na akci nebo cíl (pomocí
Redirect
,LocalRedirect
,RedirectToAction
, neboRedirectToRoute
). Napříkladreturn RedirectToAction("Complete", new {id = 123});
přesměruje naComplete
předání anonymního objektu.Typ výsledku přesměrování se liší od typu stavového kódu HTTP, a to především při přidání
Location
hlavičky odpovědi HTTP.
2. Metody, které mají za následek neprázdný text odpovědi s předdefinovaným typem obsahu
Většina pomocných metod v této kategorii obsahuje ContentType
vlastnost, která umožňuje nastavit hlavičku Content-Type
odpovědi pro popis textu odpovědi.
V této kategorii existují dva typy výsledků: Zobrazit a Formátovaná odpověď.
Zobrazení
Tento typ vrátí zobrazení, které používá model k vykreslení HTML. Například
return View(customer);
předá model do zobrazení pro datovou vazbu.Formátovaná odpověď
Tento typ vrací formát JSON nebo podobný formát výměny dat, který představuje objekt určitým způsobem. Například
return Json(customer);
serializuje zadaný objekt do formátu JSON.Mezi další běžné metody tohoto typu patří
File
aPhysicalFile
. Napříkladreturn PhysicalFile(customerFilePath, "text/xml");
vrátí PhysicalFileResult.
3. Metody, které mají za následek neprázdný text odpovědi formátovaný v typu obsahu vyjednaný s klientem
Tato kategorie se lépe označuje jako vyjednávání obsahu. Vyjednávání obsahu se použije vždy, když akce vrátí ObjectResult typ nebo něco jiného než implementaci IActionResult . Akce, která vrací neimigresiIActionResult
(například object
) vrátí také formátovanou odpověď.
Mezi pomocné metody tohoto typu patří BadRequest
, CreatedAtRoute
a Ok
. Mezi příklady těchto metod patří return BadRequest(modelState);
, return CreatedAtRoute("routename", values, newobject);
a return Ok(value);
, v uvedeném pořadí. Všimněte si, že BadRequest
Ok
vyjednávání obsahu se provádí pouze při předání hodnoty, aniž by byla předána hodnota, místo toho slouží jako typy výsledků stavového kódu HTTP. Metoda CreatedAtRoute
na druhé straně vždy provádí vyjednávání obsahu, protože jeho přetížení všechny vyžadují předání hodnoty.
Průřezové otázky
Aplikace obvykle sdílejí části pracovního postupu. Mezi příklady patří aplikace, která vyžaduje ověření pro přístup k nákupnímu košíku, nebo aplikaci, která ukládá data do mezipaměti na některých stránkách. K provedení logiky před nebo po metodě akce použijte filtr. Použití filtrů u průřezových aspektů může snížit duplicitu.
Většina atributů filtru, například [Authorize]
, lze použít na úrovni kontroleru nebo akce v závislosti na požadované úrovni členitosti.
Zpracování chyb a ukládání odpovědí do mezipaměti jsou často nejčastějšími aspekty:
Řadu problémů s křížovým dělením je možné zpracovat pomocí filtrů nebo vlastního middlewaru.