Modul 8 - Lekcija 3
Upoznavanje sa parametrima u RouteConfig klasama, MVC mapirajuće rute i Constraints filterima
⏱️ Trajanje: ~4 časa | 📚 Nivo: Napredni | 🎯 Praktični primjeri: 10+
ASP.NET Aplikacija skenira Vaš RouteConfig.cs sa reda 1 na red 100 i prvi URL
Template Pattern
koji uspije navući na posjetiocov URL Link kojeg je u kucao iznad on ga
ispaljuje!
Iz tog razloga sve specifične posebne rute idu Poviše one jedne jedine "Default genericke CatchAll" rute na samom dnu fajla!
routes.MapRoute(
name: "TajnaAdresa",
url: "admin/tajno/kreiraj",
defaults: new { controller = "Sigurnost", action = "Soba" }
);
// Ova DEFAULT genericka pokriva sve slucajeve (Npr Domena.ba/Aktivnost/Gledaj) ZATO IDE NA KRAJ
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
Segmente između / označavamo vitičastim zagradama: {parametar}.
Možemo im primijeniti Regex constraints koji im naređuju tačan šablon koji URL mora da
poštuje kao uslov da se kontroler spoji.
public static void RegisterRoutes(RouteCollection routes)
{
// Ruta koja dopušta spajanje C# Controllera SAMO ako je kucani URL oblika "arhiva/2023" i godina je Tačno 4 Cifre
routes.MapRoute(
name: "ArhivaConstraint",
url: "arhiva/{godina}",
defaults: new { controller = "ArhivaIstorija", action = "Pregledaj" },
constraints: new { godina = @"\d{4}" } // Obavezuje da url Parametar bude Number!
);
}
Ako klijent otvori: URL: domena/arhiva/1993
Metoda kontrolera prima argumente automatski bez ručnog pretvaranja stringova pod uslovom da
varijablu nazovemo istim imenom kao URL Segment:
public ActionResult Pregledaj(int godina) { ... }
Ukoliko korisnik ispiše divlji URL za koji ne postoji definisan šablon - ASP.NET će ispisati veliku žutu slabu Windows Exception Strnicu!
// KAKO PREDUSRESTI Divlje URL adrese (Ubaci OVO SVE na skroz dnu Route Config ispod Defaulta)
// Ruta za prikaz dizajnirane 404 stranice u Views Folderu Error Controllera
routes.MapRoute(
name: "PageNotFound",
url: "ups-greska-404",
defaults: new { controller = "Greske", action = "MissingRoute" }
);
// Fallback "Catcher" svih nebuloza. {*url} Kupit ce i 10 kosih / oznaka ako treba i proslijediti na nas Error Index sa 404 stranicom.
routes.MapRoute(
name: "FallbackToHome",
url: "{*url}",
defaults: new { controller = "Greske", action = "MissingRoute" }
);
Kada radimo izbacivanje Custom i globalne 404/500 Greške obavezno čistimo uprljani Response Objekat u
Global.asax arhitekturi!
protected void Application_Error(object sender, EventArgs e)
{
Exception iznimka = Server.GetLastError();
// Server.ClearError() Uklanja izuzetku iz ASP.NET pipeline-a, sprečavajući
// zloglasni zuti Žuti IIS Warning zaslon sa crvenim errorima!
Server.ClearError();
// OPREZ! Response.Clear(); Briše sve što je već isprintano i upisano u odovornom buferu i prazni ga na nulu!
// Ovo osigurava da vi upišete svoj cisti i elegantni "404 page" preusmjer u prazno platno
// umjesto da preusmjer zaglavi pomješan sa započetim rušenjem prethodne forme!
Response.Clear();
// Sada je Response prazan, pa obavimo bezbjedan Preusmjer:
Response.Redirect("/ups-greska-404");
}
Konfuzija nastaje jer MS Framework posjeduje dvije arhitekture rutiranja. Srećom ASP.NET Core API rute (Kada jednom krenete učiti i taj FW) su gotovo identicne strukturalno ali na logički drukčijem mjestu!
// U CORE sistemima mi ne koristimo RouteConfig file tabele
// Već dodajemo komande rutirajućem Pipeline-u unutar "Program.cs"
app.MapControllerRoute(
name: "default",
pattern: "{controller=Home}/{action=Index}/{id?}"); // id? u Core rjesava Nullable a u MVC koristvimo UrlParameter.Optional
// CORE CONSTRAINTS C. (Nove znacajke) Constraints idu u Pattern a ne kao atributi:
app.MapControllerRoute(
name: "arhiva",
pattern: "custom/{godina:int}/{naslov?}");
id = UrlParameter.Optional čitaju se direktno kao nullable field u C# Varijablama
Kontrolerske metode ukoliko je klijent zaista pokucao URL bez tog argumenta.