首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在ASP.NET内核中上传多个带参数的文件

在ASP.NET内核中上传多个带参数的文件
EN

Stack Overflow用户
提问于 2019-02-16 22:24:13
回答 1查看 10K关注 0票数 1

我的视图模型:

代码语言:javascript
运行
复制
public class FileInfo
{
    [Required]
    [StringLength(50, ErrorMessage = "TitleErrorMessage", MinimumLength = 2)]
    public string Title { get; set; }

    [Required]
    [StringLength(100, ErrorMessage = "DesErrorMessage", MinimumLength = 3)]
    public string Description { get; set; }

    [Required]
    [DataType(DataType.Upload)]
    public IFormFile File { get; set; }
}

以下是_UploadForm局部视图文件:

代码语言:javascript
运行
复制
@model SessionStateTest.Models.FileInfo

<div class="form-group">
    <label>Title</label>
    <input class="form-control" asp-for="Title" />
</div>
<div class="form-group">
    <label>Description</label>
    <input class="form-control" asp-for="Description" />
</div>
<div class="form-group">
    <label></label>
    <input type="file" asp-for="File" />
</div>

在另一个视图中使用此代码:

代码语言:javascript
运行
复制
<form asp-action="AddUploadForm" asp-controller="Home" method="Post">
    <input type="submit" value="Add another file" class="btn btn-sm btn-primary" />
</form>
<form asp-action="Upload" asp-controller="Home" method="Post" enctype="multipart/form-data">

    @foreach (var item in Model.Upload)
    {
        @(await Html.PartialAsync("_UploadForm", item))
    }

    <div class="col-xs-12">
        <input type="submit" value="Upload" class="btn btn-sm btn-info" />
    </div>
</form>

基本上,AddUploadForm操作向Model.Upload添加了一个FileInfo类型的新视图模型,这是我的主视图模型。问题是下面的list List<FileInfo> vm in Upload操作是完全空的:

代码语言:javascript
运行
复制
[HttpPost]
[ValidateAntiForgeryToken]
public IActionResult Upload(List<FileInfo> vm)
{
    .... some other logic 
    return View();
}

我不想使用multiple属性,因为我想强制用户为每个文件提供标题和描述。

如有任何帮助,我们不胜感激!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-02-16 23:30:53

您使用_UploadForm的方法会生成以下html (我们只关注input的,因为这是最重要的部分)

代码语言:javascript
运行
复制
<input class="form-control" name="Title" />
<input class="form-control" name="Description" />
<input type="file" name="File" />

...
<input class="form-control" name="Title" />
<input class="form-control" name="Description" />
<input type="file" name="File" />

... and so on

因此,name属性只包含FileInfo模型的属性名而不包含索引,这只适用于控制器需要单个模型的情况

代码语言:javascript
运行
复制
public IActionResult Upload(FileInfo vm)

为了让您的html与当前的控制器配合使用,您可以使用模型列表。

代码语言:javascript
运行
复制
public IActionResult Upload(List<FileInfo> vm)

它应该看起来像这样

代码语言:javascript
运行
复制
<!-- version 1 -->
<input class="form-control" name="[0].Title" />
<input class="form-control" name="[0].Description" />
<input type="file" name="[0].File" />

...
<input class="form-control" name="[1].Title" />
<input class="form-control" name="[1].Description" />
<input type="file" name="[1].File" />

... and so on

代码语言:javascript
运行
复制
<!-- version 2 -->
<!-- the name before index must match parameter name in controller -->
<input class="form-control" name="vm[0].Title" />
<input class="form-control" name="vm[0].Description" />
<input type="file" name="vm[0].File" />

...
<input class="form-control" name="[1].Title" />
<input class="form-control" name="[1].Description" />
<input type="file" name="vm[1].File" />

... and so on

这可以通过使用标签助手和局部视图以稍有不同的方式来完成。您所需要做的就是将部分视图的模型转换为列出和更新asp-for表达式。

_UploadForm.cshtml

代码语言:javascript
运行
复制
@model List<SessionStateTest.Models.FileInfo>

@for (int i = 0; i < Model.Count; i++)
{
    <div class="form-group">
        <label>Title</label>
        <input class="form-control" asp-for="@Model[i].Title" />
    </div>
    <div class="form-group">
        <label>Description</label>
        <input class="form-control" asp-for="@Model[i].Description" />
    </div>
    <div class="form-group">
        <label></label>
        <input type="file" asp-for="@Model[i].File" />
    </div>
}

视图

代码语言:javascript
运行
复制
<form asp-action="Upload" asp-controller="Home" method="Post" enctype="multipart/form-data">

    @await Html.PartialAsync("_UploadForm", Model.Upload)

    <div class="col-xs-12">
        <input type="submit" value="Upload" class="btn btn-sm btn-info" />
    </div>
</form>

它将像在版本1中一样生成html。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54724058

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档