Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

AddModelError não funciona

Bom dia,

O ModelState.AddModelError não está funcionando na View. Não sei se ele não está adicionando a mensagem de validação na lista dele ou se a parte @Html.ValidationMessage("produto.Invalido") da View não está reconhecendo esse produto.Invalido criado no ProdutoController.

A outra mensagem que vem da validação feita na classe Produto utilizando os validation attributes aparece normalmente.

        [Required, StringLength(20)]
        public string Nome { get; set; }

No Form.cshtml uso @Html.ValidationMessage("produto.Nome") e funciona. Só com a mensagem de validação criada com o AddModelError que não.

Tentei algumas soluções, mas realmente não faço ideia do que seja. Se alguém puder ajudar fico grato.

Segue código do Controller e da View:

ProdutoController

        [HttpPost]
        public ActionResult Adiciona(Produto produto)
        {
            int idDaInformatica = 1;
            if (produto.CategoriaId.Equals(idDaInformatica) && produto.Preco < 100)
            {
                ModelState.AddModelError("produto.Invalido", "Informática com preço abaixo de R$100.");
            }

            if (ModelState.IsValid)
            {
                ProdutosDAO dao = new ProdutosDAO();
                dao.Adiciona(produto);

                return RedirectToAction("Index", "Produto");
            }
            else
            {
                CategoriasDAO categoriasDao = new CategoriasDAO();
                ViewBag.Categorias = categoriasDao.Lista();
                return View("Form");
            }
        }

Form.cshtml

    <form method="post" action="/Produto/Adiciona">
        @Html.ValidationMessage("produto.Invalido")

        <label for="nome">Nome: </label>
        <input id="nome" name="produto.Nome" />
        @Html.ValidationMessage("produto.Nome")

        <label for="preco">Preço: </label>
        <input id="preco" name="produto.Preco" />

        <label for="quantidade">Quantidade: </label>
        <input id="quantidade" name="produto.Quantidade" />

        <label for="descricao">Descrição: </label>
        <input id="descricao" name="produto.Descricao" />

        <label for="categoria">Categoria: </label>
        <select id="categoria" name="categoriaId">
            @foreach (var categoria in ViewBag.Categorias)
            {
                <option value="@categoria.Id">@categoria.Nome</option>
            }
        </select>

        <input type="submit" value="Cadastrar" />
    </form>
2 respostas

Alan, boa tarde. Para que não esteja entrando no IF do ModelState.AddModelError só pode estar falhando o seu IF.

Provavelmente é o comparador Equals que não está sendo atendido e nunca vai entrar no IF. Essa propriedade realmente é um inteiro? Pois se for de tipo diferente nunca atenderá a condição. Será que ela não é um List ou Object?

Resolvendo essa comparação, resolve seu problema.

Se pude ajudar com o seu problema, marque a resposta como solucionada. Obrigado! Abs

solução!

Obrigado pela resposta, Murilo!

Consegui encontrar o erro. Na realidade eu não estava passando o 'produto' parâmetro da Action como name no Form.cshtml, então o resultado do select não estava entrando no objeto 'Produto' do Adiciona. Coisa boba, afinal.

Consegui arrumar mudando isso:

    <select id="categoria" name="categoriaId">

Para isso:

    <select id="categoria" name="produto.CategoriaId">