MODUL 8 - LEKCIJA 3

Routing Konfiguracija

Detaljna dokumentacija i uputstva za MVC rute

⏱️ Trajanje: ~4 časa 📚 Nivo: Napredni 🎯 Praktični primjeri: 10+

📖 Konfiguracija Ruta

Primjer definisanja i konfigurisanja ruta u RouteConfig klasi:

🛠️ RouteConfig.cs
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:

🛠️ Kontroleri (Primjeri)
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

Aktivne rute i primjeri

Ruta sa slug parametrom

Ruta sa više parametara

Ruta sa ograničenjem (godina)

Podrazumijevana ruta

404 ruta

Fallback ruta (catch-all)

🎯 Parametri i validacija

⚡ 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()

Zašto Server.ClearError()

Zašto Response.Clear() i mimo trenutne situacije

📚 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

Segmenti i parametri

Constraints

Podrazumijevane vrijednosti

Catch‑all parametar

Šta se dešava kad ništa ne odgovara

Razlika između “nepostojeće rute” i “nepostojeće akcije”

Integracija sa Web API

Status kodovi i view‑ovi

🛠️ Testiranje ruta

✨ 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

🛠️ Program.cs (Core)
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

Attribute routing je prvo‑klasno

🛠️ Core Controllers Routing
[Route("blog")]
public class BlogController : Controller
{
    [HttpGet("{slug}")]
    public IActionResult Details(string slug)
    {
        return Content($"Blog objava: {slug}");
    }
}

404 handling

🛠️ Core 404 Handling
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 Constraints
app.MapControllerRoute(
    name: "archive",
    pattern: "archive/{year:int}");

app.MapControllerRoute(
    name: "custom",
    pattern: "custom/{year:int}/{month:int}/{title}");

Redoslijed i fallback

🛠️ Core Fallback
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.