У меня есть форма для модели, содержащая некоторые стандартные поля ввода и список файлов. Предполагается, что пользователь должен выбрать файлы, которые должны быть связаны с моделью, с помощью флажка.
Форма для этой модели 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 основной путь, о котором я еще не знаю.