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.

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.


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


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();

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))
    {

    }

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.

  }

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.


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.


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.


1
Ini terjadi pada saya. Terima kasih atas tipnya!
Lewis86
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.