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 likvidují na základě každého požadavku.

Podle konvence třídy kontroleru:

  • Nachází se v kořenové úrovni složky Řadiče 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 aplikuje 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 pro jednu metodu akce, zvažte použití Action Injection k injektování závislosti.

V rámci vzoru Model-View-Controller zodpovídá kontrolér 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 úrovně 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í záležitosti by se obvykle měly reprezentovat jako služby, ke kterým kontroler přistupuje prostřednictvím injektování závislostí. Akce pak namapují výsledek podnikové 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 zajišťuje odpovídání.

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, NotFounda Ok. Například return BadRequest(); při spuštění vytvoří stavový kód 400. Pokud jsou metody, jako BadRequest, NotFound a Ok, přetíženy, již se neklasifikují jako respondéři HTTP stavových kódů, 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, nebo RedirectToRoute). Například return RedirectToAction("Complete", new {id = 123}); přesměruje na Complete, přičemž předává anonymní objekt.

    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 a PhysicalFile. Například return 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í o obsahu se použije vždy, když akce vrátí ObjectResult typ nebo něco jiného, než je implementace IActionResult. Akce, která vrací neimplementaciIActionResult (například object), a zároveň vrátí také formátovanou odpověď.

Mezi pomocné metody tohoto typu patří BadRequest, CreatedAtRoutea 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 a Ok provádějí vyjednávání obsahu pouze pokud je předána hodnota; pokud není předána hodnota, slouží místo toho jako typy výsledků stavových kódů HTTP. Metoda CreatedAtRoute naproti tomu vždy provádí konfiguraci obsahu, protože všechna jeho přetížení 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:

Mnoho průřezových záležitostí lze zpracovat pomocí filtrů nebo vlastního middlewaru.