Modul 3 - Lekcija 1
Obrada korisničkih zahtjeva i Model Binding
⏱️ Trajanje: ~3 časa | 📚 Nivo: Srednji | 🎯 Praktični primjeri: 4
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.
public class HomeController : Controller
{
public ActionResult Index()
{
return View(); // Vraća 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");
}
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 });
}
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);
}
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 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.
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
}
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);
}
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);
}
}
U narednoj lekciji (3.2) upoznaćemo načine razmjene podataka od Controllera ka View interfejsu kroz ViewBag, ViewData i TempData rječnike.