4
respostas

Form de uma tabela relacional

Estou fazendo um projeto de biblioteca para treinar e queria saber como posso fazer o form de cadastro de emprestimo que contem os dados(livroID, usuarioID, dataEmprestimo, dataDevolucao). Quero fazer um dropdown com o nome dos Livros cadastrados e outro com os nomes dos usuarios cadastrados e pegar o ID ao inves do nome. Estou tentando fazer isso com ViewModel mas nao sei se estou no caminho certo. Se alguem puder me dar uma luz agradeco. Vou deixar o codigo do controller, da view, do model e da viewmodel aqui. Model

    public class Emprestimos
    {
        public int Id { get; set; }
        public Livros Livro { get; set; }
        public Usuarios Usuario { get; set; }
        public DateTime DataEmprestimo { get; set; }
        public DateTime DataDevolucao { get; set; }

        public Emprestimos()
        {

        }

        public Emprestimos(int id, Livros livro, Usuarios usuario, DateTime dataEmprestimo, DateTime dataDevolucao)
        {
            this.Id = id;
            this.Livro = livro;
            this.Usuario = usuario;
            this.DataEmprestimo = dataEmprestimo;
            this.DataDevolucao = dataDevolucao;
        }
    }

ViewModel

 public class EmprestimoViewModel
    {
        public List<Livros> Livros { get; private set; }
        public List<Usuarios> Usuarios { get; private set; }
        public int livroId { get; private set; }
        public int usuarioId { get; private set; }
        public DateTime DataEmprestimo { get; private set; }
        public DateTime DataDevolucao { get; private set; }

        public EmprestimoViewModel(List<Livros> livros, List<Usuarios> usuarios)
        {
            this.Livros = livros;
            this.Usuarios = usuarios;

        }
    }

Controller

  public IActionResult Cadastro()
        {
            EmprestimoViewModel viewModel = GetEmprestimoViewModel();
            return View(viewModel);
        }

        private EmprestimoViewModel GetEmprestimoViewModel()
        {
            List<Livros> livros = this._dataService.GetLivros();
            List<Usuarios> usuarios = this._dataService.GetUsuarios();

            EmprestimoViewModel viewModel = new EmprestimoViewModel(livros, usuarios);
            return viewModel;
        }

        [HttpPost]
        [ValidateAntiForgeryToken]
        public IActionResult Cadastro(Emprestimos emprestimo)
        {
            if (ModelState.IsValid)
            {
                    this._dataService.AddEmprestimo(emprestimo);
                    return RedirectToAction("Lista");
            }
            else
            {
                return View();
            }

        }

View

@model Library.Models.ViewModels.EmprestimoViewModel

<h1>Cadastro de Emprestimo</h1>

<form role="form" method="post" asp-action="cadastro">
    <div class="form-group">
        <label class="control-label" for="Livro">Livro</label>
        <select class="form-control" id="Livro" asp-for="livroId">
            @foreach (var livro in Model.Livros)
            {
                <option value="@livro.Id">@livro.Nome</option>
            }
        </select>
    </div>
    <div class="form-group">
        <label class="control-label" for="Usuario">Usuario</label>
        <select class="form-control" id="Usuario" asp-for="usuarioId">
            @foreach (var usuario in Model.Usuarios)
            {
                <option value="@usuario.Id">@usuario.Nome</option>
            }
        </select>
    </div>
    <div class="form-group">
        <label class="control-label" for="data_emprestimo">Data Emprestimo</label>
        <input type="date" class="form-control" id="DataEmprestimo" asp-for="DataEmprestimo">
    </div>
    <div class="form-group">
        <label class="control-label" for="data_devolucao">Data Devolucao</label>
        <input type="date" class="form-control" id="DataDevolucao" asp-for="DataDevolucao">
    </div>
    <button type="submit" class="btn btn-success">Cadastrar Emprestimo</button>
</form>
4 respostas

Oi Lucas, tudo bom?

Qual o problema dessa implementação? Acontece algum erro? A ideia me parece ok. As duas listas na ViewModel são bem justas.

Só não entendi muito bem pra que serviriam as properties:

    public int livroId { get; private set; }
        public int usuarioId { get; private set; }
        public DateTime DataEmprestimo { get; private set; }
        public DateTime DataDevolucao { get; private set; }

Já que elas não estão no construtor e tem os setters privados.

Oi Andre, meu problema esta sendo gravar os dados, eu nao sei como fazer para gravar os dados na tabela emprestimos do banco. Se eu coloco

@model Library.Models.ViewModels.EmprestimoViewModel

na minha view, entao nao consigo setar os asp-for dos campos corretamente, e ai vai gravar errado no banco, mas se eu coloco

@model Library.Models.Emprestimos

na view entao resolvo o problema dos asp-for nos campos mas ai nao consigo listar os livros e usuarios cadastrados nos dropdowns. Esse e meu problema. Preciso fazer algo para que eu consiga listar os livros e usuarios cadastrados mas tambem consiga colocar os asp-for para que o registro seja gravado corretamente. Quanto as properties era so algo que eu estava testando na hora.

Olá, Lucas

na view entao resolvo o problema dos asp-for nos campos mas ai nao consigo listar os livros e usuarios cadastrados nos dropdowns.

O que aparece nos dropdowns? Você consegue abri-los? Aparecem itens em branco ou nenhum item?

Coloque um ponto de parada dentro deste construtor:

        public EmprestimoViewModel(List<Livros> livros, List<Usuarios> usuarios)
        {
            this.Livros = livros;
            this.Usuarios = usuarios;

        }

Qua valores estão sendo passados para livros? E para usuarios?

Oi Marcelo, desculpa mas nao entendi muito bem o que voce quer que eu coloque o que na view

@model Library.Models.Emprestimos

ou

@model Library.Models.ViewModels.EmprestimoViewModel

? Colocando @model Library.Models.Emprestimos eu consigo setar os asp-for do select dos usuarios e livros com

<select class="form-control" asp-for="Usuario">
<select class="form-control" asp-for="Livro">

Mas desse jeito nao consigo fazer o foreach para listar os usuarios e livros no select. se eu colocar @model Library.Models.ViewModels.EmprestimoViewModel entao ate consigo fazer os foreachs nos selects

        <select class="form-control">
            @foreach (var item in Model.Usuarios)
            {
                <option value="@item.Id">@item.Nome</option>
            }
        </select>
        <select class="form-control">
            @foreach (var item in Model.Livros)
            {
                <option value="@item.Id">@item.Nome</option>
            }
        </select>

mas ai nao sei o que colocar nos asp-for. A minha duvida e, o que preciso fazer para que eu consiga listar os usuarios e livros cadastrados e ainda setar os asp-for dos campos corretamente para que o cadastro funcione.