MODUL 5 - LEKCIJA 1

Routing i Navigacija

RouteConfig, Attribute Routing, URL parametri i generisanje linkova

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

📖 Routing Arhitektura (Usmjeravanje)

U klasičnim aplikacijama (poput starih e-Uprava portala i PHP-a), URL obično direktno odgovara fizičkom fajlu na hard disku servera (npr. prijava.aspx). Routing (usmjeravanje) u ASP.NET MVC-u mijenja ovaj koncept: URL više nije eksplicitno vezan za fajl, već služi kao "komanda" koja se mapira na specifičnu C# klasu (Controller) i njenu funkcionalnu metodu (Action).

Routing mehanizam je prva tačka kontakta za svaki HTTP zahtjev u sklopu IIS-a (Internet Information Services). Ovaj sloj odvaja URL-ove od fizičkih foldera, omogućavajući nam stvaranje sigurnijih, čišćih i SEO naklonjenih adresa web resursa – npr. /Ministarstvo/Zaposleni/MF-123 umjesto zbunjujućih /zap.aspx?min=MF&id=123.

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

🛣️ RouteConfig.cs i Route Constraints (Ograničenja)

Registracija konvencionalnih ruta obavlja se u fajlu App_Start/RouteConfig.cs. Prilikom mapiranja svake rute, osim osnovnog uzorka URL-a, možemo definisati i pravila, poznata kao Constraints (Ograničenja rute).

Sigurnosna arhitektura javne uprave diktira da naša aplikacija reaguje samo na strogo validne podatke. Umjesto da puštamo `abc` znakove i rješavamo to unutar action metode, možemo reći ruti da "propušta" isključivo 13 tačnih cifara za JMBG zahtjev.

🛠️ Default Routing
public class RouteConfig
{
    public static void RegisterRoutes(RouteCollection routes)
    {
        // Ignoriši zahtjeve za fajlove koji se rješavaju direktno od ugrađenih .NET handlera
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

        // Specifična ruta: Pretraga zaposlenog samo sa tačno 13 cifara JMBG-a (Constraint)
        routes.MapRoute(
            name: "RadnikPrekoJMBG",
            url: "Zaposleni/Pretraga/{jmbg}",
            defaults: new { controller = "Employees", action = "Trazi" },
            constraints: new { jmbg = @"\d{13}" } // Regularni izraz za zaštitu URL-a
        );

        // Standardna defaultna pattern ruta
        // Format je Kontroler/Akcija/ID, pri čumu je ID opcioni (dozvoljava samo /Kontroler/Akcija)
        routes.MapRoute(
            name: "Default",
            url: "{controller}/{action}/{id}",
            defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
        );
    }
}

🎯 Attribute Routing

Attribute Routing omogućava definisanje ruta eksplicitno - direktno iznad controllera i njegove akcije umjesto u centralizovanom RouteConfig fajlu. Ovo olakšava čitanje koda jer odmah vizuelno vezujete funkcionalnost s njenim konačnim mrežnim URL-om.

Znatno je bolji sistem za dizajniranje REST API Endpointa u MVC-u.

🛠️ Attribute Routing
// Prvo moramo uključiti ovo unutar RouteConfig.cs klase na vrhu!
// routes.MapMvcAttributeRoutes();

[RoutePrefix("ministry")]
public class MinistryController : Controller 
{
    [Route("{code}")] // Postaje /ministry/{code} zbog RoutePrefix
    public ActionResult Details(string code)
    {
        // URL ispis: /ministry/MF
    }

    [Route("~/reports/{year:regex(\\d{4})}")] // Znak '~' overrajdira RoutePrefix!
    public ActionResult YearlyReport(int year)
    {
        // URL ispis: /reports/2024
        // Sigurnosna prepreka - Neće uopšte stići do metode /reports/abc, vratit će se standardni 404
    }
}

🔗 Sigurno (Statički-tipizirano) Generisanje URL-ova

Nikada ne bismo trebali kodirati URL-ove ručno (hardkodirati kao <a href="/Ministry/Reports">) u Views-ima! Ako ikada promijenimo Routing tablicu, sve poveznice će "pući" na klijentima.

ASP.NET nudi pametne HTML Helpere (Html.ActionLink) i Url Helpere (Url.Action) koji dinamički konstruišu tačan tekst koristeći pretragu Routing tabele iz memorije.

🛠️ Html.ActionLink i Url.Action
@* Dinamički kreira <a> element, proslijeđujući vrijednosti parametri routinga *@
@Html.ActionLink("Detalji MF", "Details", "Ministry", new { code = "MF" }, new { @class="btn btn-primary" })

@* Formira samo tekstualni URL (dobro za JavaScript / AJAX rute) *@
<button onclick="ucitajIzvjestaj('@Url.Action("YearlyReport", "Reports", new { year = 2024 })')">
    Prikaži 2024
</button>

✅ Zaključak

Razumijevanje MVC Routing cjevovoda presudno je za arhitektiranje sigurnih rješenja na nivou weba. Efikasna upotraba Route Constraints-a drastično štiti naš domen (Domain Model) osiguravajući da sumnjivi web zahtjevi padnu prije ulaska u biznis logiku metode (Controller-a).