将多个输入文件绑定到 IEnumerable 中

Bind multiple input files into IEnumerable

提问人:Mladen Nikolov 提问时间:11/14/2023 最后编辑:Qing GuoMladen Nikolov 更新时间:11/14/2023 访问量:79

问:

我正在将 ASP.NET MVC 用于一个小型网站。我找不到将多个文件输入绑定到一个 .IEnumerable

在我看来,我有以下意见:

<input type="file" name="medical-certificate-file" id="medical-certificate-file">
<input type="file" name="manager-degree-doc-file" id="manager-degree-doc-file">

我的模型如下所示:

public class Document
{
      public DocumentType DocumentType { get; set; }
      public IFormFile File { get; set; }
}

public class InputModel
{
      public IEnumerable<Document> Documents { get; set; }
}

我尝试以成功映射其他表单数据的方式映射文件 - 更改 name 属性:

<input type="file" name="Documents.File" id="medical-certificate-file">

此解决方案有效,但当然仅适用于一个文件。从逻辑上讲,第二个不能使用相同的名称进行映射。

我也尝试使用asp-for,如下所示:

<input asp-for="Documents.ElementAt(0).File" type="file" name="medical-certificate-file" id="medical-certificate-file">

此解决方案甚至不适用于单个文件。我还尝试了不同种类的它。

我应该注意的是,输入表单是多个表单,而不是一个具有多个文件选择选项的表单。有几个文件,而不仅仅是我在示例中指出的两个文件。

提前感谢您抽出时间接受采访!

C# asp.net asp.net-mvc asp.net-core 模型绑定

评论

0赞 Good Night Nerd Pride 11/14/2023
房产从何而来?界面没有,也没有。你试过吗?FileIFileIEnumerableasp-for="Documents"
0赞 Mladen Nikolov 11/14/2023
是的,对不起!我只想给出与我的问题相关的内容,但我认为我太缩短了示例,而且不准确。我刚刚编辑了我的问题。
0赞 Good Night Nerd Pride 11/14/2023
尝试asp-for="Documents.Select(x => x.File)"
0赞 Mladen Nikolov 11/14/2023
不幸的是,不起作用。我想知道将每个文件输入映射到单独的 IFormFile 是否是最佳选择。

答:

0赞 Qing Guo 11/14/2023 #1

复杂对象绑定使用顺序索引。顾名思义,索引必须从 0 开始,并且必须是连续的。绝不能有差距。索引放在方括号中,并添加到表单字段的 name 属性中,例如name="Documents[0].file"

尝试使用将文件绑定到 IEnumerable Documents:name="Documents[0].file"

<input type="file" name="Documents[0].file" id="medical-certificate-file">
<input type="file" name="Documents[1].file" id="manager-degree-doc-file">

演示如下:

<form asp-action="Index"  enctype="multipart/form-data">

    <input type="file" name="Documents[0].file" id="medical-certificate-file">
    <input type="file" name="Documents[1].file" id="manager-degree-doc-file">

    <input type="submit" value="Create" />
</form>

结果:

enter image description here

或者

@for (var i = 0; i < 5; i++)
{
    <input type="file" name="Documents[@i].file" id="medical-certificate-file">
}

结果:enter image description here

评论

0赞 Qing Guo 11/21/2023
嗨@Mladen尼科洛夫,有什么更新吗?如果我的回答能帮助您解决问题?如果没有,你能跟进让我知道吗?