Я бы создал класс для Product и Property Properties в моей основной viewmodel типа List
public class ProductViewModel
{
public int ID { set;get;}
public string Name { set;get;}
}
public class OrderViewModel
{
public int OrderNumber { set;get;}
public List<ProductViewModel> Products { set;get;}
public int SelectedProductId { set;get;}
}
и в вашем методе действия контроллера
public ActionResult Order()
{
var orderVM=new OrderViewModel();
//Items hard coded for demo. You may replace with values from your db
orderVM.Products= new List<ProductViewModel>
{
new ProductViewModel{ ID=1, Name="IPhone" },
new ProductViewModel{ ID=2, Name="MacBook Pro" },
new ProductViewModel{ ID=3, Name="iPod" }
};
return View(orderVM);
}
и, по вашему мнению, строго типизировано для OrderViewModel.
@model ORderViewModel
@using (Html.BeginForm())
{
<p>
@Html.DropDownListFor(x => x.SelectedProductId ,
new SelectList(Model.Products, "ID", "Name"), "-- Select Product--")
</p>
<input type="submit" />
}
Я также добавил свойство SelectedProductId
, поэтому вы получите выбранное пользователем значение из раскрывающегося списка в этом свойстве, когда пользователь отправит форму обратно в контроллер.
Вы также можете использовать общую коллекцию типов SelectListItem
в качестве свойства модели представления для переноса раскрывающихся данных вместо пользовательской ProductViewModel
коллекции.
public class OrderViewModel
{
public int OrderNumber { set;get;}
public List<SelectListItem> Products { set;get;}
public int SelectedProductId { set;get;}
}
и в действии GET
public ActionResult Order()
{
var orderVM=new OrderViewModel();
//Items hard coded for demo. You may replace with values from your db
orderVM.Products= new List<SelectListItem>
{
new SelectListItem {Value = "1", Text = "IPhone"},
new SelectListItem {Value = "2", Text = "MacBook"},
new SelectListItem {Value = "3", Text = "Candy"}
};
return View(orderVM);
}
А по вашему мнению,
@Html.DropDownListFor(x => x.SelectedProductId, Model.Products, "-- Select Product--")
РЕДАКТИРОВАТЬ: В соответствии с запросом от OP отредактировал ответ, чтобы свойство возвращало статические элементы в качестве продуктов
Я добавил реализацию get в свойство Products, чтобы получить список статических продуктов.
public class OrderViewModel
{
private List<ProductViewModel> _products;
public int OrderNumber { set; get; }
public List<ProductViewModel> Products
{
get
{
if (_products == null)
{
_products = new List<ProductViewModel>();
_products.Add(new ProductViewModel { ID = 1, Name = "Ketchup" });
_products.Add(new ProductViewModel { ID = 1, Name = "Mustard" });
_products.Add(new ProductViewModel { ID = 1, Name = "Relish" });
_products.Add(new ProductViewModel { ID = 1, Name = "Mayo" });
}
return _products;
}
}
public int SelectedProductId { set;get;}
}
Теперь в вашем контроллере вам не нужно вызывать метод GetAvailableProducts, поскольку он уже там. Таким образом, контроллер будет выглядеть следующим образом.
public ActionResult Order()
{
OrderViewModel orderVM = new OrderViewModel();
return View(orderVM);
}
Вот вывод.

Если у вас есть много элементов в продуктах, переместите его в метод и вызовите этот метод, чтобы он получил реализацию вместо того, чтобы записывать это там. Это намного чище.