首先,不要绑定Order实体。永远不要绑定到 EF 对象,总是尝试使用视图模型。让视图的生活变得更简单,这就是这里的目标。
所以,有一个像这样的 ViewModel:
public class CreateOrderViewModel
{
public int OrderId { get; set; }
public DateTime OrderDate { get; set; }
public int SelectedProductId { get; set; }
public IEnumerable<SelectListItem> Products { get; set; }
}
现在就是这样。
将其返回到您的视图中[HttpGet]
控制器动作:
[HttpGet]
public ActionResult Create()
{
var model = new CreateOrderViewModel
{
Products = db.Products
.ToList() // this will fire a query, basically SELECT * FROM Products
.Select(x => new SelectListItem
{
Text = x.ProductName,
Value = x.ProductId
});
};
return View(model);
}
然后渲染出产品列表:(基本 HTML 除外)
@model WebApplication.Models.CreateOrderViewModel
@Html.DropDownListFor(model => model.SelectedProductId, Model.Products)
我唯一不知道该怎么做的是绑定到日期时间字段。我猜你需要一个扩展方法(HTML Helper)来呈现日期选择器或其他东西。对于此视图(创建新订单),只需默认为DateTime.Now
.
现在,到[HttpPost]
控制器动作:
[HttpPost]
public ActionResult Create(CreateOrderViewModel model)
{
try
{
// TODO: this manual stitching should be replaced with AutoMapper
var newOrder = new Order
{
OrderDate = DateTime.Now,
OrderProduct = new OrderProduct
{
ProductId = SelectedProductId
}
};
db.Orders.AddObject(newOrder);
return RedirectToAction("Index");
}
catch
{
return View();
}
}
现在,我还认为您的 EF 模型需要改进。
对我来说(用英语来说),一个产品可以有多个订单,一个订单可以有多个产品。
所以,它应该是多对多。目前它是具有冗余连接表的 1-1。你是从数据库生成的吗?如果是这样,您的数据库可能需要工作。
您应该有一个名为的导航属性Products on the Order实体,它引用了一个集合Product,通过静默连接到多对多的连接表来实现。
这也意味着您不再拥有 DropDownList,而是 MultiSelectDropDownList。