Динамическое добавление Input для формы ввода в ASP.NET Core

Работаю над .Net Core приложением. Есть форма для добавления записи на сайт (и соответственно в БД) как на картинке. Мне нужно добавить возможность загрузить несколько файлов с названием, так, чтобы была кнопка "Добавить файл", при нажатии на которую появлялись бы еще два окошка "Название" и "Загрузить файл" (как обведено красным на картинке): Пример формы ввода Собственно, нужна помощь с написанием Javascript части, а также с написанием логики добавления файлов из получившегося списка в контроллере.
Код представления:

@model UralsPro.Models.DocCaseEntries
<body>
<form asp-controller="DocCase" asp-action="AddDocsTS" method="post" enctype="multipart/form-data">
    <div class="card border-primary mb-3">
      <div class="card-header bg-transparent border-primary" style="text-align:center"><h3>Добавление новой записи</h3></div>
      <div class="card-body">
        <label asp-for="Org">Организация:</label><br />
            <select asp-for="Org" class="custom-select col-md-4">
                <option disabled selected>Выберите организацию</option>
                <option value="Опция 1 и т.д.">Опция 1 и т.д.</option>
            </select>
        <span asp-validation-for="Org" class="text-danger"></span>
        <br/>
        <label asp-for="Gosnum">Введите гос. номер ТС:</label> <br/>
        <input type="text" class="form-control col-sm-3" asp-for="Gosnum"/>
        <span asp-validation-for="Gosnum" class="text-danger"></span>
        <br/>

        <label asp-for="DocType">Название документа:</label><br />
            <select asp-for="DocType" class="custom-select col-md-4">
                <option disabled selected>Выберите тип документа</option>
                <option value="Опция 1 и т.д.">Опция 1 и т.д.</option>
            </select>
        <span asp-validation-for="DocType" class="text-danger"></span>
        <br/>
        <label>Загрузите файл</label> <br/>
        <input type="file" name="uploadedFile" class="form-control"/>
        <br/>

      <div class="card-footer bg-transparent border-primary">
          <div class="form-group mb-2" style="text-align:center">
                <button class="btn btn-outline-primary btn-lg" type="submit">Внести данные</button>
           </div>
      </div>
    </div>
  </div>
</form>
Модель данных:
public class DocCaseEntries
{
    [Key]
    public int EntryID { get; set; }
    public string TS_ID { get; set; } 
    public string Gosnum { get; set; } 
    public string DocType { get; set; }
    public string FileName { get; set; }
    public string FilePath { get; set; }
    public string Org { get; set; }
}

Код контроллера (для удобства чтения опущены некоторые моменты вроде генерации ID и проверки имени загруженного файла):

public async Task<IActionResult> AddDocsTS(DocCaseEntries docs, IFormFile uploadedFile)
    {
        if (docs.Gosnum != null && docs.Org != null)
        {
            docs.TS_ID = Create16DigitId();

            if(uploadedFile != null)
            {
                string filePath = _appEnvironment.WebRootPath + $"\\{docs.Org}\\{docs.TS_ID}";
                string fileName = Path.GetFileName(uploadedFile.FileName);
                if (!Directory.Exists(filePath))
                {
                    Directory.CreateDirectory(filePath);
                }

                using (FileStream fileStream = new FileStream(Path.Combine(filePath, fileName), FileMode.Create))
                {
                    await uploadedFile.CopyToAsync(fileStream);
                }
                DocCaseEntries newDocs = new DocCaseEntries
                {
                    TS_ID = docs.TS_ID,
                    Gosnum = docs.Gosnum.Trim().ToUpper(),
                    DocType = docs.DocType,
                    FileName = fileName,
                    FilePath = Path.Combine(filePath, fileName),
                    Org = docs.Org
                };
                _db.DocCaseEntries.Add(newDocs);
                _db.SaveChanges();

                ViewBag.SuccessMessage = $"Документ \"{fileName}\" успешно загружен!";
                return View(docs);
            }
            else
            {
                ViewBag.ErrorMessage = "Не загружен файл!";
                return View(docs);
            }

        }
        else
        {
            ViewBag.ErrorMessage = "Не указан гос. номер ТС и/или организация!";
            return View(docs);
        }
    }

Ответы (0 шт):