7

I use a dropdownlist in one of my create.aspx but it some how doesnt seem to work...

public IEnumerable<SelectListItem> FindAllMeasurements()
    {
        var mesurements = from mt in db.MeasurementTypes
                          select new SelectListItem
                          {
                             Value = mt.Id.ToString(),
                             Text= mt.Name
                          };
        return mesurements;
    }

and my controller,

 public ActionResult Create()
    {
      var mesurementTypes = consRepository.FindAllMeasurements().AsEnumerable();
     ViewData["MeasurementType"] = new SelectList(mesurementTypes,"Id","Name");
     return View();
    } 

and my create.aspx has this,

<p>
  <label for="MeasurementTypeId">MeasurementType:</label>
    <%= Html.DropDownList("MeasurementType")%>
     <%= Html.ValidationMessage("MeasurementTypeId", "*") %>
   </p>

When i execute this i got these errors,

DataBinding: 'System.Web.Mvc.SelectListItem' does not contain a 
 property with the name 'Id'.
ACP
  • 34,682
  • 100
  • 231
  • 371

2 Answers2

7

In your controller you are creating a new SelectList from IEnumerable<SelectListItem> which is not correct because you've already specified the Value and Text properties.

You have two options:

public ActionResult Create()
{
    var mesurementTypes = consRepository.FindAllMeasurements();
    ViewData["MeasurementType"] = mesurementTypes;
    return View();
}

or:

public ActionResult Create()
{
    ViewData["MeasurementType"] = new SelectList(db.MeasurementTypes, "Id", "Name");
    return View();
}

There's also a third and preferred way using strongly typed view:

public ActionResult Create()
{
    var measurementTypes = new SelectList(db.MeasurementTypes, "Id", "Name");
    return View(measurementTypes);
}

and in the view:

<%= Html.DropDownList("MeasurementType", Model, "-- Select Value ---") %>
Darin Dimitrov
  • 1,023,142
  • 271
  • 3,287
  • 2,928
1

As the error message implies, you need an IEnumerable<SelectList>, not an IEnumerable<Materials>.

The constructor for SelectList has an overload that takes an IEnumerable. See .net MVC, SelectLists, and LINQ

Community
  • 1
  • 1
Robert Harvey
  • 178,213
  • 47
  • 333
  • 501