Modul 5 - Lekcija 1
RouteConfig, Attribute Routing, URL parametri i generisanje linkova
⏱️ Trajanje: ~3 časa | 📚 Nivo: Srednji | 🎯 Praktični primjeri: 5
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).
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.
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.
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 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) { ... }
}
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>
prijava.aspx u MVC-u se transformiše u C# rutiranje
Controller/Prijavi.App_Start/RouteConfig.cs sa "od
vrha prema dnu" logikom usvajanja.@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!