Error passing values to @Html.DropDownList

3

My Controller :

  public ActionResult AssociarDependencia(int codigoMilestone, int codigoAtividade)
    {
        try
        {
            using (CPMDatabaseEntities db = new CPMDatabaseEntities())
            {
                List<Atividade> lista = new List<Atividade>();
                lista = db.Atividade.Where(a => a.CodigoMilestone == codigoMilestone).ToList();
                ViewBag.Atividades = lista;
                return View();

            }

        }
        catch (Exception)
        {
            throw;
        }
    }

My View :

 <div class="form-group">
                    @Html.Label("Atividade Sucessora", new { @class = "control-label col-md-3" })
                    <div class="col-md-9">
                        @Html.DropDownList("Atividades")
                    </div>
                </div>
            </div>

Using the debug that executes normal, we see in the image below that the code returns 2 values.

Butwhenthedebugarrivesat@Html.DropDownList("Atividades") it gives an exception as we see in the screenshots below.

    
asked by anonymous 17.10.2015 / 22:06

2 answers

2

@Html.DropDownList can not guess what's in your ViewBag . You have to inform her in code.

For your case, the following construction is recommended:

@Html.DropDownListFor(model => model.AtividadeId, ((IEnumerable<Atividade>)ViewBag.Atividades).Select(option => new SelectListItem
        {
            Text = option.Nome,
            Value = option.AtividadeId,
            Selected = (Model != null) && (Model.AtividadeId == option.AtividadeId)
        }), "Selecione...", new { @class = "form-control" })
    
20.10.2015 / 15:13
0

The problem is that you are passing List<Atividade> instead of List<SelectListItem> .

Try to do this:

    public ActionResult AssociarDependencia(int codigoMilestone, int codigoAtividade)
    {
        try {
            using (CPMDatabaseEntities db = new CPMDatabaseEntities()) {
                List<Atividade> lista = new List<Atividade>();
                lista = db.Atividade.Where(a => a.CodigoMilestone == codigoMilestone).ToList();

                IList<SelectListItem> listItens = new List<SelectListItem>();

                foreach (var item in lista) {
                    listItens.Add(new SelectListItem {
                        Text = lista.Propriedade,   // Valor que será o Texto do Dropdown
                        Value = lista.Propriedade,  // Valor que será o Value do Dropdown
                        Selected = false            // Indica se o item será selecionado por padrão no Dropdown
                    });
                }

                ViewBag.Atividades = listItens;
                return View();

            }

        }
        catch (Exception) {
            throw;
        }
    }

And in your View, do the following:

        <div class="form-group">
                @Html.Label("Atividade Sucessora", new { @class = "control-label col-md-3" })
                <div class="col-md-9">
                    @Html.DropDownList("Atividades",(IList<SelectListItem>)ViewBag.listItens)
                </div>
            </div>
        </div>

I have an extension that I created to convert a generic collection into a collection of SelectListItem, I'll pick it up and post it later, but for now this code should help you.

    
20.10.2015 / 15:04