Routing i Navigacija

Modul 5 - Lekcija 1

RouteConfig, Attribute Routing, URL parametri i generisanje linkova

⏱️ Trajanje: ~3 časa | 📚 Nivo: Srednji | 🎯 Praktični primjeri: 5

📖 Routing Arhitektura (Usmjeravanje)

U klasičnim aplikacijama web URL direktno ukazuje na stvarni fajl na hard disku servera (npr. prijava.aspx).

Routing (usmjeravanje) u ASP.NET MVC-u ne traži fajl, već služi kao rutirajuća komanda koja se mapira na "Logičkog Izvršioca" u memoriji (Controller klasu) i njenu konkretnu metodu (Action).

Poboljšan UX i SEO Optimizacija

Stvaramo sigurne, čiste adrese web resursa poput /Ministarstvo/Zaposleni/MF-123 umjesto sigurnosnih marifetluka i zbunjujućih URL-ova poput /zap.aspx?min=MF&id=123.

⚙️ Logika Usmjeravanja (Route Engine)

Dolazni HTTP GET prvo dođe do ASP.NET UrlRoutingModule presretača. On uzima URL, isiječe ga na dijelove i pokreće matchiranje s pravilima, redom po redu iz Globalnog RouteTable-a!

Pravila se obično dodaju na početku pokretanja servisa u Global.asax Application_Start metodi i pune RouteConfig stablom pravila.

GET /Ministarstvo/Detalji/5 Routing Engine Pravilo 1: API Pravilo 2: Default MVC MVC Pipeline MinistryController Detalji(id: 5) Match!

🛣️ RouteConfig.cs File i Custom Rule Constraints

Registracija konvencionalnih ruta obavlja se u fajlu App_Start/RouteConfig.cs. Za svaku rutu pored teksta stringa mi možemo uspostaviti RegEx Pravila (Constraints).

public static void RegisterRoutes(RouteCollection routes)
{
    // Ignoriši zahtjeve za automatske .NET axd fajlove (kao WebResource)
    routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

    // SPECIJALIZOVANA RUTA: Dozvoli SAMO ako ID parametar ima TAČNO 13 brojeva na kraju!
    routes.MapRoute(
        name: "RadnikPrekoJMBG",
        url: "Zaposleni/Pretraga/{jmbg}",
        defaults: new { controller = "Employees", action = "Trazi" },
        constraints: new { jmbg = @"\d{13}" } // RegEx Constraints Filter
    );

    // DEFAULT PATTERN (UVIJEK IDE NA DNO KAO FALLBACK NAJMANJE OPISA)
    // /Kontroler/Akcija/Broj  (Broj je "Optional" parametar, ako ge nema metoda se pali s tim da je ID=Null)
    routes.MapRoute(
        name: "Default",
        url: "{controller}/{action}/{id}",
        defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
    );
}

🎯 Attribute Routing (Eksplicitne Rute nad C# Klasom)

Attribute Routing obrnuti je princip; omogućava definisanje ruta eksplicitno tako što "ukrašavamo" C# Controler klasu umjesto punjenja centralizovanog RouteConfig fajla! Nema više pogađanja koja klasa odgovara kom linku.

// Da bi ovo radilo prvo u RouteConfig.cs na početku uključiva aktivaciju:
routes.MapMvcAttributeRoutes();
[RoutePrefix("ministry")] // Cijela kontroler klasa reaguje ispod /ministry
public class MinistryController : Controller 
{
    [Route("{code}")] // Spojeno sa Prefixom kreira Endpoint: /ministry/{code}
    public ActionResult Details(string code) { ... }

    // Rješavanje specifične uvezanosti. Znak '~' u C# routama overrajdira/ponistava RoutePrefix!
    // Ovo će dakle reagovati samo na URL tipa: /reports/2024
    [Route("~/reports/{year:regex(\\d{4})}")]
    public ActionResult YearlyReport(int year) { ... }
}

🔗 Sigurno i Statičko Generisanje URL-ova iz MVC-a

Kroz C# Nikada ne bismo trebali kodirati URL-ove tvrdo ručno (kao <a href="/Ministry/Reports">) u Views-ima! Ako ikada promijenimo Route Tablicu u C# kodu ili prefix rute, svi HTML pregledi će "pući" na linkovima (404 Error).

Koristimo inteligentne View komande koje se referišu i crpe informacije iz Routing tabele dinamički!

@* Helper 1: U HTML Razor stranici kreiramo Anchor link na Bazi C# Klasa *@
@* Action="Details", Controller="Ministry", Params="{code='MF'}" *@
@* Renderira se u: <a href="/ministry/MF" class="btn">Detalji MF</a> *@
@Html.ActionLink("Detalji MF", "Details", "Ministry", new { code = "MF" }, new { @class="btn" })

@* Helper 2: Služi za generiranje samo Teksta unutar JavaScript funkcija *@
<button onclick="ucitajUrlAJaksa('@Url.Action("YearlyReport", "Reports", new { year = 2024 })')">
    Prikaži 2024
</button>

✅ Zaključak

  • ✅ Tradicionalni web folder prijava.aspx u MVC-u se transformiše u C# rutiranje Controller/Prijavi.
  • ✅ Sve "Konvencionalne" Rute centralno se nadziru iz App_Start/RouteConfig.cs sa "od vrha prema dnu" logikom usvajanja.
  • Attribute Routing nam pomaže u kreiranju modernih REST API URL stilova, definirajući adrese nad samom funkcijom akcije!
  • ✅ Uvijek koristite @Html.ActionLink ili @Url.Action da ne razbijete aplikaciju ukoliko promijenite konvencionalni ruting pravac jer će on dinamički rekonstruisati linkove bez ručnog prepisivanja teksta!