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

Listagem de itens em select

Bom dia a todos!

Estou montando um sistema que controla os atendimentos da área de TI e estou me deparando com a seguinte situação: Tenho uma tabela de usuários na qual é vinculado o setor que ele trabalha. Segue o código abaixo:

   public class Usuario
    {
        [Key]
        public int Id { get; set; }

        [Required(ErrorMessage = "* Campo obrigatório")]
        [Display(Name = "Nome do Usuário")]
        public string NomeUsuario { get; set; }

        [Required(ErrorMessage = "* Campo obrigatório")]
        [Display(Name = "Login")]
        public string Login { get; set; }

        [Required(ErrorMessage = "* Campo obrigatório")]        
        [Display(Name = "Senha")]
        public string Senha { get; set; }

        [Required(ErrorMessage = "* Campo obrigatório")]
        [Display(Name = "Status")]
        public int Status { get; set; }

        [Required(ErrorMessage = "* Campo obrigatório")]
        [Display(Name = "Setor")]
        public Setor Setor { get; set; }
    }
    public class Setor
    {
        [Key]
        public int Id { get; set; }

        [Required(ErrorMessage = "* Campo obrigatório")]
        [Display(Name = "Nome")]
        public string Nome { get; set; }

        [Required(ErrorMessage = "* Campo obrigatório")]
        [Display(Name = "Status")]
        public int Status { get; set; }
    }

Eu queria que quando eu invocasse o método Create, o meu campo select do setor fosse preenchido com todos os setores cadastrados no meu BD, porém não sei como fazer isso.

Alguém pode me ajudar?

6 respostas

Olá, Raul

No curso vimos como implementar a viewmodel CarrinhoViewModel.

Essa "ViewModel" é um modelo apropriado para fornecer todos os dados necessários para a montagem da view.

Então digamos que você tenha uma view para cadastrar usuários, chamada CadastroUsuario, e ela precise exibir uma lista de setores. O que você pode fazer (é só uma sugestão minha, você pode fazer diferente):

  • Criar um "view model", chamado CadastroUsuarioViewModel
  • CadastroUsuarioViewModel vai ter as mesmas propriedades do usuário (isto é, da classe Usuario)
  • CadastroUsuarioViewModel vai ter uma propriedade extra chamada Setores (List<Setor> Setores)
  • Essa CadastroUsuarioViewModel vai ser o modelo para a sua view
  • Ao instanciar CadastroUsuarioViewModel, você deve preencher a propriedade Setores a partir do banco de dados
  • Ao carregar a view CadastroView, passe CadastroUsuarioViewModel como modelo
  • Na view você pode usar TagHelper (semelhante ao visto no curso) e criar um dropdown com o <select > e passar como fonte de dados CadastroUsuarioViewModel.Setores:
<select asp-for="Setor" asp-items="Model.Setores"></select>

Basicamente é isso. Se tiver algum problema é só avisar!

Marcelo boa tarde!

Vou tentar fazer aqui e te falo se funcionou? Pra gravar o setor que eu selecionar não preciso mudar nada correto?

Marcelo boa tarde!

Vou tentar fazer aqui e te falo se funcionou? Pra gravar o setor que eu selecionar não preciso mudar nada correto?

Pra gravar o setor do usuário você vai precisar pegar o CadastroUsuarioViewModel.Setor e jogar no Usuario.Setor e em seguida salvar o Usuario.

Você já tem o código do controller + o código da gravação? Se tiver, pode colocar aqui para darmos uma olhada.

Marcelo bom dia!

Desculpe a demora para responder, mas estava enrolado aqui. Fiz a definição que me orientou e quando associo os itens no select está dando este erro: "Não é possível converter implicitamente tipo "System.Collections.Generic.List" em "System.Collections.Generic.Ienumerable". Existe uma conversão explícita (há uma conversão ausente?)"

Tentei achar algo na internet mas não encontrei nada para o meu caso. Pode me ajudar?

Meu código está assim:

Classe UsuarioViewModel

    public class UsuarioViewModel
    {
        public Usuario Usuario { get; set; }

        public List<Setor> Setores { get; set; }

        public UsuarioViewModel(List<Setor> setores)
        {
            this.Setores = setores;
        }        
    }

Classe UsuarioController

        public IActionResult CadastrarUsuario()
        {
            UsuarioViewModel viewModel = getSetores();
            return View(viewModel);
        }

        private UsuarioViewModel getSetores()
        {
            List<Setor> setores = this._contexto.Setores.ToList();
            UsuarioViewModel viewModel = new UsuarioViewModel(setores);
            return viewModel;
        }

View:

@model Unilab.Models.ViewModels.UsuarioViewModel

@{ 
    ViewData["Title"] = "Cadastro de Usuário";
}

<h2>Cadastro de Usuários</h2>
<hr />
<div class="panel panel-default">    
    <div class="panel-body">
        <form asp-action="CadastrarUsuario">
            <div asp-validation-summary="ModelOnly" class="text-danger"></div>
            <div class="form-group">
                <label class="control-label">Nome:</label>
                <input type="text" class="form-control" placeholder="Insira o nome completo do usuário..." asp-for="Usuario.NomeUsuario" />
            </div>
            <div class="form-group">
                <label class="control-label">Login:</label>
                <input type="text" class="form-control" placeholder="Insira o login do usuário..." asp-for="Usuario.Login"/>
            </div>
            <div class="form-group">
                <label class="control-label">Senha:</label>
                <input type="password" class="form-control" placeholder="****" asp-for="Usuario.Senha"/>
            </div>
            <div class="form-group">
                <label class="control-label">Setor:</label>
                <select asp-for="Usuario.IdSetor" asp-items="Model.Setores"></select>
            </div>
            <div class="form-group">
                <label class="control-label">Status:</label>
            </div>
            <div class="form-group">
                <label class="radio-inline"><input type="radio" asp-for="Usuario.Status" value="1" name="status" />Ativo</label>
                <label class="radio-inline"><input type="radio" asp-for="Usuario.Status" value="0" name="status" />Inativo</label>
            </div>
            <button type="submit" class="btn btn-primary glyphicon glyphicon-floppy-disk" data-toggle="tooltip" data-placement="bottom" title="Salvar"></button>
            <a asp-action="ListaSetores" class="btn btn-default glyphicon glyphicon-repeat" data-toggle="tooltip" data-placement="bottom" title="Cancelar"></a>
        </form>
    </div>
</div>
solução!

Marcelo bom dia!

Encontrei uma solução para o meu problema mas não sei se é o correto a se fazer. Primeiramente eu criei uma ViewBag que busca no banco e armazena a lista como um SelectList, conforme o código abaixo:

        public IActionResult FormCadastroUsuario()
        {
            var setores = this._contexto.Setores.Select(s => new
            {
                SetorId = s.Id,
                SetorNome = s.NomeSetor
            }).ToList();
            ViewBag.Setores = new SelectList(setores, "SetorId", "SetorNome");
            return View();
        }

Na View eu chamei um Html tag helper e coloquei a View Bag nele, como no código abaixo:

@Html.DropDownList("Usuario.IdSetor", (SelectList)ViewBag.Setores, new { @class="form-control" })

Feito isto funcionou a lista certinho!

Obrigado

Olá, Raul

Sim, se você conseguiu com ViewBag, sem problemas! Mas se quiser voltar a trabalhar com ViewModel, tente mudar o tipo de List para IEnumerable:

public IEnumerable<Setor> Setores { get; set; }

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