У меня есть форма HTML.BeginCollectionItem, которая работает правильно.Однако я также хотел бы, чтобы пользователи могли отображать / редактировать только один элемент из списка.Мой план состоит в том, чтобы связать с представлением Build EITHER OrderId (который содержит список элементов OrderDetail) или просто OrderDetailId, а затем загрузить модель соответствующим образом.
Страница (для редактирования / просмотра, а не для создания) корректно загружается, если в строку запроса введен действительный 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)
всегда равно нулю.