ModelState.IsValid == false, чому?


120

Де я можу знайти список помилок, які роблять ModelState недійсним? Я не бачив властивості помилок на об'єкті ModelState.

Відповіді:


45

Про "чи може бути 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.


мені здається, що це не повинно, це щось не так у Values.All (modelState => modelState.Errors.Count == 0)?
Ому

Зауважте, що помилка може бути повідомленням або винятком; наприклад, Html.ValidationSummary не відображає винятків (я думаю, з міркувань безпеки); можливо, тому ви не бачите помилок? Як перевірити відсутність помилок?
queen3

1
ModelState.IsValid дає помилкові
Omu

Ха-ха, це очевидно ... як ви перевіряєте на "значення мають 0 помилок"?
queen3

258

Оскільки ви, напевно, програмуєте в студії Visual, вам краще скористатися можливістю використання точок прориву для таких простих кроків налагодження (отримання уявлення про те, що проблема у вашому випадку). Просто розмістіть їх прямо спереду / в тому місці, де ви перевіряєте ModelState.isValid та наведіть курсор на ModelState. Тепер ви можете легко переглядати всі значення всередині і бачити, яка помилка викликає неправильне повернення false.

модельдержави


3
чи можливо, що всі значення мають 0 помилок, а модельний стан все ще недійсний?
Ому

як сказано вище, ніяке це неможливо :). Десь має бути кількість помилок! = 0.
bastijn

2
Як додаток, якщо ErrorMessage для вас неоднозначний, ви можете перейти до клавіш, і він покаже вам, до якої змінної йдеться.
Світлий

1
у своєму представленні зробіть: @ Html.HiddenFor (model => model.Username) вирішить проблему!
Umit Kaya

1
var asdf = ModelState.Values.Where(v => v.Errors.Count > 0);може допомогти вам
Cirelli94

37

Вставте нижченаведений код у ActionResult вашого контролера та поставте налагоджувач у цій точці.

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

3
Найкраща відповідь тут, слід оцінювати вище. Навіщо витрачати свій час на копання через 5 шарів об’єкта ModelState у відладчику, коли я можу просто отримати з нього помилки. Я був би там увесь ранок, якби дотримувався найвищої оцінки
Шон Т

2
це найкраща колись
іграшка

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

або повторити з

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

    }

чи можливо, що всі значення мають 0 помилок, а модельний стан все ще недійсний?
Ому

1
Modelstate матиме ключ "Властивість" та пов'язану помилку в словнику. повідомлення про помилку може бути порожнім, але кількість помилок відображатиме кількість властивостей, які є недійсними. Оскільки метод ModelStateDictionary.AddModelError бере ключ, а String винятку чи помилки; потрібно додати помилку моделі.
Michael G

13

Іноді палітурка викидає виняток без повідомлення про помилку. Ви можете отримати виняток за допомогою наступного фрагмента, щоб дізнатися, що не так:

(Часто, якщо сполучна намагається перетворити рядки в складні типи тощо)

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

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

  }

1
Цей код був дуже корисним для мене, але повторення помилок (виключень) для отримання кожного. Коли я змінив z.Exception на z.ErrorMessage, я зміг відобразити повідомлення про помилки.
StackOverflowUser

Це було рішенням для мене, змінивши на z.ErrorMessage, хоча я не отримав помилку з z.Exception, просто нульові значення. Можливо, варто оновити оригінальну відповідь.
esp

5

Якщо ви видалите чек на ModelsState.IsValid і допустите його помилку, якщо скопіювати цей рядок ((System.Data.Entity.Validation.DbEntityValidationException)$exception).EntityValidationErrorsі вставити його в розділ перегляду у Visual Studio, він точно дасть вам помилку. Економить багато часу на перевірку місця помилки.


1
Дуже корисна порада.
Еш

Це найкраща порада в цій темі. Проблема у мене була дурна "." (крапка) в UserName
манджа

3

Властивість ModelState на контролері насправді є об'єктом ModelStateDictionary. Ви можете перебирати клавіші словника і використовувати метод IsValidField, щоб перевірити, чи є конкретне поле дійсним.


3

Як і щойно зі мною - це також може статися, коли ви додасте потрібну властивість до своєї моделі, не оновлюючи форму. У цьому випадку ValidationSummary не відображатиме повідомлення про помилку.


1
Це сталося зі мною. Thx для підказки!
Lewis86
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.