Во-первых, не связывайтесь с сущностью Order . Никогда не привязывайте к объекту EF, всегда пытайтесь использовать ViewModel . Упрощает жизнь для Представления, и это является целью здесь.
Итак, у вас есть 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; }
}
Вот и все.
Верните это в View в действии [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)
Единственное, что я не знаю, как это сделать, это привязать поле DateTime. Я предполагаю, что вам понадобится метод расширения (HTML Helper), который выводит Date Picker или что-то в этом роде. Для этого вида (создания нового заказа) по умолчанию используется 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 в сущности Order , которое ссылается на коллекцию Product , которая стала возможной благодаря автоматическому объединению в объединение стол во многих ко многим.
Это также означает, что у вас больше нет DropDownList, но есть MultiSelectDropDownList.