Форма со списком не POSTing - PullRequest
       17

Форма со списком не POSTing

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

У меня есть форма для модели, содержащая некоторые стандартные поля ввода и список файлов. Предполагается, что пользователь должен выбрать файлы, которые должны быть связаны с моделью, с помощью флажка.

Форма для этой модели POST прекрасно работает, если этот список файлов не включен. Однако в тот момент, когда я нажимаю кнопку «Отправить», страница продолжает перезагружаться.

Вот соответствующий код. Обратите внимание, что примеры значительно сокращены.

Форма в .cs html

<form asp-action="Edit">
    @Html.AntiForgeryToken()
    <input asp-for="Id" type="hidden" />
    <div class="form-group required">
        <label asp-for="Description"></label>
        <input asp-for="Description" class="form-control" type="text" />
        <span asp-validation-for="Description"></span>
    </div>
    @if (Model.Files.Any())
    {
        for (var i = 0; i < Model.Files.Count; i++)
        {
            <input asp-for="@Model.Files[i].Id" type="hidden" />
            <div class="form-group">
                <input asp-for="@Model.Files[i].Link" type="checkbox"/>
            </div>
            @Model.Files[i].Description
        }
    }
    <button type="submit">Save</button>
</form>

Действие в контроллере

[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Edit(Model model)
{
    // saving to DB, additional validation, etc
    return View(model);
}

HTML

<form action="Edit" method="post">            
    <input id="Id" type="hidden" name="Id" value="43" />
    <div class="form-group required">
        <label for="Description">Description</label>
        <input class="form-control" type="text" data-val="true" data-val-required="Please enter description." id="Description" name="Description" value="Test" />
        <span class="text-danger field-validation-valid" data-valmsg-for="Description" data-valmsg-replace="true"></span>
    </div>
    <input type="hidden" id="Files_0__Id" name="Files[0].Id" value="29" />
    <div class="form-group">
        <input type="checkbox" data-val="true" data-val-required="The Link field is required." id="Files_0__Link" name="Files[0].Link" value="true" />
    </div>
    111.png
    <input type="hidden" id="Files_1__Id" name="Files[1].Id" value="30" />
    <div class="form-group">
        <input type="checkbox" data-val="true" data-val-required="The Link field is required." id="Files_1__Link" name="Files[1].Link" value="true" />
    </div>
    222.png
    <input name="__RequestVerificationToken" type="hidden" value="[...]" />
    <input name="Files[0].Link" type="hidden" value="false" />
    <input name="Files[1].Link" type="hidden" value="false" />
    <button type="submit">Save</button>
</form>

Модели

public class Model
{
    [Display(Name = "ID")]
    public long? Id { get; set; }

    [Required(ErrorMessage = "Please enter a description.")]
    [Display(Name = "Description")]
    public string Description { get; set; }

    public List<FileModel> Files { get; set; }
}
public class FileModel
{
    [HiddenInput(DisplayValue = false)]
    public long? Id { get; set; }

    [Display(Name = "Description")]
    public string Description { get; set; }

    [Display(Name = "Link")]
    public bool Link { get; set; }

    [ScaffoldColumn(false)]
    public bool IsDeleted { get; set; }
}

Я не хочу использовать стандартный множественный выбор, так как рядом с каждым параметром будет отображаться миниатюра, показывающая содержимое файла.

Моя конечная цель здесь - опубликовать список выбранных файлов вместе с остальной частью формы, поэтому нет необходимости связывать каждый файл отдельно через Ajax или что-то подобное. Предполагается, что форма будет работать с новым объектом, который еще не был добавлен в базу данных и, следовательно, еще не имеет идентификатора.

Я, однако, открыт для других идей, особенно если есть идиоматизм c. net основной путь, о котором я еще не знаю.

...