Routing Konfiguracija

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+

📖 Pravila Evaluacije Ruta iz Tabele

Top-to-Bottom Princip (Jako Bitno)

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 }
);

🔗 Dinamični Ograničeni Segmenti Url-a

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!
    );
}

Rezultanta: Kontroler Action

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) { ... }

🛑 Rukovanje 404 (Not Found) i FallbackRutiranje

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" }
);

⚡ Application_Error čišćenje Response Objeta

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");
}

.NET Core vs .NET MVC 5

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?}");

✅ Zaključak

  • RouteConfig Evaluacija ide odozgo prema dnu. Veoma dinamičke usko ograničene i specifične Linkove uvijek bacajte na vrh funkcije a Defaultnu sa {controller} mapiranjem ostavite potpuno kao treci red za kraj.
  • ✅ Constraints poput Regexa ograničavaju parametre. Parametri poput id = UrlParameter.Optional čitaju se direktno kao nullable field u C# Varijablama Kontrolerske metode ukoliko je klijent zaista pokucao URL bez tog argumenta.
  • ✅ Čišćenje Buffer memorije pri preusmjerima globalnih izuzetaka Servera sprječavaja nastanak i iscrtavanje pokvarenog HTML Layout okvira i curenja sistemske i mrežne arhitekture napadačima!