我有一个HTML.BeginCollectionItem表单,该表单可以正常工作。但是,我也希望用户只能显示/编辑列表中的一个元素。我的计划是使用一个OrderId(其中包含OrderDetail元素列表)或仅一个OrderDetailId链接到Build视图。然后相应地加载模型。
如果我在查询字符串中输入有效的OrderDetailId而不是OrderId,则会正确加载页面(用于编辑/查看,而不是创建页面)。用于创建的页面永不加载。
这是我的控制器代码:
public PartialViewResult BuildOne(OrderDetailViewModel model)
{
model.StateList = states;
model.CatalogItems = db.CatalogItems.ToList();
return PartialView("_BuildOne", model);
}
[HttpGet]
public ActionResult Build(BuildViewModel model, int? OrderDetailId, string OrderId)
{
model.Od = new List<OrderDetailViewModel>();
if (OrderDetailId != null)
{
OrderDetail model2 = db.OrderDetail.Where(a => a.Id == OrderDetailId).First();
model.Od.Add(new OrderDetailViewModel() {
OrderId = model2.OrderId,
Message = model2.Message,
CatalogItems = db.CatalogItems.ToList(),
StateList = states });
}
else
{
if(OrderId != null)
{
model.Od.Add(new OrderDetailViewModel() { OrderId = OrderId, CatalogItems = db.CatalogItems.ToList(), StateList = states });
}
else
{
model.Od.Add(new OrderDetailViewModel() { CatalogItems = db.CatalogItems.ToList(), StateList = states });
}
}
return View(model);
}
[HttpPost]
public ActionResult Build(BuildViewModel model)
{
if (model.OrderId == null)
{
Orders order = new Orders();
order.OrderId = Guid.NewGuid().ToString();
model.OrderId = order.OrderId;
db.Orders.Add(order);
db.SaveChanges();
}
foreach(var m in model.Od)
{
OrderDetail od = new OrderDetail();
od.Status = "Pending Checkout";
od.OrderId = model.OrderId;
od.Message = m.Message;
db.OrderDetail.Add(od);
db.SaveChanges();
}
ViewBag.Data = "Box added successfully!";
if(User.Identity.IsAuthenticated)
{
Orders Order = db.Orders.Where(x => x.OrderId == model.OrderId).First();
Order.UserId = User.Identity.GetUserId();
db.SaveChanges();
return RedirectToAction("Checkout1", "Home", new { model.OrderId });
}
else
{
return RedirectToAction("Register", "Account", new { model.OrderId });
}
}
由于某种原因,在[HttpPost]方法上,foreach(var m in model.Od)
始终为null。