Error passing values to @Html.Dropdownlist

Asked

Viewed 734 times

3

Man 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 this runs normal, we see in the image below that the code returns 2 values.

inserir a descrição da imagem aqui

But when the debug arrives in the @Html.DropDownList("Atividades") he gives an exception as we see in the images below.

inserir a descrição da imagem aqui

  • You want to return with some activity already selected?

2 answers

2


@Html.DropDownList can’t guess what’s in your ViewBag. You have to report this to her in code.

For your case, the following construction is the most 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" })

0

The problem is that you’re passing one List<Atividade> instead of a List<SelectListItem>.

Try to do that:

    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 I created to convert a generic collection into a collection of Selectlistitem, I will pick it up and put it here later, but for now this code should help you.

Browser other questions tagged

You are not signed in. Login or sign up in order to post.