MODUL 6 - LEKCIJA 2

Prikazivanje Validacijskih Poruka

ModelState Rječnik, Client-side vs Server-side validacija, i jQuery Unobtrusive Validacija

⏱️ Trajanje: ~2.5 časa 📚 Nivo: Srednji 🎯 Praktični primjeri: 5

📖 Šta je ModelState?

ModelState je ugrađeni ASP.NET MVC rječnik (Dictionary) koji ima dvije ključne uloge:

  1. Sadržavanje i praćenje vrijednosti poslanih sa klijenta (omogućava "pamćenje" unosa prilikom neuspješnog popunjavanja forme).
  2. Pohranjivanje grešaka (Errors) vezanih za validaciju svakog od tih polja.
🛠️ ModelState u Kontroleru
[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.

🛠️ Šta MVC stvarno napravi u pregledniku?

@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).

🛠️ Prikaz Globalnih Grešaka (Alert Box)


@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.