Вот как мне удалось это сделать:
Моя модель:
public class Store
{
public int Id { get; set; }
public List<Phone> Phones { get; set; }//notice it is a property NOT a field.
}
public class Phone
{
public int Id { get; set; }
public string Number { get; set; }
}
Теперь это на мой взгляд:
<form method="post">
<input asp-for="Id" type="text" />
@for(int i = 0; i < Model.Phones.Count; i++)
{
<input asp-for="Phones[i].Id" type="text" />
<input asp-for="Phones[i].Number" type="text" />
}
<button type="submit">Submit Phones</button>
</form>
Обратите внимание, что я использую синтаксис массива для привязки полей.
asp-for="Phones[i].Id"
Также обратите внимание, что я использую POST
Мое действие в контроллере выглядит следующим образом:
[HttpPost]
public IActionResult Index(Store model)
{
//do something here with your phones: model.Phones
return View(model);
}
Я думаю, вы также можете связать его из строки запроса или параметры URL. Но наиболее распространенный способ сделать это - использовать отправку при отправке формы.
ОБНОВЛЕНИЕ:
Если вы хотите использовать формы, созданные вручную, формы из другой среды или динамически создаваемое с использованием javascript имя поля Phone должно быть, например, "name = Phones [1] .Number".
То же самое для поля Id класса Phone. Таким образом, механизм связывания модели знает, как заполнить ваше свойство в действии.
Число "[1]" - это индекс элемента в коллекции. Они должны быть последовательными, чтобы все это работало.
Индекс основан на НУЛЕ, поэтому первым элементом должен быть Phones [0] .Number, например.