[英]Entity Framework & ASP.NET MVC more complex models
我有实体框架模型,其中包含对其他实体的引用,例如
public class Product
{
[Key]
public int ProductID { get; set; }
[Required]
public string Name { get; set; }
[Required]
public virtual Shop Shop { get; set; }
[Required]
public double Price { get; set; }
}
我想创建包含Shop
选择器(DropDown)的Edit View。
默认情况下,我已经创建了连接了实体模型的基本MVC控制器,该模型创建了Edit:
public ActionResult Edit(int? id)
{
if (id == null)
{
return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
}
Product product = db.Products.Find(id);
if (product == null)
{
return HttpNotFound();
}
return View(product);
}
并且View不包含商店选择器。
我试图添加DropDown像这样:
@Html.DropDownListFor(product => product.Shop, (SelectList)ViewBag.Shops)
但是在POST方法中,Shop实体为null。
如何处理?
我希望这有帮助。
产品型号:
public class Product
{
public int ProductID { get; set; }
public string Name { get; set; }
public int ShopID { get; set; }
public double Price { get; set; }
}
然后是产品的ViewModel:
public class ProductViewModel
{
public Product Model { get; set; }
public IEnumerable<SelectListItem> Shops{ get; set; }
public ProductViewModel()
{
GetShops();
}
public void GetShops()
{
Shops = new List<SelectListItem>();
var collectionShops = GetShopsFromDatabase();
Shops.AddRange(
collectionShops.Select(
contract =>
new SelectListItem
{
Text = contract.ShopDescription,
Value = contract.ShopID.ToString()
}));
}
}
在您看来:
@model ProductViewModel
....
@Html.DropDownListFor(x => x.Model.ShopID, Model.Shops, new { @title = "Please select a shop" })
创建一个视图模型来表示您要显示的内容
public class ProductVM
{
public int ProductID { get; set; }
[Required]
public string Name { get; set; }
[Required]
public int? ShopID { get; set; }
[Required]
public double Price { get; set; }
public SelectList ShopList { get; set; }
}
然后在您的控制器中,将模型映射到视图模型
public ActionResult Edit(int? ID)
{
....
Product product = db.Products.Find(id);
ProductVM model = new ProductVM();
// map properties
....
// populate select list (assumes Shop has properties ID and Name)
model.ShopList = new SelectList(db.Shops, "ID", "Name");
return View(product);
}
在你看来
@model ProductVM
....
@Html.DropDownListFor(m => m.ShopID, Model.ShopList, "--Select shop--")
@Html.ValidationMessageFor(m -> m.ShopID)
这会回传带有商店ID的模型。 Select
控件回发单个值,因此您不能回发诸如Shop
的复杂对象。 POST方法将是
[HttpPost]
public ActionResult Edit(ProductVM model)
{
....
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.