实体框架&;ASP.NET MVC更复杂的模型
本文关键字:MVC 复杂 模型 NET ASP 框架 amp 实体 | 更新日期: 2023-09-27 18:24:39
我有实体框架模型,它包含对其他实体(如)的引用
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)的"编辑视图"。
默认情况下,我已经创建了连接实体模型的基本MVC控制器,它创建了类似于编辑的:
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不包含Shop选择器。
我已经尝试添加DropDown类似:
@Html.DropDownListFor(product => product.Shop, (SelectList)ViewBag.Shops)
但在POST方法中,Shop实体为null。
如何处理?
创建一个视图模型来表示要显示的
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)
{
....
}
请注意,您可以使用诸如automapper之类的工具来简化映射
我希望这能有所帮助。
产品型号:
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" })