我有一个像这样的简单控制器方法:
[Authorize]
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Add(InputModel input, OtherInputModel[] input2)
{
(...)
}
哪个从下面的此表单接收数据,但问题在于,当该简单端点
收到OtherInputModel[]
,然后在单击“提交”后挂断
没有任何错误或根本没有任何东西-即使我没有附加图像,它也试图进入该控制器方法而被卡住。
将OtherInputModel[]
更改为string[]
可“解决”它,因此仍然可以访问该方法,但是我想发送复杂的模型[]
<form asp-action="Add" method="post" enctype="multipart/form-data">
<div class="form-group">
<label class="control-label">Title</label>
<input name="input.Title" class="form-control" value="@Model.Title" />
<span class="text-danger"></span>
</div>
<div class="form-group">
<label class="control-label">Body</label>
<input name="input.Body" class="form-control" value="@Model.Body" />
<span class="text-danger"></span>
</div>
<div class="form-group">
<div class="col-md-10">
<p>Upload one image ("jpg", "jpeg", "png", "bmp") using this form:</p>
<input type="file" name="input.Image" />
</div>
</div>
// here's probably the problem
@for (int i = 0; i < 4; i++)
{
<div class="form-group">
<label class="control-label"></label>
<input name="input2[].Text" class="form-control" />
<span class="text-danger"></span>
</div>
<div class="form-group">
<div class="col-md-10">
<p>Upload one image ("jpg", "jpeg", "png", "bmp") using this form:</p>
<input type="file" name="input2[].Image" />
</div>
</div>
}
<div class="form-group">
<input type="submit" value="Create" class="button" />
</div>
</form>
这是我的模特:
public class InputModel
{
public string Title { get; set; }
public string Body { get; set; }
public IFormFile Image { get; set; }
}
public class OtherInputModel
{
public string Text { get; set; }
public IFormFile Image { get; set; }
}
我也尝试过以这种形式使用索引
<input name="input2[@i].Text" class="form-control" />
答案 0 :(得分:0)
在ASP.NET Core 2.2中,这似乎是一个愚蠢的错误。与前端无关,它与以下事实有关:一个动作期望包含IFormFile
的复杂对象数组,并且模型绑定进入无限循环(但在ASP.Core 2.1中可以正常工作)>
在这里和issue在github上有关此错误。它已经关闭,似乎已修复了ASP.NET Core 3的错误。
但是,建议采取一些解决方法。
1。
使用objectName.Index
名称和索引值放置隐藏的输入
<input type="hidden" name="otherinput.Index" value="0" />
<input type="file" name="otherinput[0].Image" />
工作正常,但是如果有人在没有otherinput.Index
输入的情况下发出请求(通过邮递员或在提交前通过删除input
来取消请求),应用程序将像没有这种解决方法一样挂起。所以我会说这是非常脆弱和不可接受的。
2。
将IFormFile
包装成一个类
public class OtherInputModel
{
public string Text { get; set; }
public string Body { get; set; }
public FileHolder Holder { get; set; }
}
public class FileHolder
{
public IFormFile Image { get; set; }
}
和标记
<input name="otherinput[0].Text" class="form-control" value="create btn" />
<!-- second line won't work by itself, first line with Text or Body property is required -->
<input type="file" name="otherinput[0].Holder.Image" />
工作正常,但人们对此issue中描述的可能的内存泄漏表示怀疑。