如何删除MVC中的多个列表项?

时间:2013-12-01 09:32:34

标签: c# asp.net-mvc asp.net-mvc-4

我正在尝试用EF数据库创建一个MVC4应用程序,我刚刚开始在2天前自己学习。 我面临的问题是我有一个客户列表,其属性为“IsDeleted”,其值为true或false。

基本上我想通过点击链接或按钮删除所有同时将IsDeleted属性标记为true的客户。

到目前为止,我已经尝试过这些,但似乎我对它的运作方式仍然有点模糊:

在我的CustomerController中,我添加了以下代码:

        public ActionResult DeleteAll()
    {
        List<Customer> cusList = new List<Customer>();
        IEnumerable<Customer> customerList = db.Customers.ToList().Where(i => i.IsDeleted == true);
        foreach (var Item in customerList) { cusList.Add(Item); }
        return View(customerList);
    }

    [HttpPost, ActionName("DeleteAll")]
    [ValidateAntiForgeryToken]
    public ActionResult DeleteAllConfirmed()
    {
        List<Customer> cusList = new List<Customer>();
        IEnumerable<Customer> customerList = db.Customers.ToList().Where(i => i.IsDeleted == true);
        foreach (var Item in customerList) { cusList.Add(Item); }
        foreach (var item in cusList) { db.Customers.Remove(item); }
        return RedirectToAction("Index");
    }

所以我有点不确定下一步该去哪,或者即使这样做是可行的。 如果它可行,如何在视图中调用此操作?

任何想法都会受到赞赏。

致以最诚挚的问候,

1 个答案:

答案 0 :(得分:3)

你的post方法中有一些冗余代码。您正在查询数据库并获得所需的结果。反过来,这些实体被抛入一个列表中,然后在迭代它们以删除它们。此外,您忘记告诉您的上下文保存更改。你可以通过缩短这个来缩短一些时间,内存和cpu周期:

[HttpPost, ActionName("DeleteAll")]
[ValidateAntiForgeryToken]
public ActionResult DeleteAllConfirmed()
{
    IEnumerable<Customer> customerList = db.Customers.Where(i => i.IsDeleted == true);
    //Now you have everything you need.
    foreach (var Item in customerList) 
    { 
        //Remove
        db.Customers.Remove(Item); 
    }
    //and save. done
    db.SaveChanges(); //important!
    return RedirectToAction("Index");
}

您的DeleteAll()方法也存在一些缺陷。您正在向cusList添加项目,但您永远不会使用它!

public ActionResult DeleteAll()
{
    IEnumerable<Customer> customerList = db.Customers.Where(i => i.IsDeleted == true);
    return View(customerList);
}

如果您愿意,可以将其减少到一行:

public ActionResult DeleteAll()
{
    return View(db.Customers.Where(i => i.IsDeleted == true));
}

我还有点不确定,你对于如何在视图中调用它是什么意思。