Как удалить конкретный элемент списка в MVC? - PullRequest
0 голосов
/ 29 августа 2018

ребята, это мой домашний контроллер, где я объявил контроллеры и создал список классов и представлений действий.

namespace MvcApplication6.Controllers
{

public class Trains
{
    public string tname { get; set; }
    public int tno { get; set; }
    public string from { get; set; }
    public string to { get; set; }
}


public class HomeController : Controller
{


    public ActionResult Index()
    {
        ViewBag.message = "Welcome to trains list!";



        return View();

    }

    public ActionResult About()
    {
        List<Trains> details = new List<Trains>() { };
        details.Add(new Trains() { tname = "vaigai", tno = 123, from = "Chennai", to = "trichy" });
        details.Add(new Trains() { tname = "express", tno = 456, from = "banglore", to = "chennai" });

        return View(details);
    }

и это моя html-страница, где я заставляю контроллеры отображать список один за другим в таблице

@{
ViewBag.Title = "delete";
}


@{
ViewBag.Title = "Available Trains";
}

@model List<MvcApplication6.Controllers.Trains>
<h2>list of available trains are:</h2>
<p> 
 <table>
         <tr>
             <th>TRAIN NAME</th>
             <th>TRAIN NUMBER</th>
             <th>FROM</th>
             <th>TO</th>
             <th>Delete</th>
         </tr>

@foreach (var item in @Model)
{
    <tr style="color: blue">
        <td>@item.tname</td>
        <td>@item.tno</td>
        <td>@item.from</td>
        <td>@item.to</td>
        <td> @Html.ActionLink("Delete","About",new{i = item.tno})</td>
    </tr>
}
 </table>

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

1 Ответ

0 голосов
/ 29 августа 2018

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

Я бы пошел с чем-то вроде этого:

public class TrainManagerController : Controller
{
    // the train list is set at Controller level
    private List<Trains> TrainList;

    // and populated when the controller is instantiated
    public TrainManagerController(List<Trains> trainList)
    {
        TrainList = trainList;
    }

    // this calls the view with the train list you have at the moment
    public ViewResult Index()
    {
        return View(TrainList);
    }

    // this deletes the train, then calls the index view.
    public RedirectToRouteResult DeleteFromList(int TrainNumber)
    {
        TrainList.Remove(TrainList.FirstOrDefault(t => t.tno == TrainNumber));
        return RedirectToAction("Index");
    }
}

По виду:

@foreach (var item in @Model)
{
    <tr style="color: blue">
        <td>@item.tname</td>
        <td>@item.tno</td>
        <td>@item.from</td>
        <td>@item.to</td>
        <td> @Html.ActionLink("Delete", "DeleteFromList", new {TrainNumber = item.tno})</td>
    </tr>
}

Однако отсутствует часть: как передать объект List<Trains> в аргументы конструктора? Обычно это делается с помощью Dependency Injection , где - в подобных случаях - также реализуется соединение с БД, поэтому вы запрашиваете интерфейс (назовем его здесь ITrains), а правильно настроенный сторонний компонент дает вам Список населенных пунктов.

Я знаю, что эта тема может вызвать у вас головную боль, поэтому вы можете ее кратко пропустить, пока не разберетесь с основами работы контроллеров и методов действий и не создадите этот объект по-другому:

Создайте новый класс TrainContext, который будет хранить список поездов и будет иметь методы для работы с этим списком (вам нужно удалить, помните?):

public class TrainContext
{
    private static List<Trains> trainList = null;

    public TrainContext()
    {
        if (trainList == null)
        {
            trainList = new List<Trains>();
            trainList.Add(new Trains() { tname = "vaigai", tno = 123, from = "Chennai", to = "trichy" });
            trainList.Add(new Trains() { tname = "express", tno = 456, from = "banglore", to = "chennai" });
        }
    }

    public List<Trains> GetTrains()
    {
        return trainList;
    }

    public void Delete(int TrainNumber)
    {
        if (trainList.Count > 0)
            trainList.Remove(trainList.FirstOrDefault(t => t.tno == TrainNumber));
    }
}

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

public class TrainManagerController : Controller
{
    private TrainContext context;

    public TrainManagerController()
    {
        context = new TrainContext();
    }

    public ViewResult Index()
    {
        return View(context.GetTrains());
    }

    public RedirectToRouteResult DeleteFromList(int TrainNumber)
    {
        context.Delete(TrainNumber);
        return RedirectToAction("Index");
    }
}

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...