Jawaban:
Tentang "mungkinkah 0 kesalahan dan IsValid == false": inilah kode sumber MVC dari https://github.com/Microsoft/referencesource/blob/master/System.Web/ModelBinding/ModelStateDictionary.cs#L37-L41
public bool IsValid {
get {
return Values.All(modelState => modelState.Errors.Count == 0);
}
}
Sekarang, sepertinya tidak mungkin. Nah, itu untuk ASP.NET MVC v1.
Karena Anda mungkin memprogram di Visual studio, sebaiknya Anda memanfaatkan kemungkinan menggunakan breakpoint untuk langkah-langkah debugging yang mudah (mendapatkan gambaran apa masalahnya seperti dalam kasus Anda). Letakkan saja di depan / di tempat Anda memeriksa ModelState.isValid dan arahkan kursor ke ModelState. Sekarang Anda dapat dengan mudah menelusuri semua nilai di dalamnya dan melihat kesalahan apa yang menyebabkan pengembalian salah.
var asdf = ModelState.Values.Where(v => v.Errors.Count > 0);
dapat membantu Anda
Tempel kode di bawah ini di ActionResult pengontrol Anda dan tempatkan debugger pada titik ini.
var errors = ModelState
.Where(x => x.Value.Errors.Count > 0)
.Select(x => new { x.Key, x.Value.Errors })
.ToArray();
bool hasErrors = ViewData.ModelState.Values.Any(x => x.Errors.Count > 1);
atau iterasi dengan
foreach (ModelState state in ViewData.ModelState.Values.Where(x => x.Errors.Count > 0))
{
}
Terkadang pengikat melontarkan pengecualian tanpa pesan kesalahan. Anda dapat mengambil pengecualian dengan cuplikan berikut untuk mencari tahu apa yang salah:
(Seringkali jika pengikat mencoba mengubah string menjadi tipe kompleks, dll.)
if (!ModelState.IsValid)
{
var errors = ModelState.SelectMany(x => x.Value.Errors.Select(z => z.Exception));
// Breakpoint, Log or examine the list with Exceptions.
}
Jika Anda menghapus centang untuk ModelsState.IsValid dan membiarkannya error, jika Anda menyalin baris ini ((System.Data.Entity.Validation.DbEntityValidationException)$exception).EntityValidationErrors
dan menempelkannya di bagian arloji di Visual Studio, itu akan memberi Anda persis apa kesalahannya. Menghemat banyak waktu untuk memeriksa letak kesalahan.
Properti ModelState pada pengontrol sebenarnya adalah objek ModelStateDictionary. Anda dapat melakukan iterasi melalui kunci di kamus dan menggunakan metode IsValidField untuk memeriksa apakah bidang tertentu itu valid.
Seperti yang baru saja terjadi pada saya - ini juga dapat terjadi saat Anda menambahkan properti yang diperlukan ke model Anda tanpa memperbarui formulir Anda. Dalam hal ini ValidationSummary tidak akan mencantumkan pesan kesalahan.