Html.DropDownList Selected Value Not Working (Using Constructor with IEnumerable<SelectListItem>)
Asked Answered
G

8

22

I have an issue where the selected value is not working for the Html.DropDownList helper method. See below:

This is My Controller:

public ActionResult Edit(int id = 0)
{
    NewsEvent item = GetItem(id);
    ViewBag.NewsItemId = new SelectList(ViewBag.NewsItemId.Items, "Id", "Name", item.NewsItemId);

    return View(item);
}

This is my View:

@Html.DropDownList("NewsItemId",ViewBag.NewsItemId as SelectList, string.Empty,
                           new { @class = "form-control" })

However when I try the below in by view it works:

@Html.DropDownList("NewsItemId", string.Empty)

The below also works but since the field name does not match the model, it will not post correctly.

@Html.DropDownList("NewsItemIdDrop",ViewBag.NewsItemId as SelectList, string.Empty,
                           new { @class = "form-control" })

The reason I need to use the first option is so that I can add the class attribute to the control.

Could someone help me understand what I am doing wrong?

Glyptodont answered 24/10, 2013 at 12:55 Comment(1)
possible duplicate of DropDownListFor Not Selecting ValueBlowup
B
50

You have the same problem here:

DropDownListFor Not Selecting Value

Problem is in your ViewBag property name. Because it is same as your property in Model it will not work. You should just change name of your ViewBag prop to something else, like:

ViewBag.NewsItemList = new SelectList(ViewBag.NewsItemId.Items, "Id", "Name", item.NewsItemId);

and on View

@Html.DropDownList("NewsItemId",ViewBag.NewsItemList as SelectList, string.Empty,
                           new { @class = "form-control" })
Blowup answered 24/10, 2013 at 13:39 Comment(3)
That bug is evil. A good reason not to use ViewBags and View Dictionaries. Is this a bug with .NET 4.5? It may have broken on an upgrade...?Georginageorgine
I'm having the same problem even though I changed the viewbag names.Cabinetmaker
Why are all solutions like this. simple and straightforward and no fluff. Thanks loadsCrimple
C
4

I tried lot of stuff but eventually got it working like this

In controller

int valittu_tila = 1;
var tapahtumantilat = new List<SelectListItem>();

tapahtumantilat.Add(new SelectListItem { Text = "Tapahtumaa kirjataan", Value = "0" });
tapahtumantilat.Add(new SelectListItem { Text = "Odottaa jonossa", Value = "1"});
tapahtumantilat.Add(new SelectListItem { Text = "Tapahtumaa käsitellään", Value = "2"});

ViewBag.tilalista = new SelectList(tapahtumantilat, "Value", "Text", valittu_tila);

And then in view I just put (I have the onchange event and class for dropdown too here but you can remove those if you want).

@Html.DropDownList("tuki_tila", ViewBag.tilalista as SelectList, "-- valitse tila --", new { @onchange = "executeticketsearch();", @class = "haku_dropdowns" })

(Sorry about finnish in the text values and variable names, but those shouldn't matter :D)

Cero answered 26/9, 2014 at 5:56 Comment(0)
F
2

I did not like the fact that you can use

@Html.DropDownList("NewsItemID") 

and it works. Then you need to add the 'class' attribute and suddenly it breaks. I saw one place working and another not working using the syntax

@Html.DropDownList("NewsItemId",ViewBag.NewsItemId as SelectList, string.Empty,
                       new { @class = "form-control" })

When I researched this, I determined the ViewBag.NewsItemId was actually a null in the view. So a working syntax, with the Model and ViewBag fields having the same name is

@Html.DropDownList("NewsItemId", null, string.Empty,
                       new { @class = "form-control" })
Foretooth answered 28/5, 2014 at 20:25 Comment(0)
A
1

First of all, how do you populate ViewBag.NewsItemId.Items ? We don't see where the values come from.

In order to make a selected value work, it must be of the same type as the elements of your collections. If item.NewsItemId is of type T, ViewBag.NewsItemId.Items must be of type IEnumerable<T> (or any other collection type implementing it). It does not seem to be the case, because you set NewsItemId as the selected value while your collection is based on NewsItemId.Items which may not be of the same type.

Argilliferous answered 24/10, 2013 at 13:10 Comment(0)
S
0

You should change the very name of the field of your DropDownList:

@Html.DropDownList("Some_Name_that_does_not_exist_in_model", ViewBag.NewsItemId as SelectList, string.Empty, new { @class = "form-control" })
Strander answered 11/4, 2017 at 12:49 Comment(0)
S
0

change viewbag property name to other then model variable name used on page.

Silvestro answered 2/6, 2017 at 4:25 Comment(1)
Could you provide more details as to how this fixes the problem?Extradition
S
0
@Html.DropDownList("NewsItemId",ViewBag.NewsItemId as SelectList, string.Empty,
    new { @class = "form-control" })

change to

@Html.DropDownList("NewsItemId", ViewBag.NewsItemIdList as SelectList, string.Empty, 
    new { @class = "form-control" })

ViewBag.NewsItemIdList name changed. also change in controller.

Silvestro answered 2/6, 2017 at 4:53 Comment(0)
H
0

I had the same problem. In the example below The variable ViewData["DATA_ACREDITO_MODELO_INTEGRADO"] has a SelectListItem list with a default selected value but such attribute is not reflected visually.

// data 
        var p_estadoAcreditacion = "NO";
        var estadoAcreditacion = new List<SelectListItem>();
        estadoAcreditacion.Add(new SelectListItem { Text = "(SELECCIONE)"    , Value = " "    });
        estadoAcreditacion.Add(new SelectListItem { Text = "SI"              , Value = "SI"   });
        estadoAcreditacion.Add(new SelectListItem { Text = "NO"              , Value = "NO"   });

        if (!string.IsNullOrEmpty(p_estadoAcreditacion))
        {
            estadoAcreditacion.First(x => x.Value == p_estadoAcreditacion.Trim()).Selected = true;
        }
         ViewData["DATA_ACREDITO_MODELO_INTEGRADO"] = estadoAcreditacion;

I solved it by making the first argument of DropdownList, different to the id attribute.

// error:
@Html.DropDownList("SELECT__ACREDITO_MODELO_INTEGRADO"
, ViewData["DATA_ACREDITO_MODELO_INTEGRADO"] as List<SelectListItem>
, new
{
id         = "SELECT__ACREDITO_MODELO_INTEGRADO"
...
// solved :
@Html.DropDownList("DROPDOWNLIST_ACREDITO_MODELO_INTEGRADO"
, ViewData["DATA_ACREDITO_MODELO_INTEGRADO"] as List<SelectListItem>
, new
{
id         = "SELECT__ACREDITO_MODELO_INTEGRADO"
...
Hypochondria answered 11/7, 2019 at 17:29 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.