无法从视图到控制器方法更新列表集合

时间:2017-03-16 19:47:35

标签: c# razor linq-to-sql asp.net-mvc-5

我正在尝试从视图中捕获Bullet_Points列表到Edit Method。但是我无法将收集项目保存到数据库。

@for (int i = 0; i < Model.Specifications.Count(); i++)
{ 
    @Html.LabelFor(x => x.Specifications[i].Bullet_Point)
    @Html.EditorFor(x => x.Specifications[i].Bullet_Point)
    @Html.ValidationMessageFor(x => x.Specifications[i].Bullet_Point)
}

Edit()方法中,我需要使用两个for循环,使用以下循环格式,我不会看到Bullet_Points被保存到数据库。

  1. 第一个for循环,其中包含来自View
  2. 的集合项的模型计数
  3. 循环查询结果的第二个foreach循环,将规范模型从View绑定到DB。
  4. 控制器

    [HttpPost]
    public ActionResult Edit(FormCollection form, ProductVm2 VM)
    {
        List<Specification> spec = (from sp in db.Specifications
                                    where sp.Product_ID == VM.Product.ProductID
                                    select sp).ToList();
    
        for (int i = 0; i < VM.Specifications.Count(); i++)
        {
            foreach (var sp in spec) {
                sp.Bullet_Point = VM.Specifications[i].Bullet_Point;
            }
            db.savechanges();
        }
    

1 个答案:

答案 0 :(得分:1)

foreach的每次迭代中,您将当前规范VM.Specifications[i]的值分配给规范中的所有规范。这段代码的结果......

for (int i = 0; i < VM.Specifications.Count(); i++)
{
    foreach (var sp in spec)
    {
        sp.Bullet_Point = VM.Specifications[i].Bullet_Point;
    }
    db.savechanges();
}

... spec中的所有规范都具有Bullet_Point中最后VM.Specifications的值。

这应该会引起意想不到的变化,所以我不明白为什么你没有看到它们。

将视图模型更改与数据库实体同步的正确方法是:

var pairs = from vmSpec in VM.Specifications
            join dbSpec in spec on vmSpec.SpecificationId equals dbSpec.SpecificationId
            select new { vmSpec, dbSpec };
foreach(var pair in pairs)
{
    pair.dbSpec.Bullet_Point = pair.vmSpec.Bullet_Point;
}

db.SaveChanges();

这将视图模型和数据库中的规范配对,假设它们的主键是SpecificationId,并复制值。