Dynami c поля в форме asp net ядро - PullRequest
0 голосов
/ 12 февраля 2020

Мне нужна помощь, чтобы решить эту проблему, я не знаю, как выяснить. В основном я хочу добавить динамические c поля в форму, но я не могу связать значения в Отправить сообщение. Список всегда нулевой, не имеет значений.

По сути, у меня есть модель представления с несколькими файлами и одним списком.

Моя PlanoAcaoViewModel:

public class PlanoAcaoViewModel
{
  public int IdPlanoAcao { get; set; }
  public int Numero { get; set; }
  public DateTime DataEncerramento { get; set; }

  public List<PlanoEvidenciaIForm> ListaPlanoEvidenciaIForm { get; set; }

  public class PlanoEvidenciaIForm
  {
    public int IdPlanoAcaoEvidencia { get; set; }
    public IFormFile Arquivo { get; set; }
    public string Nota { get; set; }
    public DateTime Data { get; set; }
  }
}

Моя Контроллер:

[HttpPost]
public async Task<IActionResult> Create(PlanoAcaoViewModel model)
{
  var num = model.Numero;              // It's ok, return the right number
  var data = model.DataEncerramento ;  // It's ok, return the right date

  foreach (var it in model.ListaPlanoEvidenciaIForm)
  {
    // model.ListaPlanoEvidenciaIForm is NULL
  }
}

Мой CS html:

@model ProjetoGestor.ViewModel.PlanoAcaoViewModel

<form asp-action="Create" enctype="multipart/form-data">
  <div asp-validation-summary="ModelOnly" class="text-danger"></div>
  <div class="row">
    <div class="col-auto">
      <label asp-for="Numero" class="control-label"></label>
      <input asp-for="Numero" class="form-control" disabled type="text" />
    </div>
    <div class="col-auto">
      <label asp-for="DataEncerramento" class="control-label"></label>
      <input asp-for="DataEncerramento" class="form-control" type="date" placeholder="dd/mm/yyyy" />
      <span asp-validation-for="DataEncerramento" class="text-danger"></span>
    </div>
  </div>
  <div class="row">
    @* Dynamic Fields *@
    <input asp-for="ListaPlanoEvidenciaIForm[0].Arquivo" class="form-control" type="file" />
    <input asp-for="ListaPlanoEvidenciaIForm[0].Nota" class="form-control" />
  </div>
  <div class="row col-auto">
    <div class="align-center">
      <a class="btn btn-primary btn-xl" asp-action="Index">Voltar</a> |
      <input type="submit" value="Criar" class="btn btn-primary btn-success btn-xl" />
    </div>
  </div>
</form>

И поля Dynami c Я уже пробовал много способов, но безуспешно:

// In this way the model.ListaPlanoEvidenciaIForm is NULL
<input asp-for="ListaPlanoEvidenciaIForm[0].Arquivo" class="form-control" type="file" />
<input asp-for="ListaPlanoEvidenciaIForm[0].Nota" class="form-control" />

// In this way don't do it the POST (don't call the method create post)
<input name="ListaPlanoEvidenciaIForm[0].Arquivo" class="form-control" type="file" />
<input name="ListaPlanoEvidenciaIForm[0].Nota" class="form-control" />

// In this way the model.ListaPlanoEvidenciaIForm have length > 0 but all values inside list are null
<input name="ListaPlanoEvidenciaIForm" class="form-control" type="file" />
<input name="ListaPlanoEvidenciaIForm" class="form-control" />

Таким образом, также не вызывайте метод создания сообщения: enter image description here

1 Ответ

1 голос
/ 12 февраля 2020

С https://docs.microsoft.com/en-us/aspnet/core/mvc/models/file-uploads?view=aspnetcore-3.1;

При загрузке файлов с использованием привязки модели и IFormFile метод действия может принимать:

  • A одиночный IFormFile.
  • Любая из следующих коллекций, представляющих несколько файлов:
    • IFormFileCollection
    • IEnumerable<IFormFile>
    • List<IFormFile>

Нет упоминания о списке объектов, каждый из которых содержит IFormFile. Таким образом, вы можете использовать ограничение MVC. Я бы посоветовал вам попытаться отделить список файлов от других значений;

  public List<PlanoEvidenciaIForm> ListaPlanoEvidenciaIForm { get; set; }
  public List<IFormFile> Arquivos { get; set; }

  public class PlanoEvidenciaIForm
  {
    public int IdPlanoAcaoEvidencia { get; set; }
    public string Nota { get; set; }
    public DateTime Data { get; set; }
  }
    <!-- The IFormFile doesn't use [ ] -->
    <input asp-for="Arquivos" class="form-control" type="file" />
    <input asp-for="ListaPlanoEvidenciaIForm[0].Nota" class="form-control" />
...