我会在我的主视图模型中为产品创建一个类并创建产品属性,它是列表类型
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 属性添加了一个 get 实现以返回静态产品列表。
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);
}
这是输出。
如果您的产品中有很多项目,请将其移至一个方法并在他获得实现时调用该方法,而不是在那里编写。这是更清洁的方法。