2013-12-01 2 views
2

Сначала я пытаюсь создать приложение MVC4 с базой данных EF, которое я только начал изучать 2 дня назад. Проблема, с которой я столкнулся, заключается в том, что у меня есть список клиентов, у которого есть атрибут «IsDeleted» со значением true или false.Как удалить несколько элементов списка в MVC?

В основном я хочу удалить всех клиентов, у которых есть свой атрибут IsDeleted, помеченный как истинный одновременно, нажав ссылку или кнопку.

До сих пор я пытался сделать это, но, кажется, я еще немного расплывчатым о том, как все это работает:

В моей 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"); 
    } 

Так что я немного не уверен, куда идти дальше, или даже если это жизнеспособно в качестве подхода. Если это жизнеспособно, как вызвать это действие во взглядах?

Любая идея будет оценена по достоинству.

С уважением,

ответ

3

У вас есть избыточный код в методе сообщения. Вы запрашиваете базу данных и получаете нужный результат. Эти объекты, в свою очередь, попадают в список, и после этого вы повторяете их, чтобы удалить их. Кроме того, вы забываете указать свой контекст, чтобы сохранить изменения. Вы можете соскоблить некоторые циклы времени, памяти и центрального процессора за счет сокращения этого:

[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)); 
} 

Я еще немного не уверены, что вы имеете в виду, как вызвать это в представлениях.

+0

Большое спасибо за такой быстрый ответ, когда я спросил, как его вызвать, я хочу, чтобы я хотел просмотреть список всех элементов, которые помечены как истинные для удаления, тогда у меня была бы кнопка или actionlink в этом представлении, чтобы щелкнуть, и все будет удалено. Надеюсь, это яснее? – user3054090

+0

Это довольно просто. Щелкните правой кнопкой мыши на свой метод 'DeleteAll()' и затем создайте представление. Выберите шаблон списка. В этом представлении вы можете создать кнопку, которая вызывает метод POST метода DeleteAllConfirmed(), и все готово. Я предлагаю вам работать через официальные руководства по http://www.asp.net/mvc/tutorials, чтобы изучить основы. – Marco

+0

Мне удалось это сделать, это была опечатка, из-за которой я думал, что мой код не прав, еще раз спасибо за вашу помощь :) – user3054090

Смежные вопросы