How to put a dropdownlist in a cshtml

-2

I need to put a dropdownlist under the following conditions: It will display the City name (City Table), but it will only record the Employee Code. Using this approach, I can mount the DropDownList: Model

public class Cidade
    {
        [Key]
        public int id { get; set; }
        [Required(ErrorMessage = "O nome da cidade é obrigatório", AllowEmptyStrings = false)]
        [Display(Name="Nome")]
        public String nome { get; set; }

        public List<Cidade> ListaCidades()
        {
            return new List<Cidade>   
            {
                new Cidade { id = 1, nome = "SÃO PAULO"}  
            }; 
        }
    }

See that my model is done manually. I could not bring the direct data from the table. In the controller I did so (I was using it in Action Wrong):

public async Task<ActionResult> Index()
        {
            GetFuncionariosAsync funcionarios = new GetFuncionariosAsync();

            //popular a dropdown de cidades na view funcionarios
            GetCidadesAsync cidade = new GetCidadesAsync();
            var _cidade = await cidade.GetCidades();
            ViewBag.ViewCidade = new SelectList(_cidade, "id", "nome");

            var model = await funcionarios.GetFuncionarios(); 

            return View(model);
        }

        // GET: GetFuncionarios/Create
        public ActionResult Create(Cidade cidade)
        {
            var cidadeId = cidade.id;

            ViewBag.ViewCidade = new SelectList
            (
                new Cidade().ListaCidades(),
                "id",
                "nome",
                cidadeId
            );
            return View();
        }

Of course my cshtml (just the dropdownlist) looks like this:

<div class="form-group">
        @Html.LabelFor(model => model.cidade, htmlAttributes: new { @class = "control-label col-md-2" })
        <div class="col-md-10">
             @Html.DropDownList("id", (SelectList)ViewBag.ViewCidade, "- Selecione -", new { @class = "form-control" })
        </div>
    </div>

See the screenshot below of how the dropdown is, now I just need to know how to load the list from the database and if I really need to create the CitiesCategory () method in the model?

See that in the dropdown, I show the City of São Paulo. But this was released manually, now how do I clear the BD fields? Do I need the listacidades () method? I find it unnecessary.

The way it is, if I try to do it this way,

public async Task<ActionResult> Create()
        {
            //var cidadeId = cidade.id;
            GetCidadesAsync cidade = new GetCidadesAsync();
            var _cidade = await cidade.GetCidades();
            ViewBag.ViewCidade = _cidade.Select(s => new SelectListItem { Value = s.id.ToString(), Text = s.nome });
            return View();
        }

I get the error below:

  

System.InvalidCastException: 'Unable to cast object of type   'WhereSelectListIterator'2 [TrainingCrud.Models.City, System.Web.Mvc.SelectListItem]'   to type 'System.Web.Mvc.SelectList'. '

Any help is welcome.

    
asked by anonymous 10.08.2018 / 01:00

2 answers

1

You need to specify that your ViewCidade is a SelectList in DropDownList .

@Html.DropDownList("Id", (SelectList)ViewBag.ViewCidade, "- Selecione -", new { @class = "form-control" })

See an example working here at dotnetfiddle dotnetfiddle

    
10.08.2018 / 18:40
-3
public async Task<ActionResult> Create()
        {
            GetCidadesAsync cidade = new GetCidadesAsync();
            var _cidade = await cidade.GetCidades();

            ViewBag.ViewCidade = new SelectList
            (
                _cidade,
                "id",
                "nome"
            );   
            return View();
        }

and not cshtml

<div class="form-group">
        @Html.LabelFor(model => model.cidade, htmlAttributes: new { @class = "control-label col-md-2" })
        <div class="col-md-10">
            @Html.DropDownList("cidade", (SelectList)ViewBag.ViewCidade, "- Selecione -", new { @class = "form-control" })
        </div>
    </div>
    
12.08.2018 / 14:35