I am building the following SelectList
in my controller.
var u = new NewUser();
u.UserTypeOptions = new SelectList(new List<SelectListItem>
{
new SelectListItem { Selected = true, Text = string.Empty, Value = "-1"},
new SelectListItem { Selected = false, Text = "Homeowner", Value = ((int)UserType.Homeowner).ToString()},
new SelectListItem { Selected = false, Text = "Contractor", Value = ((int)UserType.Contractor).ToString()},
});
return u;
And displaying it on my view like this:
@Html.DropDownListFor(m => m.UserType, Model.UserTypeOptions)
It looks like I am giving it a valid set of SelectListItem
s in what should be a pretty straightforward dropdown list, but instead of getting a valid <option>
list with good values and text, I get this:
<select data-val="true" data-val-range="A user type must be selected." data-val-range-max="2" data-val-range-min="1" data-val-required="The UserType field is required." id="UserType" name="UserType" class="input-validation-error">
<option>System.Web.Mvc.SelectListItem</option>
<option>System.Web.Mvc.SelectListItem</option>
<option>System.Web.Mvc.SelectListItem</option>
</select>
What gives? As far as I can tell, this should work.
Try this, just an example:
Or
You are missing setting what field is the Text and Value in the SelectList itself. That is why it does a
.ToString()
on each object in the list. You could think that given it is a list ofSelectListItem
it should be smart enough to detect this... but it is not.BTW, you can use a list of array of any type... and then just set the name of the properties that will act as Text and Value.
I think it is better to do it like this:
I removed the -1 item, and the setting of each items selected true/false.
Then, in your view:
This way, if you set the "Select one" item, and you don't set one item as selected in the SelectList, the
UserType
will be null (theUserType
need to beint?
).If you need to set one of the SelectList items as selected, you can use:
Just try this in razor
and then
or