ASP. NET Ядро 2.1: Какую технику использовать для публикации модели со свойством в виде списка? - PullRequest
0 голосов
/ 22 марта 2020

У меня есть модель для магазина. Этот магазин может иметь различное количество телефонов и мобильных телефонов.

public class Store{
   public int Id {get; set;}
   public virtual List<Phone> Phones = new List<Phone>();
}

Модель телефона

public class Phone {

public int Id {get; set;}
public String Number {get; set;}
}

В моем шаблоне блейда я хочу иметь возможность публиковать переменное количество телефонов. Проблема в том, что у меня нет ни малейшего способа добиться этого. Если не ясно, я хочу опубликовать форму, которая создает магазин с телефонами.

1 Ответ

0 голосов
/ 23 марта 2020

Вот как мне удалось это сделать:

Моя модель:

  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, например.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...