Вы не передаете какую-либо модель представлению в своем действии.Также не следует использовать то же свойство, что и первый и второй аргумент хелпера DropDownListFor
.Первый аргумент, который вы передаете как лямбда-выражение, соответствует скалярному свойству в вашей модели представления, которое будет содержать выбранное значение и которое позволит вам получить это значение обратно при отправке формы.Второй аргумент - это коллекция.
Так что вы можете немного адаптировать свой код:
Модель:
public class Hobbies
{
[Required]
public string SelectedHobbyId { get; set; }
public IEnumerable<SelectListItem> AvailableHobbies { get; set; }
... some other properties that are irrelevant to the question
}
Контроллер:
public class HomeController: Controller
{
public ActionResult Create()
{
// obviously those values might come from a database or something
var values = new[]
{
new { Value = "1", Text = "Dancing" },
new { Value = "2", Text = "Painting" },
new { Value = "3", Text = "Singing" },
};
var model = new Hobbies
{
AvailableHobbies = values.Select(x => new SelectListItem
{
Value = x.Value,
Text = x.Text
});
};
return View(model);
}
[HttpPost]
public ActionResult Create(Hobbies hobbies)
{
// hobbies.SelectedHobbyId will contain the id of the element
// that was selected in the dropdown
...
}
}
Вид:
@model Hobbies
@using (Html.BeginForm())
{
@Html.LabelFor(x => x.SelectedHobbyId)
@Html.DropDownListFor(x => x.SelectedHobbyId, Model.AvailableHobbies)
@Html.ValidationMessageFor(x => x.SelectedHobbyId)
<button type="submit">Create</button>
}