Action Metode i ActionResult Tipovi

Modul 3 - Lekcija 1

Obrada korisničkih zahtjeva i Model Binding

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

📖 Šta su Action Metode?

Action metode su javne metode u Controller klasama koje obrađuju HTTP zahtjeve. Svaka action metoda vraća ActionResult koji određuje kako će MVC odgovoriti na zahtjev.

🛠️ Osnovna Action Metoda

public class HomeController : Controller
{
    public ActionResult Index()
    {
        return View(); // Vraća ViewResult
    }
}

🎯 ActionResult Tipovi: ViewResult

ViewResult je najčešći tip odgovora. Zadužen je za prikazivanje View-a (HTML šablona).

public ActionResult Index()
{
    // Koristi konvenciju: Views/{ControllerName}/Index.cshtml
    return View(); 
}

public ActionResult Details(int id)
{
    var model = GetMinistry(id);
    return View(model); // Prosljeđuje DB model u view
}

public ActionResult Dashboard()
{
    // Eksplicitno određuje koje ime view-a treba renderovati
    return View("ExecutiveSummary"); 
}

🎯 ActionResult Tipovi: RedirectResult

RedirectResult se koristi kada želimo klijenta (browser) preusmjeriti na drugu lokaciju (HTTP Status 302/301).

// Preusmjeravanje nakon uspješne prijave
public ActionResult AfterLogin()
{
    // Redirekcija na metodu 'Index' u kontroleru 'Dashboard'
    return RedirectToAction("Index", "Dashboard");
}

// Preusmjeravanje sa parametrima uključujući querystring
public ActionResult AfterCreate(int id)
{
    return RedirectToAction("Details", "Ministry", new { id = id });
}

🎯 ActionResult Tipovi: JsonResult

JsonResult je izuzetno važan za AJAX pozive u SPA ili složenim web aplikacijama kreirajući JSON odgovore.

public JsonResult GetDepartments()
{
    var depts = db.Departments.ToList();
    return Json(depts, JsonRequestBehavior.AllowGet);
}

// Za AJAX autocomplete pretragu
public JsonResult SearchMinistry(string code)
{
    var results = db.Departments
        .Where(d => d.DepartmentCode.Contains(code))
        // Anonymous obj da ne vraćamo i navigacijske properties u JSON-u
        .Select(d => new { d.DepartmentID, d.DepartmentName, d.Budget }) 
        .ToList();
        
    return Json(results, JsonRequestBehavior.AllowGet);
}

🎯 ActionResult Tipovi: ContentResult i FileResult

Moguće je vratiti sirovi tekst sa ContentResult ili file stream pomoću FileResult (idealno za PDF izvještaje).

// Vraćanje fajla klijentu - tipičan download
public FileResult DownloadReport()
{
    byte[] fileBytes = GetReportBytes(); // Db fetch byte[]
    return File(fileBytes, "application/pdf", "Izvjestaj.pdf");
}

// Vraćanje custom XML formata portalu
public ContentResult XmlExport()
{
    return Content("<Ministry><Name>Finansije</Name></Ministry>", "text/xml");
}

🔗 Model Binding i Pipeline

Model Binding automatski mapira podatke iz HTTP zahtjeva (form, query string, route) na parametre action metode.

U sistemima sa mnogo parametara, MVC koristi DefaultModelBinder i ValueProviders za automatsko kreiranje C# objekata.

💡 Redoslijed Pretraživanja (Value Providers)

  1. Form Data (POST parametri)
  2. Route Data (Parametri u ruti, npr. /Employee/Edit/{id})
  3. Query String (URL atributi, npr. ?id=5)
  4. Fajlovi (Upload docs)
MVC Model Binding Flow

🛠️ Model Binding: Primitivni Tipovi

Parametri rute ili query string-a automatski se mapiraju na integer parametre ili stringove.

// 1. Podaci iz Route Data
// URL: /Ministry/Details/5
public ActionResult Details(int id) // id = 5

// 2. Podaci iz Query String-a
// URL: /Ministry/Search?code=MF&year=2023
public ActionResult Search(string code, int year)
{
    // code = "MF", year = 2023
}

// 3. Podaci iz Form Data (HTTP POST)
[HttpPost]
public ActionResult Create(string departmentName, decimal budget)
{
    // Automatsko mapiranje proslijeđenih form-data na argumente
}

🏢 Binding Kompleksnih Objekata

Aplikacije moderne uprave u pozadini mapiraju ugniježđene strukture. MVC to hendla preko C# klasa automatski prepoznavajući ključeve obrasca i imena propertyja u klasi.

[HttpPost]
public ActionResult Create(Department dept)
{
    // MVC automatski mapira form/JSON property-je na Department svojstva.
    // Ako klijent pošalje form sa input named "DepartmentName" = "MUP", 
    // on će prije prolaska kroz kontroler pozvati:
    // dept.DepartmentName = "MUP";
    
    if (ModelState.IsValid)
    {
        db.Departments.Add(dept);
        db.SaveChanges();
        return RedirectToAction("Index");
    }
    // Vraćanje korisnika na formu uz grešku
    return View(dept);
}

🎯 Praktična Vježba

Zadatak: Kreirajte Action Metode za Ministarstva

Kreirajte MinistryController sa action metodama za prikaz svih ministarstava i JSON pretragu po kodu.

public class MinistryController : Controller
{
    public ActionResult Index()
    {
        var ministries = db.Departments.ToList();
        return View(ministries); // Proslijeđivanje modela za render
    }
    
    public JsonResult Search(string code)
    {
        var results = db.Departments
            .Where(d => d.DepartmentCode.Contains(code))
            .ToList();
        return Json(results, JsonRequestBehavior.AllowGet);
    }
}

✅ Zaključak

  • ✅ Action metoda je svaka javna metoda u Controlleru koja vraća ActionResult odgovore.
  • ✅ Poznati ActionResult tipovi: ViewResult (HTML), RedirectResult, JsonResult (podaci), FileResult (stream).
  • Model Binding drastično smanjuje potrebu za ručnim Request.Form["val"] kodiranje.
  • ✅ Binder prvo provjerava Form, onda Routing params, onda Query params i mapira na primitivne ili klasne tipove.

📚 Sljedeća Lekcija

U narednoj lekciji (3.2) upoznaćemo načine razmjene podataka od Controllera ka View interfejsu kroz ViewBag, ViewData i TempData rječnike.