zpracování požadavků s řadiči ve službě ASP.NET Core MVC
řadiče, akce a výsledky akcí jsou základní součástí způsobu, jakým vývojáři sestavují aplikace pomocí ASP.NET Core MVC.
Co je kontroler?
Kontroler se používá k definování a seskupení sady akcí. Akce (nebo metoda akce) je metoda na řadiči, který zpracovává požadavky. Řadiče logicky seskupují podobné akce dohromady. Tato agregace akcí umožňuje souhrnně použít společné sady pravidel, například směrování, ukládání do mezipaměti a autorizaci. Požadavky jsou mapovány na akce prostřednictvím Směrování.
Podle konvence třídy kontroleru:
- Nachází se ve složce řadičů na úrovni kořenového projektu.
- Zdědit z
Microsoft.AspNetCore.Mvc.Controller.
Kontroler je třída instantiable, ve které je splněná alespoň jedna z následujících podmínek:
- Název třídy je s příponou
Controller. - Třída dědí z třídy, jejíž název je přípona
Controller. [Controller]Atribut je použit pro třídu.
Třída kontroleru nesmí mít přidružený [NonController] atribut.
Řadiče by měly dodržovat Princip explicitní závislosti. K implementaci tohoto principu existuje několik přístupů. Pokud více akcí kontroleru vyžaduje stejnou službu, zvažte použití Injektáže konstruktoru pro vyžádání těchto závislostí. Pokud je služba potřebná jenom pomocí jediné metody akce, můžete pro vyžádání závislosti použít vkládání akcí .
V rámci vzoru M Odel-V s ontroller, je kontrolor zodpovědný za počáteční zpracování žádosti a vytváření instancí modelu. Obecně platí, že podniková rozhodnutí by se měla provádět v rámci modelu.
Kontroler vezme 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 článku přehled ASP.NET Core mvc a začínáme s ASP.NET Core mvc a Visual Studio.
Kontroler je abstrakce na úrovni uživatelského rozhraní . Jejich zodpovědností je zajistit, aby data požadavku byla platná, a zvolili si, které zobrazení (nebo výsledek pro rozhraní API) by mělo být vráceno. Ve dobře se aplikacích nezahrnuje přímo přístup k datům ani obchodní logiku. Místo toho se správce deleguje ke službám, které tyto odpovědnosti zpracovávají.
Definování akcí
Veřejné metody na řadiči, s výjimkou [NonAction] atributů, jsou akce. Parametry v akcích jsou vázány na data požadavku a jsou ověřovány pomocí vazby modelu. K ověřování modelu dochází pro všechny objekty, které jsou vázány na model. ModelState.IsValidHodnota vlastnosti označuje, zda se vazba a ověření modelu zdařilo.
Metody akcí by měly obsahovat logiku pro mapování požadavků na obchodní obavy. Obchodní aspekty by se obvykle měly vystupovat jako služby, ke kterým řadič přistupuje prostřednictvím Injektáže závislosti. Akce pak namapuje výsledek obchodní akce do stavu aplikace.
Akce mohou vracet cokoli, ale často vracejí instanci IActionResult (nebo Task<IActionResult> pro asynchronní metody), které vytvářejí odpověď. Metoda Action zodpovídá za výběr typu odpovědi. Výsledek akce odpovídá.
Pomocné metody kontroleru
Řadiče obvykle dědí z řadiče, přestože to není vyžadováno. Odvození z Controller poskytuje přístup ke třem kategoriím pomocných metod:
1. metody, které mají za následek prázdné tělo odpovědi
Content-TypeNení obsažena hlavička odpovědi HTTP, protože tělo odpovědi nemá 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,NotFoundaOk. Napříkladreturn BadRequest();generuje stavový kód 400 při spuštění. Když metody jakoBadRequest,NotFoundaOkjsou přetíženy, již nejsou kvalifikovány jako reakce na stavový kód HTTP, protože probíhá vyjednávání obsahu.Přesměrování
Tento typ vrátí přesměrování na akci nebo cíl (pomocí,,
RedirectLocalRedirectRedirectToActionneboRedirectToRoute). Napříkladreturn RedirectToAction("Complete", new {id = 123});přesměrování naComplete, předání anonymního objektu.Typ výsledku přesměrování se liší od typu stavového kódu HTTP primárně v kombinaci s
Locationhlavičkou odpovědi HTTP.
2. metody, které mají za následek neprázdné tělo odpovědi s předdefinovaným typem obsahu
Většina pomocných metod v této kategorii zahrnuje ContentType vlastnost, která umožňuje nastavit Content-Type hlavičku odpovědi pro popis těla odpovědi.
V této kategorii existují dva typy výsledků: zobrazení a formátovaná odpověď.
Zobrazení
Tento typ vrátí zobrazení, které používá model pro vykreslení kódu HTML. Například
return View(customer);předává model do zobrazení pro datovou vazbu.Naformátovaná odpověď
Tento typ vrátí JSON nebo podobný formát výměny dat, který reprezentuje objekt určitým způsobem. Například
return Json(customer);serializaci poskytnutého objektu do formátu JSON.Mezi další běžné metody tohoto typu patří
FileaPhysicalFile. Napříkladreturn PhysicalFile(customerFilePath, "text/xml");vrátí PhysicalFileResult.
3. metody, které mají za následek neprázdné tělo odpovědi formátované v typu obsahu vyjednané s klientem
Tato kategorie je lépe známá jako vyjednávání obsahu. Vyjednávání obsahu se aplikuje vždy, když akce vrátí ObjectResult typ nebo něco jiného než implementace IActionResult . Akce, která vrací IActionResult neimplementující (například object ), vrátí také formátovanou odpověď.
Mezi pomocné metody tohoto typu patří BadRequest , CreatedAtRoute a Ok . Příklady těchto metod jsou, return BadRequest(modelState); return CreatedAtRoute("routename", values, newobject); , a return Ok(value); v uvedeném pořadí. Všimněte si, že BadRequest a Ok provádíte vyjednávání obsahu pouze v případě, že byla předána hodnota. bez předávání hodnoty místo toho slouží jako typy výsledku stavového kódu protokolu HTTP. Na CreatedAtRoute druhé straně, vždy provádí vyjednávání obsahu, protože jeho přetížení vyžaduje předání hodnoty.
Otázky pro průřezy
Aplikace obvykle sdílí části svého 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á na některých stránkách ukládá data do mezipaměti. Chcete-li provést logiku před nebo za metodou akce, použijte Filtr. Použití filtrů při průřezových záležitostech může snížit duplicity.
Většinu atributů filtru, jako [Authorize] je například, lze použít na úrovni řadiče nebo akce v závislosti na požadované úrovni členitosti.
Zpracování chyb a ukládání odpovědí do mezipaměti často souvisí mezi různými aspekty:
Mnoho obav v průřezech se dá zpracovat pomocí filtrů nebo vlastního middlewaru.