Odpowiedzi:
O „czy to możliwe, że 0 błędów i IsValid == false”: oto kod źródłowy MVC z 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);
}
}
Teraz wygląda na to, że to niemożliwe. Cóż, to dla ASP.NET MVC v1.
Ponieważ prawdopodobnie programujesz w Visual Studio, lepiej skorzystaj z możliwości użycia punktów przerwania dla tak łatwych kroków debugowania (aby dowiedzieć się, na czym polega problem w Twoim przypadku). Po prostu umieść je tuż przed / w miejscu, w którym sprawdzasz ModelState.isValid i najedź kursorem na ModelState. Teraz możesz łatwo przejrzeć wszystkie wartości wewnątrz i zobaczyć, jaki błąd powoduje, że isvalid zwraca false.
var asdf = ModelState.Values.Where(v => v.Errors.Count > 0);
może ci pomóc
Wklej poniższy kod w ActionResult kontrolera i umieść debuger w tym miejscu.
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);
lub iteruj z
foreach (ModelState state in ViewData.ModelState.Values.Where(x => x.Errors.Count > 0))
{
}
Czasami spinacz zgłasza wyjątek bez komunikatu o błędzie. Możesz pobrać wyjątek za pomocą następującego fragmentu kodu, aby dowiedzieć się, co jest nie tak:
(Często, jeśli spinacz próbuje przekonwertować ciągi na złożone typy itp.)
if (!ModelState.IsValid)
{
var errors = ModelState.SelectMany(x => x.Value.Errors.Select(z => z.Exception));
// Breakpoint, Log or examine the list with Exceptions.
}
Jeśli usuniesz sprawdzanie dla ModelsState.IsValid i pozwolisz na błąd, jeśli skopiujesz ten wiersz ((System.Data.Entity.Validation.DbEntityValidationException)$exception).EntityValidationErrors
i wkleisz go w sekcji obserwacyjnej w programie Visual Studio, otrzymasz dokładnie, jaki jest błąd. Oszczędza dużo czasu, sprawdzając, gdzie jest błąd.
Właściwość ModelState kontrolera jest w rzeczywistości obiektem ModelStateDictionary. Możesz iterować za pomocą kluczy w słowniku i użyć metody IsValidField, aby sprawdzić, czy to konkretne pole jest prawidłowe.