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

Problema na validação de formulário

Pessoal, estou com um problema na validação do meu formulario nome, coloquei as anotações tudo direitinho, mas quando eu tento adicionar ao meu campo nome um nome com + de 20 caracteres o sistema gera uma exceção e para o programa, e gera o seguinte erro: "An exception of type 'System.NullReferenceException' occurred in App_Web_ruxct1da.dll but was not handled in user code

Additional information: Referência de objeto não definida para uma instância de um objeto."

e ele acusa erro no for each da minha view form.

Seguem abaixo os códigos da minha aplicação.

View:

<!DOCTYPE html>

<html>
<head>
    <meta name="viewport" content="width=device-width" />
    <title>Form</title>
</head>
<body>
    <div> 

            <form action="/Produto/Adiciona" method="post">
                <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="produto.CategoriaId">
                    @foreach (var categoria in ViewBag.Categorias)
                    {
                        <option value="@categoria.Id">@categoria.Nome</option>
                    }
                </select>

                <input type="submit" />
            </form>

    </div>
</body>
</html>

Model do produto:

using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.Web;

namespace CaelumEstoque.Models
{
    public class Produto
    {
        public int Id { get; set; }

        [StringLengthAttribute(20)]
        public String Nome { get; set; }

        public float Preco { get; set; }

        public CategoriaDoProduto Categoria { get; set; }

        public int? CategoriaId { get; set; }

        public String Descricao { get; set; }

        public int Quantidade { get; set; }
    }
}

Controller do produto:

using CaelumEstoque.DAO;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using CaelumEstoque.Models;
namespace CaelumEstoque.Controllers
{
    public class ProdutoController : Controller
    {
        // GET: Produto
        public ActionResult Index()
        {
            ProdutosDAO dao = new ProdutosDAO();
            IList<Produto> produtos = dao.Lista();
            ViewBag.Produtos = produtos;
            return View();
        }
        public ActionResult Form()
        {
            var categoriasDao = new CategoriasDAO();
            IList<CategoriaDoProduto> categoria = categoriasDao.Lista();
            ViewBag.Categorias = categoria;
            return View();
        }

        [HttpPost]
        public ActionResult Adiciona(Produto produto)
        {
            if (ModelState.IsValid)
            {
                ProdutosDAO dao = new ProdutosDAO();
                dao.Adiciona(produto);
                return RedirectToAction("Index", "Produto");
            }
            else
            {
                return View("Form");
            }
        }
    }
}

Agradeço se alguém puder dar uma luz, valeu!

2 respostas
solução!

Oi Igor!

Antes de carregar a view Form, você carrega as categorias e passa para a viewbag da seguinte forma:

 public ActionResult Form()
        {
            var categoriasDao = new CategoriasDAO();
            IList<CategoriaDoProduto> categoria = categoriasDao.Lista();
            ViewBag.Categorias = categoria;
            return View();
        }

Na action Adiciona, quando você tem um erro de validação, está fazendo com que o usuário continue na view Form. Nesse caso, você precisa carregar a viewbag novamente. O código ficaria mais ou menos assim:

[HttpPost]
        public ActionResult Adiciona(Produto produto)
        {
            if (ModelState.IsValid)
            {
                ProdutosDAO dao = new ProdutosDAO();
                dao.Adiciona(produto);
                return RedirectToAction("Index", "Produto");
            }
            else
            {
                 var categoriasDao = new CategoriasDAO();
                 IList<CategoriaDoProduto> categoria = categoriasDao.Lista();
                ViewBag.Categorias = categoria;
                return View("Form");
            }
        }

Veja se assim funciona!

Muito obrigado gabriel, realmente eu estava esquecendo de carregar a ViewBag no else, vc me ajudou bastante. Agora abusando um pouco da boa vontade, eu te aconselho a quando for postar um código formatar com pois o código sem formatação gera um pouco de dificuldade pra entender, muito obrigado!!!!