MODUL 3 - LEKCIJA 1

Action Metode i ActionResult Tipovi

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

1. ViewResult - Prikaz View-a

🛠️ ViewResult
public ActionResult Index()
{
    return View(); // Koristi konvenciju: Views/Ministry/Index.cshtml
}

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

public ActionResult Dashboard()
{
    return View("ExecutiveSummary"); // Eksplicitno ime view-a
}

2. RedirectResult - Preusmjeravanje

🛠️ Redirect Metode
// Preusmjeravanje nakon prijave
public ActionResult AfterLogin()
{
    return RedirectToAction("Index", "Dashboard");
}

// Preusmjeravanje sa parametrima
public ActionResult AfterCreate(int id)
{
    return RedirectToAction("Details", "Ministry", new { id = id });
}

3. JsonResult - JSON Odgovor

public JsonResult GetDepartments() { var depts = db.Departments.ToList(); return Json(depts, JsonRequestBehavior.AllowGet); } // Za AJAX pretragu public JsonResult SearchMinistry(string code) { var results = db.Departments .Where(d => d.DepartmentCode.Contains(code)) .Select(d => new { d.DepartmentID, d.DepartmentName, d.Budget }) .ToList(); return Json(results, JsonRequestBehavior.AllowGet); }

4. ContentResult - Tekstualni Odgovor

🛠️ Content Response
public FileResult DownloadReport()
{
    byte[] fileBytes = GetReportBytes();
    return File(fileBytes, "application/pdf", "Izvjestaj.pdf");
}

public ContentResult XmlExport()
{
    return Content("Finansije", "text/xml");
}

🔗 Model Binding i Njegov Cjevovod

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

U sistemima kao što su portali e-Uprave, HTTP zahtjevi su često kompleksni (imaju velika tijela i mnoštvo parametara). MVC koristi DefaultModelBinder i ValueProviders kako bi automatski pronašao i kreirao C# objekte za vas.

MVC Model Binding Flow

Slika: Cjevovod (Pipeline) ASP.NET MVC Model Binding-a

Redoslijed Pretraživanja Podataka (Value Providers)

Kada traži vrijednost za parametar (npr. int id), Model Binder usput pokreće razne ValueProvidere i pretražuje lokacije ovim prioritetnim redom:

  1. Form Data (POST parametri poslani formom/HTML-om)
  2. Route Data (Parametri unutar URL rute definirane u RouteConfig, npr. /Employee/Edit/{id})
  3. Query String (URL parametri, Npr. ?id=5)
  4. Fajlovi (Uploadovani dokumenti)

Primitivni Tipovi

🛠️ Model Binding Primjeri
// URL: /Ministry/Details/5
public ActionResult Details(int id) // id = 5

// URL: /Ministry/Search?code=MF&year=2023
public ActionResult Search(string code, int year)
{
    // code = "MF", year = 2023
}

// Form POST
[HttpPost]
public ActionResult Create(string departmentName, decimal budget)
{
    // Automatsko mapiranje iz forme
}

Kompleksni Objekti i JSON Datoteke

Aplikacije moderne uprave u pozadini često mapiraju kompleksne, ugniježđene JSON objekte jer frontend komunicira asinhrono sa MVC kontrolerima (AJAX). MVC to hendla automatski putem JsonValueProviderFactory.

🛠️ Binding Kompleksnih Objekata
[HttpPost]
public ActionResult Create(Department dept)
{
    // MVC automatski mapira form/JSON property-je na Department svojstva
    // Ako klijent pošalje "DepartmentName": "MUP", on će automatski uraditi:
    // dept.DepartmentName = "MUP";
    
    if (ModelState.IsValid)
    {
        db.Departments.Add(dept);
        db.SaveChanges();
        return RedirectToAction("Index");
    }
    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.

💡 Rješenje
public class MinistryController : Controller
{
    public ActionResult Index()
    {
        var ministries = db.Departments.ToList();
        return View(ministries);
    }
    
    public JsonResult Search(string code)
    {
        var results = db.Departments
            .Where(d => d.DepartmentCode.Contains(code))
            .ToList();
        return Json(results, JsonRequestBehavior.AllowGet);
    }
}

✅ Zaključak

Naučili ste: