0

我有一个搜索页面,允许用户搜索项目并向项目添加详细信息。我正在努力允许用户将相同的详细信息应用于多个项目。用户将检查他想要应用相同更改的所有项目并单击Comment按钮。这将发送检查的项目列表List<int> ids和单击的特定项目(在它已经存在的情况下用作模板)int id

从这里,用户将根据自己的意愿编辑评论并保存。行动将如何HttpPost Edit?如果该项目尚不存在,则需要向数据库添加评论,否则,覆盖存在的内容。以下是我想出的(基本大纲)。我看到的问题是它需要为我想要应用更改的每个项目戳数据库。必须有更好的方法来做到这一点。

[HttpPost]
public ActionResult Edit(CommentVM model)
{
    if (ModelState.IsValid)
    {
        foreach(int i in model.ids)
        {
            Comment comment = _db.Comments.Find(i);
            if(comment == null){
                //Create and add
            {
            else{
                comment.Text = model.Text;
                _db.Entry(comment).State = EntityState.Modified;
            }
        }

        _db.SaveChanges();
        return RedirectToAction("Index");
    }
    return View(model);
}
4

2 回答 2

0

我看到的问题是它需要为我想要应用更改的每个项目戳数据库。

你不必担心这个。保存更改时会调用一次数据库。循环只影响内存中的对象。至于您的代码,您似乎走在正确的轨道上,但我确实有一个潜在的建议。鉴于您修改或创建评论的不同步骤,我假设您已将评论编写并存储为不同的实体,这些实体通过 id 链接到您的项目。如果是这种情况,我建议将“评论”作为项目的属性,这样您就可以简单地写入该属性并简化整个过程。

于 2013-01-30T19:55:17.780 回答
0

我最终使用了一种自制方法。由于这两种情况(添加条目和编辑条目都需要单独处理,我就这样处理了它们。

List<int> InDB = _db.Comments           
    .Where(r => model.ids.Contains(r.id))
    .Select(r => r.id)
    .ToList();

List<int> diff = model.ids.Except(InDB).ToList();
//Loop through items to ADD
foreach (int i in diff)
{
    Comment comment = new Comment { Text = model.Text, id = i };
    _db.Comments.Add(comment);
}
//Loop through items to edit
foreach (int i in InDB)
{
    Comment comment = new Comment { Text = model.Text, id = i };
    _db.Entry(comment).State = EntityState.Modified;
}
于 2013-02-01T20:34:36.480 回答