所以我想删除列表中的一段数据。 这样一个例子可以更好地解释它:
乘客有预订的航班列表。 现在,在乘客页面上,我可以选择查看他们的详细信息。 所以我进入那里,我看到了预订的航班列表。 但是我需要删除他的一个预订。
这是问题所在。 我不确定如何做到这一点,因为数据需要两个不同的数据集。
详细信息页面包含乘客的详细信息,并且还显示其所有预订的部分视图。 这是一些代码。
乘客详细信息视图:
@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));
}
我知道我需要将两个 ID 传递到删除操作中,但我不确定如何通过部分视图传递乘客 ID。
编辑:
航班预订的数据位于其自己的列表中,该列表具有乘客和航班的组合键。 这就是为什么我需要将乘客 ID 与航班 ID 一起传递
。如果有帮助,这里也是删除页面:
@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 个数据表。一个是以 IdC 为主键的乘客表,两个是以 IdF 为主键的航班表,最后一个表是航班预订表(我知道我应该在我的代码中这么说(,它有一个组合键,即 IdC 和 IdF。
编辑 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; }
}
}
我需要将两个 id 传递到删除操作中,但我不确定如何通过部分视图传递乘客 ID。
<partial>
标记帮助程序具有将数据传递到分部视图view-data
属性。因此,在乘客详细信息视图中,将调用修改为部分视图:
<partial name="_Flights" model=" @Model.Flights" view-data='@new ViewDataDictionary(ViewData) { { "IdC", Model.IdC } }' />
在您的部分视图中,您可以使用ViewBag.IdC
或ViewData["IdC"]
访问IdC
。
将IdC
传递给DeleteF
操作:
@Html.ActionLink("Delete", "DeleteF", new {IdC = ViewBag.IdC, IdF = item.IdF })
下面是一个使用 FlightsViewModel.Id 属性删除航班预订的示例。
注意:如果 FlightsViewModel.Id 是航班预订实体中的主键,则此示例有效。请详细说明 FlightsViewModel 和 FlightBooking 实体的定义(如果主键不是 Id(。
祝你好运。
添加一个名为 DeleteF.cshtml 的视图
@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));
}