繁体   English   中英

实体框架和ASP.NET MVC更复杂的模型

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM