2
respostas

[Route] não está funcionado

Erro de Servidor no Aplicativo '/'. Não é possível encontrar o recurso. Descrição: HTTP 404. O recurso que você está procurando (ou uma de suas dependências) não pôde ser removido, seu nome foi alterado ou está temporariamente indisponível. Examine o URL e certifique-se de que está digitado corretamente.

URL solicitada: /produtos

Informações sobre a Versão: Microsoft .NET Framework Versão:4.0.30319; Versão do ASP.NET:4.7.2633.0

Controller:

{ public class ProdutoController : Controller { // // GET: /Produto/

    [Route("produtos")]
    public ActionResult Index()
    {
        ProdutosDAO dao = new ProdutosDAO();
        IList<Produto> produtos = dao.Lista();
        ViewBag.Produtos = produtos;
        return View(produtos);
    }

    public ActionResult Form()
    {
        ViewBag.Produto = new Produto();
        CategoriasDAO dao = new CategoriasDAO();
        IList<CategoriaDoProduto> categorias = dao.Lista();
        ViewBag.Categorias = categorias;
        return View(categorias);
    }

    [HttpPost]
    public ActionResult Adiciona(Produto produto)
    {
        int idDaInformatica = 1;
        if (produto.CategoriaId.Equals(idDaInformatica) && produto.Preco < 100)
        {
            ModelState.AddModelError("produto.InformaticaComPrecoInvalido", "Produtos da categoria informática devem ter preço maior do que 100");
        }
        if (ModelState.IsValid)
        {
            ProdutosDAO dao = new ProdutosDAO();
            dao.Adiciona(produto);
            return RedirectToAction("Index");
        }
        else
        {
            ViewBag.Produto = produto;
            CategoriasDAO categoriasDAO = new CategoriasDAO();
            ViewBag.Categorias = categoriasDAO.Lista();
            return View("Form");
        }
    }
    [Route("produtos/{id}")]
    public ActionResult Visualiza(int id)
    {
        ProdutosDAO dao = new ProdutosDAO();
        Produto produto = dao.BuscaPorId(id);
        ViewBag.Produto = produto;
        return View();
    }
}

}

    public static void RegisterRoutes(RouteCollection routes)
    {
        routes.MapMvcAttributeRoutes();
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");


        routes.MapRoute(
            name: "Default",
            url: "{controller}/{action}/{id}",
            defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
        );
    }
}

}

2 respostas

Oi Rafael, tudo bom?

A anotação Route sobrescreve somente o comportamento da classe ou método adjacente. Ou seja, nesse caso, você sobrescreveu o comportamento do método (action). Já que o controller se chama Produto a action final seria algo como /produto/produtos. Se você quer alterar o comportamento do controller, essa anotação deveria estar adjacente a classe:

[Route("produtos")]
public ProdutoController : Controller{
//resto da classe
}

Abraço

Olá Andre, Obrigado pela resposta!

não consigo testar o código no momento, porém verifiquei nas aulas e se você notar, na Aula 7 atividade 2 (Criando rotas na aplicação) o próprio exercício nos manda adicionar a anotação em cima da ActionResult, o estranho é que no vídeo também é colocada a Anotação em cima da Action e lá funciona normal. achei que poderia ser algo relacionado a versão do meu Visual Studio que é 2017 e nas aulas utilizam uma versão mais antiga