Я пытаюсь выяснить, как связать элементы формы с моделью, содержащей свойство, являющееся массивом или перечисляемым.Эта форма должна использоваться для добавления нового объекта или редактирования существующего.
Ниже приведен упрощенный пример.
Если уровни не содержат элементов (например, создать), строка полей уровняне отображается.Следует ли добавить пустой элемент в массив уровня или добавить ряд пустых полей?Но как это сделать с помощью атрибута asp-for.
Если Уровни содержат элементы (например, редактировать), отображаются строки полей Уровня.Однако при публикации model.Levels
в методе Edit
указывается null
.
Есть идеи, как лучше всего это реализовать?
Модель для привязки
public class CarparkModel
{
[HiddenInput]
public int Id { get; set; }
public string Name { get; set; }
public Level[] Levels { get; set; }
}
public class Level
{
[HiddenInput]
public int Id { get; set; }
public string Description { get; set; }
public int NrOfSpaces { get; set; }
}
Главный вид
@model CarparkModel
<form method="POST">
<input asp-for="Id">
<div>
<label asp-for="Name"></label>
<input asp-for="Name">
</div>
<table>
<tr>
<th>Description</th>
<th>Nr of spaces</th>
</tr>
@foreach (Level level in Model.Levels)
{
<tr>
<td><input asp-for="Description"></td>
<td><input asp-for="NrOfSpaces"></td>
</tr>
}
<tr>
<td colspan="2>
<!-- Click = new row of Level fields added -->
<button type="button">Add level</button>
</td>
</tr>
</table>
<button type="submit">Save</button>
</form>
Контроллер
public class CarparkController
{
[HttpGet]
public IActionResult Create()
{
return View(new CarparkModel());
}
[HttpPost]
public IActionResult Create(CarparkModel model)
{
if (ModelState.IsValid)
{
_repository.Save(model);
return RedirectToAction("index");
}
return View(model);
}
[HttpGet]
public IActionResult Edit(int id)
{
return View(_repository.Get(id));
}
[HttpPost]
public IActionResult Edit(CarparkModel model)
{
if (ModelState.IsValid)
{
_repository.Save(model);
return RedirectToAction("index");
}
return View(model);
}
}