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

Где я могу найти список ошибок, которые делают ModelState недействительным? Я не видел никакого свойства ошибки в объекте ModelState.

10 ответов

Решение

О том, "может ли быть так, что 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 Studio, вам лучше воспользоваться возможностью использования точек останова для таких простых шагов отладки (чтобы понять, в чем проблема, как в вашем случае). Просто разместите их прямо перед / в том месте, где вы проверяете ModelState.isValid и наведите курсор на ModelState. Теперь вы можете легко просмотреть все значения внутри и посмотреть, какая ошибка приводит к тому, что isvalid возвращает false.

ModelState

Вставьте приведенный ниже код в 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, чтобы проверить, является ли это конкретное поле допустимым.

Как только что случилось со мной - это также может произойти, когда вы добавляете обязательное свойство в вашу модель без обновления формы. В этом случае ValidationSummary не будет перечислять сообщение об ошибке.

Обновление Visual Studio 2022 + dotnet 6:

У меня была такая же проблема в течение долгого времени, и, наконец, я нашел ее. В моем случае это было поле Id :)

Просто поставьте точку останова и проверьте свой ModelState во время выполнения и перейдите в этот раздел:

ModelState -> Корень -> Дети

и вы увидите все действительные и недействительные ключи

Я вставил некоторый JSON на страницу MS Teams Wiki для дальнейшего использования, когда я скопировал его обратно для использования, он добавил дополнительные невидимые символы. Я подтвердил это, проанализировав его в JSONLint.

Удаление лишних символов исправило эту ошибку для меня.

Другие вопросы по тегам