无法从 MVC 视图获取 ICollection 实体
Can't get ICollection entities from MVC View
所以我正在为一家能够处理活动 Table 预订的餐厅制作应用程序。
我想要的是一个事件模型,以及一个 Table 模型,我可以在其中创建表格并将它们用于我之后创建的每个事件。
问题是在事件创建中获取表格后,我无法将这些表格保存为事件的副本(更准确地说,创建 Post 中的 @event.Tables 为空):
事件模型:
public class Event
{
public Event()
{
this.Tables = new HashSet<Table>();
}
public int Id { get; set; }
public string EventName { get; set; }
public String StartDate { get; set; }
public String StartTime { get; set; }
public string ImageURL { get; set; }
public string Description { get; set; }
public virtual ICollection<Table> Tables { get; set; }
}
Table 型号:
public class Table //Model for Table Conf
{
public enum ReservationState {
[Display(Name = "Available")]
Available,
[Display(Name = "Processing")]
Processing,
[Display(Name = "Reserved")]
Reserved
}
public int Id { get; set; }
public int Price { get; set; }
public string TableIdentifier { get; set; }
public int NPeople { get; set; }
public ReservationState ReservationStatus { get; set; }
public virtual int? EventId { get; set; }
}
事件控制器:
// GET: Events/Create
public IActionResult Create()
{
List<Table> tables = _context.Table.Where(t => t.EventId == null).AsNoTracking().ToList();
Event newEvent = new Event();
foreach(Table table in tables)
{
newEvent.Tables.Add(table);
}
return View(newEvent);
}
// POST: Events/Create
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Create([Bind("Id,EventName,StartDate,StartTime,ImageURL,Description,Tables")] Event @event)
{
if (ModelState.IsValid)
{
foreach (Table table in @event.Tables)
{
Table cloneTable = new Table();
_context.Table.Add(cloneTable);
int cloneId = cloneTable.Id;
var sourceValues = _context.Entry(table).CurrentValues;
_context.Entry(cloneTable).CurrentValues.SetValues(sourceValues);
cloneTable.EventId = @event.Id;
cloneTable.Id = cloneId;
}
_context.Add(@event);
await _context.SaveChangesAsync();
return RedirectToAction(nameof(Index));
}
return View(@event);
}
Event Create View(保存表格的部分,因为其他一切正常,我也可以在视图中正确看到表格:
<div class="form-group">
@for (var i = 0; i < Model.Tables.Count; i++)
{
<p>@Model.Tables.ElementAt(i).TableIdentifier - @Model.Tables.ElementAt(i).ReservationStatus - @Model.Tables.ElementAt(i).Id </p>
<input type="hidden" asp-for="@Model.Tables.ElementAt(i).Id" name="@Model.Tables.ElementAt(i).Id"
value="@Model.Tables.ElementAt(i).Id" />
<input type="hidden" asp-for="@Model.Tables.ElementAt(i).NPeople" name="@Model.Tables.ElementAt(i).NPeople"
value="@Model.Tables.ElementAt(i).NPeople" />
<input type="hidden" asp-for="@Model.Tables.ElementAt(i).Price" name="@Model.Tables.ElementAt(i).Price"
value="@Model.Tables.ElementAt(i).Price" />
<input type="hidden" asp-for="@Model.Tables.ElementAt(i).TableIdentifier" name="@Model.Tables.ElementAt(i).TableIdentifier"
value="@Model.Tables.ElementAt(i).TableIdentifier" />
<input type="hidden" asp-for="@Model.Tables.ElementAt(i).EventId" name="@Model.Tables.ElementAt(i).EventId"
value="@Model.Tables.ElementAt(i).EventId" />
<select asp-for="@Model.Tables.ElementAt(i).ReservationStatus" name="@Model.Tables.ElementAt(i).ReservationStatus" asp-items="Html.GetEnumSelectList<Table.ReservationState>()">
</select>
}
</div>
每个字段的名称不正确。
替换此代码并尝试:
<div class="form-group">
@for(var i = 0; i<Model.Tables.Count; i++)
{
<p>@Model.Tables.ElementAt(i).TableIdentifier - @Model.Tables.ElementAt(i).ReservationStatus - @Model.Tables.ElementAt(i).Id</p>
<input type = "hidden" asp-for="@Model.Tables.ElementAt(i).Id" name="Tables[@(i)].Id"
value="@Model.Tables.ElementAt(i).Id" />
<input type = "hidden" asp-for="@Model.Tables.ElementAt(i).NPeople" name="Tables[@(i)].NPeople"
value="@Model.Tables.ElementAt(i).NPeople" />
<input type = "hidden" asp-for="@Model.Tables.ElementAt(i).Price" name="Tables[@(i)].Price"
value="@Model.Tables.ElementAt(i).Price" />
<input type = "hidden" asp-for="@Model.Tables.ElementAt(i).TableIdentifier" name="Tables[@(i)].TableIdentifier"
value="@Model.Tables.ElementAt(i).TableIdentifier" />
<input type = "hidden" asp-for="@Model.Tables.ElementAt(i).EventId" name="Tables[@(i)].EventId"
value="@Model.Tables.ElementAt(i).EventId" />
<select asp-for="@Model.Tables.ElementAt(i).ReservationStatus" name="Tables[@(i)].ReservationStatus" asp-items="Html.GetEnumSelectList<Table.ReservationState>()">
</select>
}
</div>
所以我正在为一家能够处理活动 Table 预订的餐厅制作应用程序。
我想要的是一个事件模型,以及一个 Table 模型,我可以在其中创建表格并将它们用于我之后创建的每个事件。
问题是在事件创建中获取表格后,我无法将这些表格保存为事件的副本(更准确地说,创建 Post 中的 @event.Tables 为空):
事件模型:
public class Event
{
public Event()
{
this.Tables = new HashSet<Table>();
}
public int Id { get; set; }
public string EventName { get; set; }
public String StartDate { get; set; }
public String StartTime { get; set; }
public string ImageURL { get; set; }
public string Description { get; set; }
public virtual ICollection<Table> Tables { get; set; }
}
Table 型号:
public class Table //Model for Table Conf
{
public enum ReservationState {
[Display(Name = "Available")]
Available,
[Display(Name = "Processing")]
Processing,
[Display(Name = "Reserved")]
Reserved
}
public int Id { get; set; }
public int Price { get; set; }
public string TableIdentifier { get; set; }
public int NPeople { get; set; }
public ReservationState ReservationStatus { get; set; }
public virtual int? EventId { get; set; }
}
事件控制器:
// GET: Events/Create
public IActionResult Create()
{
List<Table> tables = _context.Table.Where(t => t.EventId == null).AsNoTracking().ToList();
Event newEvent = new Event();
foreach(Table table in tables)
{
newEvent.Tables.Add(table);
}
return View(newEvent);
}
// POST: Events/Create
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Create([Bind("Id,EventName,StartDate,StartTime,ImageURL,Description,Tables")] Event @event)
{
if (ModelState.IsValid)
{
foreach (Table table in @event.Tables)
{
Table cloneTable = new Table();
_context.Table.Add(cloneTable);
int cloneId = cloneTable.Id;
var sourceValues = _context.Entry(table).CurrentValues;
_context.Entry(cloneTable).CurrentValues.SetValues(sourceValues);
cloneTable.EventId = @event.Id;
cloneTable.Id = cloneId;
}
_context.Add(@event);
await _context.SaveChangesAsync();
return RedirectToAction(nameof(Index));
}
return View(@event);
}
Event Create View(保存表格的部分,因为其他一切正常,我也可以在视图中正确看到表格:
<div class="form-group">
@for (var i = 0; i < Model.Tables.Count; i++)
{
<p>@Model.Tables.ElementAt(i).TableIdentifier - @Model.Tables.ElementAt(i).ReservationStatus - @Model.Tables.ElementAt(i).Id </p>
<input type="hidden" asp-for="@Model.Tables.ElementAt(i).Id" name="@Model.Tables.ElementAt(i).Id"
value="@Model.Tables.ElementAt(i).Id" />
<input type="hidden" asp-for="@Model.Tables.ElementAt(i).NPeople" name="@Model.Tables.ElementAt(i).NPeople"
value="@Model.Tables.ElementAt(i).NPeople" />
<input type="hidden" asp-for="@Model.Tables.ElementAt(i).Price" name="@Model.Tables.ElementAt(i).Price"
value="@Model.Tables.ElementAt(i).Price" />
<input type="hidden" asp-for="@Model.Tables.ElementAt(i).TableIdentifier" name="@Model.Tables.ElementAt(i).TableIdentifier"
value="@Model.Tables.ElementAt(i).TableIdentifier" />
<input type="hidden" asp-for="@Model.Tables.ElementAt(i).EventId" name="@Model.Tables.ElementAt(i).EventId"
value="@Model.Tables.ElementAt(i).EventId" />
<select asp-for="@Model.Tables.ElementAt(i).ReservationStatus" name="@Model.Tables.ElementAt(i).ReservationStatus" asp-items="Html.GetEnumSelectList<Table.ReservationState>()">
</select>
}
</div>
每个字段的名称不正确。
替换此代码并尝试:
<div class="form-group">
@for(var i = 0; i<Model.Tables.Count; i++)
{
<p>@Model.Tables.ElementAt(i).TableIdentifier - @Model.Tables.ElementAt(i).ReservationStatus - @Model.Tables.ElementAt(i).Id</p>
<input type = "hidden" asp-for="@Model.Tables.ElementAt(i).Id" name="Tables[@(i)].Id"
value="@Model.Tables.ElementAt(i).Id" />
<input type = "hidden" asp-for="@Model.Tables.ElementAt(i).NPeople" name="Tables[@(i)].NPeople"
value="@Model.Tables.ElementAt(i).NPeople" />
<input type = "hidden" asp-for="@Model.Tables.ElementAt(i).Price" name="Tables[@(i)].Price"
value="@Model.Tables.ElementAt(i).Price" />
<input type = "hidden" asp-for="@Model.Tables.ElementAt(i).TableIdentifier" name="Tables[@(i)].TableIdentifier"
value="@Model.Tables.ElementAt(i).TableIdentifier" />
<input type = "hidden" asp-for="@Model.Tables.ElementAt(i).EventId" name="Tables[@(i)].EventId"
value="@Model.Tables.ElementAt(i).EventId" />
<select asp-for="@Model.Tables.ElementAt(i).ReservationStatus" name="Tables[@(i)].ReservationStatus" asp-items="Html.GetEnumSelectList<Table.ReservationState>()">
</select>
}
</div>