我正在尝试从视图中捕获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
被保存到数据库。
for
循环,其中包含来自View foreach
循环,将规范模型从View绑定到DB。控制器
[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();
}
答案 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
,并复制值。