Ответ 1
Я бы создал класс для Product и создать свойство Products в моей главной модели просмотра, которая имеет тип 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 отредактирован ответ, чтобы свойство возвращало статические элементы в качестве продуктов
Я добавил реализацию реализации в свойство 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;}
}
Теперь в вашем контроллере вам не нужно вызывать метод GetAvailableProductsmethod, поскольку он уже существует. Таким образом, контроллер будет выглядеть следующим образом.
public ActionResult Order()
{
OrderViewModel orderVM = new OrderViewModel();
return View(orderVM);
}
Вот результат.
Если у вас много элементов в продуктах, переместите их в метод и вызовите этот метод int, он получает реализацию вместо того, чтобы писать там. Это намного более чистый подход.