ModelState.IsValid == false, neden?


120

ModelState'i geçersiz kılan hataların listesini nerede bulabilirim? ModelState nesnesinde herhangi bir error özelliği görmedim.

Yanıtlar:


45

"0 hata ve IsValid == false olabilir mi" hakkında: https://github.com/Microsoft/referencesource/blob/master/System.Web/ModelBinding/ModelStateDictionary.cs#L37-L41 adresinden MVC kaynak kodu burada.

public bool IsValid {
    get {
        return Values.All(modelState => modelState.Errors.Count == 0);
    }
}

Şimdi, olamaz gibi görünüyor. Eh, bu ASP.NET MVC v1 için.


bana öyle olmamalı, Values.All'de yanlış bir şey mi var (modelState => modelState.Errors.Count == 0)?
Omu

Hatanın Mesaj veya İstisna olabileceğine dikkat edin; örneğin Html.ValidationSummary istisnaları göstermez (sanırım güvenlik nedenleriyle); belki de bu yüzden hata görmüyorsunuz? Hata olup olmadığını nasıl kontrol edersiniz?
kraliçe3

1
ModelState.IsValid yanlış verir
Omu

Ha-ha, bu çok açık ... "Değerlerde 0 hata var" ı nasıl kontrol edersiniz?
kraliçe3

258

Muhtemelen Visual Studio'da programlama yaptığınız için, bu kadar kolay hata ayıklama adımları için kesme noktaları kullanma olasılığından yararlanmanız daha iyi olur (sizin durumunuzda olduğu gibi sorunun ne olduğu hakkında bir fikir edinme). Bunları sadece öne / ModelState.isValid'i kontrol ettiğiniz yere yerleştirin ve ModelState'in üzerine gelin. Artık içindeki tüm değerlere kolayca göz atabilir ve hangi hatanın geçersiz dönüş yanlışına neden olduğunu görebilirsiniz.

ModelState


3
tüm değerlerin 0 hataya sahip olması ve model durumunun hala geçersiz olması mümkün olabilir mi?
Omu

yukarıda da belirtildiği gibi, bu mümkün değil :). Bir yerde bir Hata sayısı olmalı! = 0.
bastijn

2
Ek olarak, ErrorMessage sizin için belirsiz ise, tuşlara gidebilirsiniz ve size hangi değişkenden bahsettiğini gösterecektir.
Aydınlık

1
Görünümünüzde şunu yapın: @ Html.HiddenFor (model => model.Username) sorunu çözecektir!
Ümit Kaya

1
var asdf = ModelState.Values.Where(v => v.Errors.Count > 0);size yardımcı olabilir
Cirelli94

37

Aşağıdaki kodu denetleyicinizin ActionResult'una yapıştırın ve hata ayıklayıcıyı bu noktaya yerleştirin.

var errors = ModelState
    .Where(x => x.Value.Errors.Count > 0)
    .Select(x => new { x.Key, x.Value.Errors })
    .ToArray();

3
Buradaki en iyi cevap, daha yüksek derecelendirilmelidir. Neden zamanımı hata ayıklayıcıdaki ModelState nesnesinin 5 katmanını kazarak harcayayım, ben de hataları ondan çıkarabiliyorum. En yüksek puan alan yanıtı
Sean T

2
bu şimdiye kadarki en iyisi
oyuncak

23
bool hasErrors =  ViewData.ModelState.Values.Any(x => x.Errors.Count > 1);

veya ile yineleyin

    foreach (ModelState state in ViewData.ModelState.Values.Where(x => x.Errors.Count > 0))
    {

    }

tüm değerlerin 0 hataya sahip olması ve model durumunun hala geçersiz olması mümkün olabilir mi?
Omu

1
Model durumu, bir "Özellik" anahtarına ve sözlükte bununla ilişkili bir hataya sahip olacaktır. hata mesajı boş olabilir, ancak hata sayısı geçersiz olan özellik sayısını yansıtacaktır. ModelStateDictionary.AddModelError yöntemi bir anahtar ve Exception veya error String aldığından; bir model hatası eklemek gerekiyor.
Michael G

13

Bazen bir ciltleyici hata mesajı olmadan bir istisna atar. Neyin yanlış olduğunu bulmak için aşağıdaki kod parçacığı ile istisnayı alabilirsiniz:

(Genellikle ciltleyici dizeleri karmaşık türlere dönüştürmeye çalışıyorsa vb.)

 if (!ModelState.IsValid)
            {
var errors = ModelState.SelectMany(x => x.Value.Errors.Select(z => z.Exception));

// Breakpoint, Log or examine the list with Exceptions.

  }

1
Bu kod bana çok yardımcı oldu, ancak her bir .Mesajı almak için hataları (İstisnalar) yinelemek "nesne başvurusu bir nesnenin örneğine ayarlanmadı" ile sonuçlandı. Z.Exception'ı z.ErrorMessage olarak değiştirdiğimde hata mesajlarını görüntüleyebildim.
StackOverflowUser

Bu benim için çözümdü, z.ErrorMessage'a geçerek, z.Exception ile ilgili bir hata almadım, sadece boş değerler. Muhtemelen orijinal cevabı güncellemeye değer.
esp

5

ModelsState.IsValid kontrolünü kaldırırsanız ve hata yaparsanız, bu satırı ((System.Data.Entity.Validation.DbEntityValidationException)$exception).EntityValidationErrorskopyalayıp Visual Studio'daki izleme bölümüne yapıştırırsanız, hatanın tam olarak ne olduğunu size verecektir. Hatanın nerede olduğunu kontrol etmek için çok zaman kazandırır.


1
Gerçekten yararlı bir ipucu.
Ash

Bu, bu konudaki en iyi tavsiye. Yaşadığım sorun aptalca bir "." (nokta) UserName
mangia

3

Denetleyicideki ModelState özelliği aslında bir ModelStateDictionary nesnesidir. Sözlükteki anahtarlar arasında yineleme yapabilir ve bu belirli alanın geçerli olup olmadığını kontrol etmek için IsValidField yöntemini kullanabilirsiniz.


3

Az önce bana olduğu gibi - bu, formunuzu güncellemeden modelinize gerekli bir özelliği eklediğinizde de olabilir. Bu durumda ValidationSummary hata mesajını listelemeyecektir.


1
Bu bana oldu. Bahşiş için teşekkürler!
Lewis86
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.