Dropdown in MVC

asp.net, asp.net-mvc, c#

Solution

1) Add a new property to my ViewModel? What should be the type? List?

You need 2 properties to be more precise: an `IEnumerable<SelectListItem>` to hold all the available options and a scalar property to hold the selected value

2) Define a method that populates the above property with values.

Yes.

3) Use that property in the View? Use HTML.DropdownFor?

No, not in the view. The view doesn't call any methods. A view works with the view model. It is the responsibility of the controller to pass a properly filled view model to the view.

So for example:

public class MyViewModel
{
    public string SelectedValue { get; set; }
    public IEnumerable<SelectListItem> Values { get; set; }

    ... some other properties that your view might need
}

and then a controller action that will populate this view model:

public ActionResult Index()
{
    var model = new MyViewModel();
    model.Values = new[]
    {
        new SelectListItem { Value = "1", Text = "item 1" },
        new SelectListItem { Value = "2", Text = "item 2" },
        new SelectListItem { Value = "3", Text = "item 3" },
    };
    return View(model);
}

and finally the strongly typed view in which you will display the dropdown list:

@model MyViewModel
@Html.DropDownListFor(x => x.SelectedValue, Model.Values)

UPDATE:

According to your updated question you are have an `IEnumerable<SelectListItem>` property on your view model to which you are trying to assign a value of type `IEnumerable<string>` which obviously is impossible. You could convert this to an `IEnumerable<SelectListItem>` like this:

var domains = FetchAllDomains().Select(d => new SelectListItem
{
    Value = d.DomainName,
    Text = d.DomainName
});
return new EmailModel { DomainList = domains };

Problem

In my MVC application, I need to add a dropdown that would show a list of domain names. I already have a ViewModel that contains multiple properties. I am not sure what the sequence of the steps should be: - Add a new property to my `ViewModel`? What should be the type? List? - Define a method that populates the above property with values. - Use that property in the View? Use `HTML.DropdownFor`? I know I should put some code in my Question, but right now I am having difficulty getting started with this... EDIT: Added the following property to the ViewModel: ``` public IEnumerable<SelectListItem> DomainList { get; set; } ``` and implemented a method to return a list of Domains: ``` internal static List<Domain> FetchAllDomains() ``` Next in my controller action, I have: ``` var domains = FetchAllDomains().Select(d => d.DomainName); return new EmailModel() {DomainList = domains }; ``` But I get the following error: Cannot implicitly convert type 'System.Collections.Generic.IEnumerable' to 'System.Collections.Generic.IEnumerable'. An explicit conversion exists (are you missing a cast?)

Original source