Відповіді:
Про "чи може бути 0 помилок, а IsValid == false": ось код MVC з 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);
}
}
Тепер, схоже, цього не може бути. Ну, це для ASP.NET MVC v1.
Оскільки ви, напевно, програмуєте в студії Visual, вам краще скористатися можливістю використання точок прориву для таких простих кроків налагодження (отримання уявлення про те, що проблема у вашому випадку). Просто розмістіть їх прямо спереду / в тому місці, де ви перевіряєте ModelState.isValid та наведіть курсор на ModelState. Тепер ви можете легко переглядати всі значення всередині і бачити, яка помилка викликає неправильне повернення false.
var asdf = ModelState.Values.Where(v => v.Errors.Count > 0);
може допомогти вам
Вставте нижченаведений код у ActionResult вашого контролера та поставте налагоджувач у цій точці.
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);
або повторити з
foreach (ModelState state in ViewData.ModelState.Values.Where(x => x.Errors.Count > 0))
{
}
Іноді палітурка викидає виняток без повідомлення про помилку. Ви можете отримати виняток за допомогою наступного фрагмента, щоб дізнатися, що не так:
(Часто, якщо сполучна намагається перетворити рядки в складні типи тощо)
if (!ModelState.IsValid)
{
var errors = ModelState.SelectMany(x => x.Value.Errors.Select(z => z.Exception));
// Breakpoint, Log or examine the list with Exceptions.
}
Якщо ви видалите чек на ModelsState.IsValid і допустите його помилку, якщо скопіювати цей рядок ((System.Data.Entity.Validation.DbEntityValidationException)$exception).EntityValidationErrors
і вставити його в розділ перегляду у Visual Studio, він точно дасть вам помилку. Економить багато часу на перевірку місця помилки.
Властивість ModelState на контролері насправді є об'єктом ModelStateDictionary. Ви можете перебирати клавіші словника і використовувати метод IsValidField, щоб перевірити, чи є конкретне поле дійсним.