Untuk apa ModelState.IsValid valid dalam ASP.NET MVC di NerdDinner?

148

Pada contoh NerdDinner dari Professional ASP.NET MVC 1.0 ada metode untuk membuat makan malam baru seperti disalin di bawah ini (halaman 89 dari versi NerdDinner gratis).

Di sana ia memeriksa ModelState.IsValid benar. Tampaknya untuk memeriksa apakah model itu valid untuk database (yaitu, ia menangkap konversi tipe data, seperti tanggal dengan format yang tidak valid, tetapi bukan aturan bisnis). Benarkah itu?

Saat mengirimkan formulir, jika Anda memiliki kesalahan dalam tanggal, ModelState.IsValid akan salah dan Anda akan mendapatkan kembali kesalahan, tetapi hanya untuk tanggal karena AddRuleViolations tidak pernah dieksekusi. Jika Anda menghapus centang untuk ModelState.IsValid sepenuhnya, maka Anda akan mendapatkan semua kesalahan (karena pengecualian), termasuk menandai pada tanggal ketika itu tidak valid. Lalu, mengapa cek untuk ModelState.IsValid ada sama sekali? Apakah saya melewatkan sesuatu?

// 
// POST: /Dinners/Create 

[AcceptVerbs(HttpVerbs.Post)] 
public ActionResult Create(Dinner dinner) {
    if (ModelState.IsValid) {
        try {
            dinner.HostedBy = "SomeUser"; 

            dinnerRepository.Add(dinner);
            dinnerRepository.Save();

            return RedirectToAction("Details", new {id = dinner.DinnerID }); 
        } catch {
            ModelState.AddRuleViolations(dinner.GetRuleViolations());
        } 
    } 
    return View(dinner); 
} 
pupeno
sumber

Jawaban:

143

ModelState.IsValidmemberi tahu Anda jika ada kesalahan model yang ditambahkan ModelState.

Pengikat model default akan menambahkan beberapa kesalahan untuk masalah konversi tipe dasar (misalnya, meneruskan non-angka untuk sesuatu yang merupakan "int"). Anda dapat mengisi ModelState lebih penuh berdasarkan sistem validasi apa pun yang Anda gunakan.

DataAnnotationsPengikat model sampel akan mengisi status model dengan kesalahan validasi yang diambil dari DataAnnotationsatribut pada model Anda.

Brad Wilson
sumber
Brad apakah ada cara untuk mengetahui apakah Model yang didekorasi dengan DataAnnotations "IsValid" tanpa ModelState. (Katakan misalnya Objek dimuat dari file atau digunakan dalam Aplikasi Konsol dll.)
runxc1 Bret Ferrier
1
Tidak, ModelState.IsValid adalah satu-satunya cara untuk mengetahui apakah ada kesalahan validasi (atau konversi data) selama pengikatan model.
Brad Wilson
@Brad, ketika Anda mengatakan "Anda dapat mengisi ModelState lebih penuh berdasarkan sistem validasi apa pun yang Anda gunakan", bagaimana hal itu dapat dicapai? Apakah ada cara untuk membuka-buka kode validasi ModelState untuk ViewModel saya? Saya menggunakan EF4, jadi sebagian besar validasi saya otomatis out-of-the-box.
WEFX
13
Gunakan: var errors = ModelState.Values.SelectMany(v => v.Errors);dengan titik istirahat untuk melihat masalah validasi apa pun.
full_prog_full
Kadang-kadang ini merupakan kesalahan dalam tabel terkait jika nama properti telah diubah, migrasi belum dilakukan dan akibatnya SaveChanges (); gagal dan tidak dapat terjadi karena perubahan.
Manusia Orokasional
25

Dari Errata: ModelState.AddRuleViolations(dinner.GetRuleViolations());

Seharusnya:

ModelState.AddModelErrors(dinner.GetRuleViolations());

Referensi: http://www.wrox.com/WileyCDA/WroxTitle/Professional-ASP-NET-MVC-1-0.productCd-0470384611 , descCd- ERRATA.html

Kelly Orr
sumber
5
Pada 2015 AddModelErrorsmetode ini tidak ada.
Felipe Correa
6
Pada 2016, ModelState.AddModelErrors()metode ini ada
John
7
Pada 2017, metode non-jamak ModelState.AddModelErrorada.
Zachafer
0

Ya, Jared dan Kelly Orr benar. Saya menggunakan kode berikut seperti dalam pengecualian edit.

foreach (var issue in dinner.GetRuleViolations())
{
    ModelState.AddModelError(issue.PropertyName, issue.ErrorMessage);
}

dari pada

ModelState.AddRuleViolations(dinner.GetRuleViolations());
Phoe Htoo
sumber
0

Semua bidang model yang memiliki tipe pasti, yang harus divalidasi ketika dikembalikan ke Controller. Jika salah satu bidang model tidak cocok dengan tipe yang ditentukan, maka ModelState.IsValid akan mengembalikan false. Karena, kesalahan ini akan ditambahkan di ModelState.

B. Khan
sumber