This article has been localized into Hungarian by the community.
Egy MVC útvonal anatómiája
Már beszéltünk róla, hogy milyen könnyű egyszerű routing támogatást megadni az alapértelmezett routingnak köszönhetően. Jó ötlet viszont tudni, hogyan vannak az útvonalak definiálva, mert eljön majd az idő, amikor ki kell lépned ebből a komfortzónából és saját szabályokat kell írnod.
Egy routing szabály legfontosabb része a URL lefordítása vezérlőmetódussá. Ehhez szükségünk van egy URL útvonalra, valamit a vezérlő és a metódus nevére. A rendszernek azonosítania kell tudni a szabályt (és neked is szükséged lehet egy emlékeztetőre, ha már sok szabályod van), ezért a szabálynak nevet is kell adnunk.
Ennek tudatában írjunk egy nagyon egyszerű szabályt. Ahogy már említettük, routing szabályokat több módon és helyen tudunk megadni, de most kezdetnek a Startup.cs fájlba tesszük, azon belül pedig a Configure() metódusba:
app.UseMvc(routes =>
routes.MapRoute("ProductList", "Products/List/", new { controller = "Products", action = "List" })
);
A MapRoute() metódushívás több paramétert is felvesz - ebben az esetben most megadjuk a szabály nevét (első paraméter), a szabály URL sémáját (második paraméter), valamint egy "alapértelmezés-objektumot" (harmadik paraméter), ami a megfelelő vezérlőre és metódusra irányítja a szabályt. Most hogy ez a helyén van, használhatjuk a http://localhost/Products/List URL-t, ami hívja a ProductsController List() metódusát.
Útvonalséma
A fenti példában a legérdekesebb paraméter a második volt. Ez adja meg az útvonal sémáját, és bár a mi sémánk nagyon egyszerű volt, sok más lehetőség is rendelkezésünkre áll, amikkel komplex és kifinomult URL-eket is támogathatsz. Az egyik lehetőséged, hogy közvetlen a sémában egy alapértelmezett vezérlőt és metódust/akciót adsz meg:
routes.MapRoute("Default", "{controller=Home}/{action=Index}")
Ezt általában konvencionális routingnak nevezik, mivel legalább két részből áll, ahol az első rész a vezérlőre hivatkozik, a második pedig az akcióra/metódusra. A harmadik és elhagyható rész általában egy ID, amivel kifejezetten egy megjelenítendő elemre hivatkozhatsz, például terméklista helyett egy bizonyos termékre. Ezt az opcionális ID paramétert szintén megadhatod az útvonalban, egy különleges szintaxis segítségével. Próbáljunk meg egy összetettebb útvonalat leírni, ahol az imént említett technikákat alkalmazzuk:
app.UseMvc(routes =>
routes.MapRoute("Products", "Products/{action=Index}/{id?}", new { controller = "Products" })
);
Ez a séma most azokra a URL-ekre vonatkozik, amelyek a "products" szóval kezdődnek. Ha nincs semmi más megadva, akkor az Index akció/metódus lesz használva. Ha viszont igen, akkor az annak megfelelő akció. A végén megadtunk egy opcionális ID paramétert - azt, hogy ez elhagyható, a kérdőjel jelöli. Ezzel a szabállyal a következő URL-eket támogatjuk:
- /Products/
- /Products/List/
- /Products/Details/32/
A vezérlő ezeket a helyzeteket így kezelné:
public class ProductsController : Controller
{
public IActionResult Index()
{
return Content("Product overview");
}
public IActionResult List()
{
return Content("Product list");
}
public IActionResult Details(int id)
{
return Content("Product details for #" + id);
}
}
Különösen nézd át a Details metódusokat - az egyiken van egy "id" nevű paraméter, ugyanúgy, ahogy az útvonalszabályban is megadtuk. Ez azt jelenti, hogy ha a Details URL-t használod, akkor a végén található ID a Details metódusnak automatikusan paraméterként lesz átadva!
Mint láthatod az útvonalséma rendszer nagyon flexibilis és sok különböző URL változatot támogathatsz vele. Még sok más lehetőség is van, amiket később még ismertetünk, de remélhetőleg ezek a példák megmutatták, mennyi lehetőség van az ASP.NET MVC routing mechanizmusaiban.
Többszörös útvonalak
Mint említettem, természetesen egynél több útvonalat is megadhatsz alkalmazásodban. Voltaképpen a leggyakrabb megközelítés az, hogy az alapértelmezett, általános útvonalat használjuk, de azt az útvonalak listája alján tartjuk. Miért is? Mert a routing szabályok fentről lefelé vannak értelmezve, ez pedig addig megy, amíg egy alkalmazható útvonalat nem talál a rendszer - amikor ez megtörténik, a többi nem kerül feldolgozásra. Ez annyit tesz, hogy érdemes a pontosabb szabályokat felül hagyni, az általánosabbakat pedig alul. Egy példa erre:
app.UseMvc(routes =>
{
routes.MapRoute("Products", "Products/{action=Index}/{id?}", new { controller = "Products" });
routes.MapRoute("Default", "{controller=Home}/{action=Index}/{id?}");
});
Látható hogy az első szabály nagyon is specifikus (termékekre vonatkozik), a vége viszont egy általános szabály. Ezzel biztos lehetsz felőle, hogy ha nem is írtál egy pontos útvonalat egy vezérlő/akció kombinációra, akkor is meg lesz kísérelve egy megfelelő akció megtalálása - ha pedig ez sem létezik, akkor alapértelmezetten a HomeController Index() metódusa hajtódik végre.
Összefoglaló
Most már remélhetőleg jobban érted, hogyan működik a routing, és magad is tudsz útvonalakat, szabályokat definiálni. A következő cikkben megvizsgáljuk, milyen más lehetőségeid vannak még a szabályok definiálásakor, és hogy hogyan másképp használhatod az ASP.NET MVC routing mechanizmusait.