📖 Konfiguracija Ruta
Primjer definisanja i konfigurisanja ruta u RouteConfig klasi:
public class RouteConfig
{
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
// Ruta sa slug parametrom
routes.MapRoute(
name: "SlugRoute",
url: "blog/{slug}",
defaults: new { controller = "Blog", action = "Details" }
);
// Ruta sa više parametara
routes.MapRoute(
name: "CustomRoute",
url: "custom/{year}/{month}/{title}",
defaults: new { controller = "Custom", action = "Post" },
constraints: new { year = "\\d{4}", month = "\\d{1,2}" }
);
// Ruta sa ograničenjem (npr. samo četverocifrena godina)
routes.MapRoute(
name: "YearConstraint",
url: "archive/{year}",
defaults: new { controller = "Archive", action = "Year" },
constraints: new { year = "\\d{4}" }
);
// Ruta za 404 stranicu
routes.MapRoute(
name: "NotFound",
url: "404",
defaults: new { controller = "Error", action = "NotFound" }
);
// Podrazumijevana ruta
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
// Fallback ruta za sve ostalo (preusmjerava na Home/Index)
routes.MapRoute(
name: "FallbackToHome",
url: "{*url}",
defaults: new { controller = "Home", action = "Index" }
);
}
}
🎯 Kontroleri za Rute
Kontroleri koji se vežu za navedene rute iz RouteConfig:
public class ArchiveController : Controller
{
public ActionResult Year(int year)
{
return Content($"Arhiva za godinu: {year}");
}
}
// MVC primjer rute sa slug parametrom.
public class BlogController : Controller
{
public ActionResult Details(string slug)
{
return Content($"Blog objava: {slug}");
}
}
📖 Routes - Detaljna dokumentacija
Ovaj dokument opisuje MVC rute u projektu JavnaUpravaDemo i referencira konkretne kontrolere
koji ih implementiraju.
Gdje se rute definišu
- Sve MVC rute su u
App_Start/RouteConfig.cs. - Redoslijed ruta je važan: specifične rute idu prije podrazumijevane.
Aktivne rute i primjeri
Ruta sa slug parametrom
- Definicija:
blog/{slug} - Kontroler:
BlogController.Details(string slug) - Primjer URL-a:
/blog/uvod-u-rutiranje - Očekivani odgovor:
Blog objava: uvod-u-rutiranje
Ruta sa više parametara
- Definicija:
custom/{year}/{month}/{title} - Kontroler:
CustomController.Post(int year, int month, string title) - Ograničenja:
yearmora imati 4 cifre,month1–2 cifre. - Primjer URL-a:
/custom/2024/3/aspnet-routing - Očekivani odgovor:
Objava: aspnet-routing, Datum: 2024-3
Ruta sa ograničenjem (godina)
- Definicija:
archive/{year} - Kontroler:
ArchiveController.Year(int year) - Ograničenje:
yearmora imati 4 cifre (\d{4}). - Primjer URL-a:
/archive/2023 - Očekivani odgovor:
Arhiva za godinu: 2023
Podrazumijevana ruta
- Definicija:
{controller}/{action}/{id} - Kontroler:
HomeController - Primjer URL-a:
/home/index - Podrazumijevane vrijednosti:
controller=Home,action=Index.
404 ruta
- Definicija:
404 - Kontroler:
ErrorController.NotFound() - Primjer URL-a:
/404 - Svrha: ručno prikazivanje 404 stranice ili mapiranje preko
customErrorsuWeb.config.
Fallback ruta (catch-all)
- Definicija:
{*url} - Kontroler:
HomeController.Index() - Svrha: svaki URL koji ne odgovara nijednoj ruti preusmjerava na početnu stranicu.
- Napomena: ako želiš da nepostojeće rute vraćaju 404, ukloni ovu rutu i mapiraj 404
preko
customErrors.
🎯 Parametri i validacija
slugje tekstualni parametar bez eksplicitnog ograničenja.yearje ograničen na 4 cifre.monthje ograničen na 1–2 cifre.idu podrazumijevanoj ruti je opcionalan.
⚡ Application_Error i čišćenje odgovora
U Global.asax se koristi Application_Error da se centralno obradi 404 i
preusmjeri na /404.
Zašto Response.Clear()
- Briše sve što je već upisano u odgovor (buffer, zaglavlja i tijelo).
- Sprečava da parcijalni HTML ili prethodni output završe u finalnom odgovoru.
- Osigurava da redirect krene iz “čistog” odgovora bez konflikta sa postojećim sadržajem.
Zašto Server.ClearError()
- Uklanja izuzetku iz ASP.NET pipeline-a.
- Sprječava da ASP.NET/IIS nastavi sa svojim default error handling‑om.
- Omogućava da aplikacija preuzme kontrolu i prikaže vlastitu 404 stranicu.
Zašto Response.Clear() i mimo trenutne situacije
- Kada se radi redirect ili custom error view, najbolje je prvo očistiti sve što je već zapisano u odgovor.
- Time se izbjegavaju “mixed content” scenariji (djelimično renderovana stranica + redirect).
- Standardna praksa u globalnom error handling‑u da se postigne konzistentan output.
📚 Dodatna teorija o MVC rutiranju (ASP.NET MVC 5)
MVC routing u .NET Framework 4.7.2 koristi System.Web.Routing i statičku registraciju ruta u
RouteConfig.RegisterRoutes. Najvažniji principi:
Redoslijed ruta
- Rute se evaluiraju odozgo prema dolje.
- Prva ruta koja “match‑uje” URL zaustavlja dalju evaluaciju.
- Specifične rute moraju biti prije generičkih (
{controller}/{action}/{id}ili{*url}).
Segmenti i parametri
- Segment je dio URL‑a između
/(npr.blog/{slug}ima statični segmentblogi parametarslug). - Parametri mogu biti tipizirani u akciji (npr.
int year) i ASP.NET MVC pokušava konverziju. - Ako konverzija ne uspije, ruta se smatra nevažećom i traži se sljedeća.
Constraints
- Ograničenja (
constraints) filtriraju parametre regex‑om ili custom constraint klasom. - Ako constraint ne prođe, ruta se preskače i traži se sljedeća.
Podrazumijevane vrijednosti
defaultspopunjava parametre koji nisu u URL‑u.- Ako je
idopcionalan (UrlParameter.Optional), ruta može raditi i bezidsegmenta.
Catch‑all parametar
{*url}hvata cijeli ostatak URL‑a, uključujući/segmente.- Uvijek ga stavljati na kraj, jer “pojede” sve što slijedi.
Šta se dešava kad ništa ne odgovara
- Ako nijedna ruta ne match‑uje, MVC vraća 404.
Application_ErrorilicustomErrorsuWeb.configmogu preusmjeriti na custom 404 stranicu.
Razlika između “nepostojeće rute” i “nepostojeće akcije”
- Ruta može match‑ovati, ali akcija ne postoji (npr.
/blog/ovo-je-slug/2->BlogController.ovo-je-slug), što daje 404 “action not found”. - To nije isto kao “nema rute”; obje situacije obično završavaju kao 404, ali se dešavaju u različitim fazama pipeline‑a.
Integracija sa Web API
- MVC i Web API imaju odvojene rute (
RouteConfigiWebApiConfig). - Redoslijed registracije je bitan, ali MVC i Web API koriste različite route‑table‑ove.
Status kodovi i view‑ovi
ErrorController.NotFound()ručno postavljaResponse.StatusCode = 404i vraća view.- Ako se radi redirect, browser vidi status 302, a tek potom 404 iz
/404endpointa.
🛠️ Testiranje ruta
- U browseru ili Postman-u:
http://localhost:44322/blog/uvod-u-rutiranjehttp://localhost:44322/custom/2024/3/aspnet-routinghttp://localhost:44322/archive/2023http://localhost:44322/home/indexhttp://localhost:44322/404http://localhost:44322/nepostojeca-stranica
✨ Razlike u rutiranju u novijem .NET (npr. .NET 8 MVC)
U modernom ASP.NET Core (npr. .NET 8) routing je dio middleware pipeline‑a i razlikuje se od
System.Web.Routing u ASP.NET MVC 5:
Gdje se definišu rute
- ASP.NET MVC 5:
App_Start/RouteConfig.csiGlobal.asax. - ASP.NET Core:
Program.cs(minimal hosting), npr.app.MapControllerRoute(...).
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddControllersWithViews();
var app = builder.Build();
app.MapControllerRoute(
name: "default",
pattern: "{controller=Home}/{action=Index}/{id?}");
app.Run();
Endpoint routing
- ASP.NET Core koristi endpoint routing (jedinstveni sistem za MVC, Razor Pages, minimal APIs, gRPC, itd.).
- Rute se mapiraju na endpoint‑e koji se biraju u
UseRouting/UseEndpointspipeline‑u.
Attribute routing je prvo‑klasno
- U ASP.NET Core se češće koristi
[Route],[HttpGet],[HttpPost]na kontrolerima. - Konvencionalne rute (
MapControllerRoute) su i dalje podržane, ali se često kombinuju s atributima.
[Route("blog")]
public class BlogController : Controller
{
[HttpGet("{slug}")]
public IActionResult Details(string slug)
{
return Content($"Blog objava: {slug}");
}
}
404 handling
- U ASP.NET Core se 404 obično rješava kroz
UseStatusCodePagesiUseExceptionHandler. - Nema
Application_Error; umjesto toga koristi se middleware i globalni exception handler.
app.UseStatusCodePagesWithReExecute("/error/{0}");
app.MapControllerRoute(
name: "error",
pattern: "error/{statusCode}",
defaults: new { controller = "Error", action = "Status" });
app.MapFallbackToController("NotFound", "Error");
Konverzija i constraints
- Core koristi
IRouteConstrainti “route constraints” preko:int,:regex(...)u samom template‑u. - Primjer:
"archive/{year:int}"ili"custom/{year:int}/{month:int}".
app.MapControllerRoute(
name: "archive",
pattern: "archive/{year:int}");
app.MapControllerRoute(
name: "custom",
pattern: "custom/{year:int}/{month:int}/{title}");
Redoslijed i fallback
- I dalje važi pravilo da se rute evaluiraju po redoslijedu.
- Fallback endpoint (
MapFallbackToController) eksplicitno hvata sve što nije match‑ovano.
app.MapFallbackToController("Index", "Home");
Ključna razlika
ASP.NET MVC 5 je vezan za IIS i System.Web pipeline, dok je ASP.NET Core cross‑platform,
modularan i routing je dio middleware‑a, a ne Global.asax event‑a.