📖 Šta je ModelState?
ModelState je ugrađeni ASP.NET MVC rječnik (Dictionary) koji ima dvije ključne uloge:
- Sadržavanje i praćenje vrijednosti poslanih sa klijenta (omogućava "pamćenje" unosa prilikom neuspješnog popunjavanja forme).
- Pohranjivanje grešaka (Errors) vezanih za validaciju svakog od tih polja.
[HttpPost]
public ActionResult KreirajRjesenje(RjesenjeVM model)
{
// Provjera JMBG logike KROZ BAZU (Serverska validacija)
if (db.Zaposleni.Any(z => z.JMBG == model.JMBG))
{
// Ručno dodavanje greške za specifično polje
ModelState.AddModelError("JMBG", "Zaposlenik sa ovim JMBG već postoji u bazi!");
}
// Dodavanje globalne greške (prazan string kao ključ polja)
if (model.DatumPocetka < DateTime.Now.Date)
{
ModelState.AddModelError("", "Nije moguće retroaktivno zapošljavanje bez sudske presude.");
}
// Provjera da li su svi DataAnnotations atributi + ručne greške validni
if (ModelState.IsValid)
{
// Spasi u bazu...
return RedirectToAction("Index");
}
// Vrati nazad na view S ISTIM podacima i porukama
return View(model);
}
⚖️ Klijentska vs Serverska Validacija
Ključni Koncept
Klijentska validacija postoji zbog brzog odziva korisniku, a serverska validacija zbog apsolutne sigurnosti aplikacije!
| Klijentska Validacija (Browser) | Serverska Validacija (.NET) |
|---|---|
| Izvršava se trenutno putem JavaScripta. Nema reload-a stranice. | Zahtijeva povratno putovanje do servera (HTTP Request). |
| Obezbjeđuje odlično korisničko iskustvo (UX) i štedi resurse servera. | Garantuje integritet podataka. Klijent može zaobići JS na klik dugmeta! |
Ne može provjeriti bazu (npr. da li JMBG već postoji), osim ako se ne koristi
[Remote] atribut. |
Ima puni pristup bazi, API-jima i poslovnoj logici (Business Logic). |
| OBAVEZNO KORISTITI OBJE U JAVNOJ UPRAVI! MVC Vam omogućava obje odjednom iz istih atributa! | |
🛠️ jQuery Unobtrusive JavaScript
ASP.NET MVC koristi koncept "nenametljivog" (Unobtrusive) JavaScripta. Umjesto da upisuje teške JS
funkcije direktno u HTML, MVC generiše HTML5 data-val-* atribute iz vaših
DataAnnotations atributa.
Zatim, mala biblioteka čita te atribute i pretvara ih u aktivnu provjeru klijenta.
@Html.TextBoxFor(m => m.DepartmentCode, new { @class = "form-control" })
Da bi ovo radilo, moraju biti uključene skripte pri dnu Layout-a ili na samo dnu forme:
✅ ValidationMessageFor
Metoda koja služi da ispiše jednu konkretnu grešku za pojedinačno polje ispod samog inputa.
@Html.LabelFor(m => m.DepartmentCode, new { @class = "form-label" })
@Html.TextBoxFor(m => m.DepartmentCode, new { @class = "form-control" })
@Html.ValidationMessageFor(m => m.DepartmentCode, "", new { @class = "text-danger field-validation-valid" })
📋 ValidationSummary
Služi za sumarni prikaz svih grešaka na vrhu forme. Idealan za poslovna pravila koja nisu direktno vezana samo za jedan "input box" (npr. greška pri pokušaju čuvanja u bazu podataka).
@Html.ValidationSummary(true, "Operacija nije uspjela. Molimo provjerite sljedeće:", new { @class = "alert alert-danger" })
@Html.ValidationSummary(false, "", new { @class = "alert alert-danger" })
✅ Zaključak
ModelState nadzire stanje podignutih ViewModel klasa, dok ValidationMessageFor i Unobtrusive
JavaScript osiguravaju modernu i responzivnu formu s kojom korisnici komuniciraju efikasno.