Удаление части данных из двух разных моделей представления - PullRequest
0 голосов
/ 05 января 2020

, поэтому я хочу удалить часть данных, которая находится в списке. Пример, объясняющий это лучше:

У пассажира есть список забронированных рейсов. Теперь на странице пассажиров у меня есть возможность проверить их данные. поэтому я вхожу туда и вижу список забронированных рейсов. но тогда мне нужно удалить одну из его бронирований.

Вот проблема. Я не уверен, как это сделать, поскольку данные требуют двух разных наборов данных.

Страница сведений содержит информацию о пассажире, а также вызывает частичное представление всех его бронирований. Вот некоторый код.

Просмотр сведений о пассажире:

@model WebSite.Models.PassengerViewModels.PassengerDetialsViewModel

@{
    ViewData["Title"] = "Details";
}

<h2>Details</h2>

<div>
    <h4>PassengerDetailsViewModel</h4>
    <hr />
    <dl class="dl-horizontal">
        <dt>
            @Html.DisplayNameFor(model => model.IdC)
        </dt>
        <dd>
            @Html.DisplayFor(model => model.IdC)
        </dd>
        <dt>
            @Html.DisplayNameFor(model => model.Surname)
        </dt>
        <dd>
            @Html.DisplayFor(model => model.Surname)
        </dd>
        <dt>
            @Html.DisplayNameFor(model => model.FirstName)
        </dt>
        <dd>
            @Html.DisplayFor(model => model.FirstName)
        </dd>
        <dt>
            @Html.DisplayNameFor(model => model.Email)
        </dt>
        <dd>
            @Html.DisplayFor(model => model.Email)
        </dd>
    </dl>
</div>

<h4>Number of Flight: @Model.Flight.Count()</h4>

<partial name="_Flights" for="Flights" />

<div>
    @Html.ActionLink("Edit", "Edit", new { id = Model.IdC }) |
    <a asp-action="Index">Back to List</a>
</div>

Тогда мое частичное представление выглядит так:

@model IEnumerable<WebSite.Models.PassengerViewModels.FlightsViewModel>

<table class="table">
    <thead>
        <tr>
            <th>
                @Html.DisplayNameFor(model => model.IdF)
            </th>
            <th>
                @Html.DisplayNameFor(model => model.FNumber)
            </th>
            <th>
                @Html.DisplayNameFor(model => model.Date)
            </th>
            <th>
                @Html.DisplayNameFor(model => model.Duration)
            </th>
            <th>
                @Html.DisplayNameFor(model => model.Destination)
            </th>
            <th>
                @Html.DisplayNameFor(model => model.Attended)
            </th>
            <th></th>
        </tr>
    </thead>
    <tbody>
@foreach (var item in Model) {
        <tr>
            <td>
                @Html.DisplayFor(modelItem => item.IdF)
            </td>
            <td>
                @Html.DisplayFor(modelItem => item.FNumber)
            </td>
            <td>
                @Html.DisplayFor(modelItem => item.Date)
            </td>
            <td>
                @Html.DisplayFor(modelItem => item.Duration)
            </td>
            <td>
                @Html.DisplayFor(modelItem => item.Destination)
            </td>
            <td>
                @Html.DisplayFor(modelItem => item.Attended)
            </td>
            <td>
                @Html.ActionLink("Delete", "DeleteF", new { Id = item.IdF })
            </td>
        </tr>
}
    </tbody>
</table>

Затем здесь выполняется операция удаления в контроллере. называется DeleteF:

public async Task<IActionResult> DeleteF(int? IdC, int? IdF)
        {
            if (IdC == null && IdF == null)
            {
                return NotFound();
            }

            var flightBooking = await _context.Flights
                .Select(a => new FlightsViewModel
                {
                    IdC = a.IdC,
                    Email = a.Passenger.Email,
                    IdE = a.IdF,
                    Title = a.Flight.FNumber,
                    Attended = a.Attended
                }).FirstOrDefaultAsync(e => e.IdC == IdC);


            if (flightBooking == null)
            {
                return NotFound();
            }

            return View(flightBooking);
        }

        [HttpPost, ActionName("DeleteF")]
        [ValidateAntiForgeryToken]
        public async Task<IActionResult> DeleteConfirmedF(int? IdC, int? IdF)
        {
            var flightBooking = await _context.Flights.FindAsync(IdC, IdF);
            _context.Guests.Remove(flightBooking);
            await _context.SaveChangesAsync();
            return RedirectToAction(nameof(Index));
        }

Я знаю, что мне нужно передать два идентификатора в операцию удаления, но я не уверен, как передать идентификатор пассажира через частичное представление.

Редактировать:

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

Также здесь есть страница «Удалить», если она вообще помогает:

@model WebSite.Models.PassengerViewModels.FlightsViewModel

@{
    ViewData["Title"] = "DeleteF";
}

<h2>DeleteB</h2>

<h3>Are you sure you want to delete this?</h3>
<div>
    <h4>FlightsViewModel</h4>
    <hr />
    <dl class="dl-horizontal">
        <dt>
            @Html.DisplayNameFor(model => model.IdC)
        </dt>
        <dd>
            @Html.DisplayFor(model => model.IdC)
        </dd>
        <dt>
            @Html.DisplayNameFor(model => model.Email)
        </dt>
        <dd>
            @Html.DisplayFor(model => model.Email)
        </dd>
        <dd>
            @Html.DisplayFor(model => model.IdF)
        </dd>
        <dt>
            @Html.DisplayNameFor(model => model.IdE)
        </dt>
        <dt>
            @Html.DisplayNameFor(model => model.FNumber)
        </dt>
        <dd>
            @Html.DisplayFor(model => model.FNumber)
        </dd>
        <dt>
            @Html.DisplayNameFor(model => model.Attended)
        </dt>
        <dd>
            @Html.DisplayFor(model => model.Attended)
        </dd>
    </dl>

    <form asp-action="Delete">
        <input type="hidden" asp-for="IdC" />
        <input type="hidden" asp-for="IdF" />
        <input type="submit" value="Delete" class="btn btn-default" /> |
        <a asp-action="Index">Back to List</a>
    </form>
</div>

Чтобы прояснить ситуацию. У меня есть 3 таблицы данных, с которыми я работаю. одна - это таблица пассажиров с Id C в качестве первичного ключа, вторая - это таблица рейсов, в которой IdF является первичным ключом, а последняя таблица - это таблица бронирования рейсов (я знаю, что в моем коде это должно быть слово), которая имеет составной ключ с Id C и IdF.

Edit 2:

Вот модель представления для пассажира:

namespace WebSite.Models.PassengerViewModels
{
    public class PassengerDetialsViewModel
    {
        [Display(Name ="Passenger ID ")]
        public int IdC { get; set; }

        [Display(Name ="Surname ")]
        [Required]
        public string Surname { get; set; }

        [Display(Name ="First Name ")]
        [Required]
        public string FirstName { get; set; }

        [Display(Name ="E-mail Address ")]
        [Required]
        [DataType(DataType.EmailAddress)]
        public string Email { get; set; }

        public IEnumerable<FlightsViewModel> Events { get; set; }
    }
}

Ответы [ 2 ]

1 голос
/ 07 января 2020

Я знаю, что мне нужно передать два идентификатора в операцию удаления, но я не уверен, как передать идентификатор пассажира через частичное представление.

Помощник тега <partial> имеет view-data атрибут для передачи данных в частичное представление. Таким образом, в вашем представлении сведений о пассажирах измените вызов на частичное представление:

<partial name="_Flights" model=" @Model.Flights" view-data='@new ViewDataDictionary(ViewData) { { "IdC", Model.IdC } }' />

В вашем частичном представлении вы можете иметь доступ к IdC с использованием ViewBag.IdC или ViewData["IdC"].

Пропуск IdC в DeleteF действие:

@Html.ActionLink("Delete", "DeleteF", new {IdC = ViewBag.IdC, IdF = item.IdF })
0 голосов
/ 06 января 2020

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

ПРИМЕЧАНИЕ. Этот пример работает, если FlightViewModel.Id является первичным ключом в объекте FlightBooking. Уточните, пожалуйста, определение сущности FlightViewModel и FlightBooking, если первичным ключом не является Id.

Удачи.

Добавьте представление с именем DeleteF.cs html

@model FlightsViewModel

<h1>Delete</h1>

<h3>Are you sure you want to delete this?</h3>
<div>
    <h4>Flight @Model.Id</h4>
    <hr />
    <dl class="row">
        <dt class = "col-sm-2">
            @Html.DisplayNameFor(model => model.Id)
        </dt>
        <dt class = "col-sm-10">
            @Html.DisplayFor(model => model.Id)
        </dt>      
    </dl>

    <form asp-action="DeleteF">
        <input type="hidden" asp-for="Id" />
        <input type="submit" value="Delete" class="btn btn-danger" />
    </form>
</div>

Попробуйте это для вашей разметки в вашем частичном представлении.

@model IEnumerable<WebSite.Models.PassengerViewModels.FlightsViewModel>

<table class="table">
    <thead>
        <tr>
            <th>
                @Html.DisplayNameFor(model => model.Id)
            </th>
            <th>
                @Html.DisplayNameFor(model => model.FNumber)
            </th>
            <th>
                @Html.DisplayNameFor(model => model.Date)
            </th>
            <th>
                @Html.DisplayNameFor(model => model.Duration)
            </th>
            <th>
                @Html.DisplayNameFor(model => model.Destination)
            </th>
            <th>
                @Html.DisplayNameFor(model => model.Attended)
            </th>
            <th></th>
        </tr>
    </thead>
    <tbody>
@foreach (var item in Model) {
        <tr>
            <td>
                @Html.DisplayFor(modelItem => item.Id)
            </td>
            <td>
                @Html.DisplayFor(modelItem => item.FNumber)
            </td>
            <td>
                @Html.DisplayFor(modelItem => item.Date)
            </td>
            <td>
                @Html.DisplayFor(modelItem => item.Duration)
            </td>
            <td>
                @Html.DisplayFor(modelItem => item.Destination)
            </td>
            <td>
                @Html.DisplayFor(modelItem => item.Attended)
            </td>
            <td>
                @*Passing Id to DeleteF action*@
                @Html.ActionLink("Delete", "DeleteF", new { Id = item.Id })
            </td>
        </tr>
}
    </tbody>
</table>

Попробуйте это для методов удаления в вашем контроллере.

public async Task<IActionResult> DeleteF(int Id)
{

    var flightBooking = await _context.Flights
    .Select(a => new FlightsViewModel
    {
        Id = a.Id
        IdC = a.CustomerId,
        Email = a.Customer.Email,
        IdE = a.EventId,
        Title = a.Event.FNumber,
        Attended = a.Attended
    }).FirstOrDefaultAsync(e => e.Id == Id);


    if (flightBooking == null)
    {
        return NotFound();
    }

    return View(flightBooking);
}        

[HttpPost, ActionName("DeleteF")]
[ValidateAntiForgeryToken]
public async Task<IActionResult> DeleteConfirmedF(FlightsViewModel model)
{
    var flightBooking = await _context.Flights.FindAsync(model.Id);
    _context.Flights.Remove(flightBooking);
    await _context.SaveChangesAsync();
    return RedirectToAction(nameof(Index));
}
...