ModelState.IsValid == false, mengapa?

120

Di mana saya dapat menemukan daftar kesalahan yang membuat ModelState tidak valid? Saya tidak melihat properti kesalahan apa pun pada objek ModelState.

Omu
sumber

Jawaban:

45

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.

ratu3
sumber
menurut saya seharusnya tidak, apakah ada yang salah di Values.All (modelState => modelState.Errors.Count == 0)?
Omu
Perhatikan bahwa kesalahan bisa berupa Pesan atau Pengecualian; misalnya Html.ValidationSummary tidak menampilkan pengecualian (saya rasa untuk alasan keamanan); mungkin itu sebabnya Anda tidak melihat kesalahan? Bagaimana Anda memeriksa tidak ada kesalahan?
ratu3
1
ModelState.IsValid memberikan false
Omu
Ha-ha, itu jelas ... bagaimana Anda memeriksa "nilai memiliki 0 kesalahan"?
ratu3
258

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.

modelstate

bastijn
sumber
3
mungkinkah semua nilai memiliki 0 kesalahan dan modelstate masih tidak valid?
Omu
seperti dikatakan di atas, tidak, ini tidak mungkin :). Di suatu tempat pasti ada kesalahan hitungan! = 0.
bastijn
2
Sebagai tambahan, jika ErrorMessage ambigu bagi Anda, Anda dapat membuka kunci dan itu akan menunjukkan kepada Anda variabel mana yang dirujuknya.
Luminous
1
di View Anda, lakukan: @ Html.HiddenFor (model => model.Username) akan menyelesaikan masalah!
Umit Kaya
1
var asdf = ModelState.Values.Where(v => v.Errors.Count > 0);dapat membantu Anda
Cirelli94
37

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();
Krishna
sumber
3
Jawaban terbaik di sini, harus dinilai lebih tinggi. Mengapa menghabiskan waktu saya menggali melalui 5 lapisan objek ModelState di debugger ketika saya bisa mendapatkan kesalahan darinya. Saya akan berada di sana sepanjang pagi jika saya mengikuti jawaban berperingkat tertinggi
Sean T
2
ini yang terbaik
mainan
23
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))
    {

    }
Michael G
sumber
mungkinkah semua nilai memiliki 0 kesalahan dan modelstate masih tidak valid?
Omu
1
Modelstate akan memiliki kunci "Properti" dan kesalahan terkait dalam kamus. pesan kesalahan mungkin kosong, tetapi jumlah kesalahan akan mencerminkan jumlah properti yang tidak valid. Karena metode ModelStateDictionary.AddModelError mengambil kunci, dan Exception atau error String; itu diperlukan untuk menambahkan kesalahan model.
Michael G
13

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.

  }
Jonas Stensved
sumber
1
Kode ini sangat membantu saya, tetapi mengulangi kesalahan (Pengecualian) untuk mendapatkan masing-masing. Pesan menghasilkan "referensi objek tidak disetel ke turunan objek". Saat saya mengubah z.Exception menjadi z.ErrorMessage saya bisa menampilkan pesan kesalahan.
StackOverflowUser
Ini adalah solusi bagi saya, mengubah ke z.ErrorMessage, meskipun saya tidak mendapatkan kesalahan dengan z.Exception, hanya nilai null. Mungkin layak untuk memperbarui jawaban asli.
khususnya
5

Jika Anda menghapus centang untuk ModelsState.IsValid dan membiarkannya error, jika Anda menyalin baris ini ((System.Data.Entity.Validation.DbEntityValidationException)$exception).EntityValidationErrorsdan menempelkannya di bagian arloji di Visual Studio, itu akan memberi Anda persis apa kesalahannya. Menghemat banyak waktu untuk memeriksa letak kesalahan.

Tom McDonough
sumber
1
Tip yang sangat membantu.
Ash
Ini adalah saran terbaik di utas ini. Masalah yang saya miliki adalah "." (titik) di UserName
mangia
3

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.

tvanfosson.dll
sumber
3

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.

AndyP9
sumber
1
Ini terjadi pada saya. Terima kasih atas tipnya!
Lewis86