Публикация различного количества изображений из формы - PullRequest
0 голосов
/ 02 апреля 2019

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

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

Как только это будет сделано, элемент ввода файла сбрасывается, и пользователь может выбрать другое изображение, создавая новый частичный вид и т. Д.

Форма выглядит так, как будто она отображается правильно, но когда я пытаюсь отправить, VS использует память / процессор, и запрос никогда не поступает в контроллер. Любой совет или помощь здесь приветствуется!

Снимок экрана формы

ViewModel:

  public class ProjectCreate
  {
    public int Id { get; set; }
    public string Title { get; set; }
    public string Description { get; set; }
    public DateTime ProjectDate { get; set; }
    public List<Image> GalleryImages { get; set; }
  }

Image ViewModel:

  public class Image
  {
    public int Id { get; set; }
    public int GalleryIndex { get; set; }
    public string Name { get; set; }
    public string Description { get; set; }
    public IFormFile ImageFile { get; set; }
  }

Форма:

    <form asp-action="Create" enctype="multipart/form-data">
      <div asp-validation-summary="ModelOnly" class="text-danger"></div>
      <div class="form-group col-sm-4">
        <label asp-for="Title" class="control-label"></label>
        <input asp-for="Title" class="form-control" />
        <span asp-validation-for="Title" class="text-danger"></span>
      </div>
      <div class="form-group col-sm-4">
        <label asp-for="Description" class="control-label"></label>
        <input asp-for="Description" class="form-control" />
        <span asp-validation-for="Description" class="text-danger"></span>
      </div>
      <div class="form-group col-sm-4">
        <label asp-for="ProjectDate" class="control-label"></label>
        <input asp-for="ProjectDate" class="form-control" />
        <span asp-validation-for="ProjectDate" class="text-danger"></span>
      </div>

      <div class="form-group col-sm-4">
        <label class="control-label">Project Images</label>
        <input id="ImageUpload" type="file" class="form-control" accept="image/jpeg, image/png, image/gif" />
      </div>

      @* Display images here *@
      <div id="pending-images" class="row"></div>

      <div class="form-group">
        <input type="submit" value="Create" class="btn btn-primary" />
      </div>
    </form>

Div 'pending-images' - это место, где отображается частичное представление.

PartialView:

<div class="card mb-3" style="width: 18rem">
  <img class="card-img-top" id="pending-image-@Model.Id" src="" style="max-height: 18rem; max-width: 18rem;" />
  <div class="card-body">
    <div class="form-group">
      <label class="control-label">Index</label>
      <input id="GalleryImages[@Model.Id].GalleryIndex" name="GalleryImages[@Model.Id].GalleryIndex" class="form-control" value="@Model.Id" />
    </div>
    <div class="form-group">
      <label class="control-label">Name/Title</label>
      <input id="GalleryImages[@Model.Id].Name" name="GalleryImages[@Model.Id].Name" class="form-control" />
    </div>
    <div class="form-group">
      <label class="control-label">Description</label>
      <input id="GalleryImages[@Model.Id].Description" name="GalleryImages[@Model.Id].Description" class="form-control" />
    </div>
    <input type="file" id="GalleryImages[@Model.Id].ImageFile" name="GalleryImages[@Model.Id].ImageFile" style="display: none;" />
  </div>
</div>

Визуализированный HTML:

<form enctype="multipart/form-data" action="/Projects/Create" method="post" novalidate="novalidate">

  <div class="form-group col-sm-4">
    <label class="control-label" for="Title">Title</label>
    <input class="form-control valid" type="text" id="Title" name="Title" value="" aria-invalid="false">
    <span class="text-danger field-validation-valid" data-valmsg-for="Title" data-valmsg-replace="true"></span>
  </div>
  <div class="form-group col-sm-4">
    <label class="control-label" for="Description">Description</label>
    <input class="form-control valid" type="text" id="Description" name="Description" value="" aria-invalid="false">
    <span class="text-danger field-validation-valid" data-valmsg-for="Description"
          data-valmsg-replace="true"></span>
  </div>
  <div class="form-group col-sm-4">
    <label class="control-label" for="ProjectDate">Project Date</label>
    <input class="form-control valid" type="date" data-val="true"
           data-val-required="The Project Date field is required." id="ProjectDate" name="ProjectDate" value=""
           aria-describedby="ProjectDate-error" aria-invalid="false">
    <span class="text-danger field-validation-valid" data-valmsg-for="ProjectDate"
          data-valmsg-replace="true"></span>
  </div>

  <div class="form-group col-sm-4">
    <label class="control-label">Project Images</label>
    <input id="ImageUpload" type="file" class="form-control" accept="image/jpeg, image/png, image/gif">
  </div>

  <div id="pending-images" class="row">
    <div class="col-sm-4">
      <div class="card mb-3" style="width: 18rem">
        <img class="card-img-top" id="pending-image-0" src="data:image/jpeg;base64,xxx"
             style="max-height: 18rem; max-width: 18rem;">
        <div class="card-body">
          <div class="form-group">
            <label class="control-label">Index</label>
            <input id="GalleryImages[0].GalleryIndex" name="GalleryImages[0].GalleryIndex"
                   class="form-control" value="0">
          </div>
          <div class="form-group">
            <label class="control-label">Name/Title</label>
            <input id="GalleryImages[0].Name" name="GalleryImages[0].Name" class="form-control">
          </div>
          <div class="form-group">
            <label class="control-label">Description</label>
            <input id="GalleryImages[0].Description" name="GalleryImages[0].Description"
                   class="form-control">
          </div>
          <input id="GalleryImages[0].ImageFile" type="file" class="form-control"
                 accept="image/jpeg, image/png, image/gif" name="GalleryImages[0].ImageFile"
                 style="display:none;">
        </div>
      </div>
    </div>
  </div>

  <div class="form-group">
    <input type="submit" value="Create" class="btn btn-primary">
  </div>
  <input name="__RequestVerificationToken" type="hidden" value="xxx">
</form>

Когда загружается более одного изображения, в информации Fiddler отображается только первое изображение. Я также могу загрузить это или что-нибудь еще, если это будет полезно. Я пытался включить все, хотя. Есть ли лучший способ сделать это? Я думаю о том, чтобы попытаться зацепиться за imgur или что-то подобное, если я не смогу с этим разобраться.

1 Ответ

0 голосов
/ 02 апреля 2019

Вы должны использовать свой ввод следующим образом:

<input type="file" multiple="multiple" name="files" id="files" />

Я не знаю, можете ли вы использовать здесь type = "image", но вы, безусловно, можете использовать свой контроллер, чтобы проверить, загружал ли пользователь только изображения.

Или вы можете добавить этот параметр к входу.

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