Respostas:
Sobre "pode ser que 0 erros e IsValid == false": aqui está o código-fonte do MVC em 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);
}
}
Agora, parece que não pode ser. Bem, isso é para o ASP.NET MVC v1.
Como você provavelmente está programando no Visual studio, é melhor aproveitar a possibilidade de usar pontos de interrupção para etapas tão fáceis de depuração (tendo uma idéia de qual é o problema no seu caso). Basta colocá-los em frente / no local em que você verifica ModelState.isValid e passa o mouse sobre o ModelState. Agora você pode navegar facilmente por todos os valores internos e ver qual erro causa o retorno isvalid false.
var asdf = ModelState.Values.Where(v => v.Errors.Count > 0);
pode ajudá-lo
Cole o código abaixo no ActionResult do seu controlador e coloque o depurador neste momento.
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);
ou itere com
foreach (ModelState state in ViewData.ModelState.Values.Where(x => x.Errors.Count > 0))
{
}
Às vezes, um fichário lança uma exceção sem mensagem de erro. Você pode recuperar a exceção com o seguinte snippet para descobrir o que está errado:
(Geralmente, se o fichário estiver tentando converter seqüências de caracteres em tipos complexos, etc.)
if (!ModelState.IsValid)
{
var errors = ModelState.SelectMany(x => x.Value.Errors.Select(z => z.Exception));
// Breakpoint, Log or examine the list with Exceptions.
}
Se você remover a verificação de ModelsState.IsValid e deixar que isso ocorra, se você copiar esta linha ((System.Data.Entity.Validation.DbEntityValidationException)$exception).EntityValidationErrors
e colar na seção de exibição no Visual Studio, ele fornecerá exatamente qual é o erro. Economiza muito tempo verificando onde está o erro.
A propriedade ModelState no controlador é realmente um objeto ModelStateDictionary. Você pode percorrer as chaves no dicionário e usar o método IsValidField para verificar se esse campo específico é válido.