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

Bom dia, eu tinho uma duvida, quando faço o cadastro de um livro, grava sempre em duplicado. Mesmo fazer a partir do vosso codigo ele repete sempre o método incluir da classe LivroRepositorioCSV. Desde já obrigado pela atenção.

using ListaLeitura.Negocio;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;

namespace ListaLeitura.Repositorio
{
    public class LivroRepositorioCSV : ILivroRepositorio
    {
        // Atributos:
        private static readonly string nomeArquivoCSV = "Repositorio\\livros.csv";

        private ListaDeLeitura _paraLer;
        private ListaDeLeitura _lendo;
        private ListaDeLeitura _lidos;

        public LivroRepositorioCSV()
        {
            var arrayParaLer = new List<Livro>();
            var arrayLendo = new List<Livro>();
            var arrayLidos = new List<Livro>();

            using (var file = File.OpenText(LivroRepositorioCSV.nomeArquivoCSV))
            {
                while (!file.EndOfStream)
                {
                    var textoLivro = file.ReadLine();

                    if(string.IsNullOrEmpty(textoLivro))
                    {
                        continue;
                    }

                    var infoLivro = textoLivro.Split(';');
                    var livro = new Livro
                    {
                        Id = Convert.ToInt32(infoLivro[1]),
                        Titulo = infoLivro[2],
                        Autor = infoLivro[3]
                    };

                    switch (infoLivro[0])
                    {
                        case "para-ler":
                            arrayParaLer.Add(livro);
                            break;
                        case "lendo":
                            arrayLendo.Add(livro);
                            break;
                        case "lidos":
                            arrayLidos.Add(livro);
                            break;
                        default:
                            break;
                    }
                }
            }

            _paraLer = new ListaDeLeitura("Para Ler", arrayParaLer.ToArray());
            _lendo = new ListaDeLeitura("Lendo", arrayLendo.ToArray());
            _lidos = new ListaDeLeitura("Lidos", arrayLidos.ToArray());
        }

        public ListaDeLeitura ParaLer => _paraLer;
        public ListaDeLeitura Lendo => _lendo;
        public ListaDeLeitura Lidos => _lidos;

        public IEnumerable<Livro> Todos => _paraLer.Livros.Union(_lendo.Livros).Union(_lidos.Livros);

        public void Incluir(Livro livro)
        {
            var id = Todos.Select(l => l.Id).Max();

            using (var file = File.AppendText(LivroRepositorioCSV.nomeArquivoCSV))
            {
                file.WriteLine($"para-ler;{id+1};{livro.Titulo};{livro.Autor};");
            }
        }
    }
}
using ListaLeitura.Negocio;
using ListaLeitura.Repositorio;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Routing;
using Microsoft.Extensions.DependencyInjection;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;

namespace ListaLeitura
{
    public class Startup
    {
        public void ConfigureServices(IServiceCollection services)
        {
            services.AddRouting();
        }

        public void Configure(IApplicationBuilder app)
        {
            //app.Run(LivrosParaLer);
            //app.Run(Roteamento);

            var builder = new RouteBuilder(app);
            builder.MapRoute("Livros/ParaLer", LivrosParaLer);
            builder.MapRoute("Livros/Lendo", LivrosLendo);
            builder.MapRoute("Livros/Lidos", LivrosLidos);
            builder.MapRoute("Cadastro/NovoLivro/{nome}/{autor}", NovoLivroParaLer);
            builder.MapRoute("Livros/Detalhes/{id:int}", ExibeDetalhes);
            builder.MapRoute("Cadastro/NovoLivro", ExibeFormulario);
            builder.MapRoute("Cadastro/Incluir", ProcessaFormulario);

            var rotas = builder.Build();

            app.UseRouter(rotas);
        }

        private Task ProcessaFormulario(HttpContext context)
        {
            var livro = new Livro()
            {
                Titulo = context.Request.Query["titulo"].First(),
                Autor = context.Request.Query["autor"].First()
            };
            var _repo = new LivroRepositorioCSV();
            _repo.Incluir(livro);

            return context.Response.WriteAsync("O livro foi adicionado com sucesso!");
        }

        private Task ExibeFormulario(HttpContext context)
        {
            var html = @"
                <html>
                    <form action='/Cadastro/Incluir'>
                        <input name='titulo'/>
                        <input name='autor'/>
                        <button>Gravar</button>
                    </form>
                </html>
            ";

            return context.Response.WriteAsync(html);
        }
3 respostas

Oi Guilherme, tudo bem?

Meu palpite é que o formulário gerado no cliente (navegador) está fazendo 2 chamadas para o endereço Cadastro/Incluir. Você pode confirmar isso, por favor? Tecle F12 no Chrome, (Ferramentas do desenvolvedor), clique na aba "Network", clique em "Gravar" e veja se a requisição para "Cadastro/Incluir" está duplicada. Se estiver, inspecione o código HTML da página e veja se existe alguma duplicação de código no formulário.

Olá, obrigado pela resposta. Eu estive a confirmar, não tenho código repetido. Mas após vários testes, incluindo debug no VS, vi que pelo Chrome ele repete o metodo GET duas vezes, mas o POST não repete. No Mozzila firefox e no Edge, ele não repete o GET nem o POST. Ou seja, a repetição só acontece com o Chrome no metodo GET.

solução!

Consegue resolver, era uma extensão que tinha no Chrome que fazia a repetição. Encontrei a resposta no stackoverflow, link: https://stackoverflow.com/questions/2009092/page-loads-twice-in-google-chrome Assim que removi a extensão, funciona direito.

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software