从表单中发布不同数量的图像

问题描述 投票:0回答:1

我正在尝试构建一个带有一些文本框输入的表单和一个用于上传图像的文件输入。

当一个文件被选中时,我有一些JS去获取部分视图并在表单中呈现它。渲染新部分后,我克隆并复制文件输入元素,并将其作为隐藏输入放在新部分中,以便稍后在表单中使用。部分中还有一些与所选图像相关的其他字段。

完成所有操作后,文件输入元素将被重置,用户可以选择另一个图像,生成新的局部视图等。

表单看起来像是正确呈现,但是当我尝试提交时,VS内存/ CPU使用率激增,请求永远不会进入控制器。任何建议或帮助在这里表示赞赏!

Screenshot of the form

视图模型:

  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; }
  }

图像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>

'pending-images'div是呈现局部视图的位置。

PartialView:

<div class="card mb-3" style="width: 18rem">
  <img class="card-img-top" id="[email protected]" 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>

当尝试上传多个图像时,只有第一个图像显示在提琴手信息中。如果它有用,我也可以上传或其他任何内容。我尽力包括一切。有没有更好的方法来实现这一目标?如果我不能解决这个问题,我正在考虑尝试与imgur或类似的东西挂钩。

c# asp.net-core asp.net-core-mvc
1个回答
0
投票

您应该使用这样的输入:

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

我不知道你是否可以在这里使用type =“image”,但你当然可以使用你的控制器来检查用户是否只上传了图像。

或者您可以将此参数添加到输入中。

accept="image/png, image/jpeg"
© www.soinside.com 2019 - 2024. All rights reserved.