通过表单挂起的数据会挂起应用程序

时间:2019-03-08 19:08:39

标签: c# asp.net-core asp.net-core-mvc

我有一个像这样的简单控制器方法:

[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" />

1 个答案:

答案 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中描述的可能的内存泄漏表示怀疑。