ASP.NET Core 2.1文件上传表单未到达控制器

时间:2018-11-06 13:02:04

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

这是我的控制人

[ValidateAntiForgeryToken]
[HttpPost("Save")]
public async Task<ActionResult> SaveAsync(UploadDocumentViewModel Input)
{
    var filePath = $"{this.hostingEnvironment.WebRootPath}/documents";
    foreach(var item in Input.Files)
    {
        var fileName = ContentDispositionHeaderValue.Parse(item.ContentDisposition).FileName;
        var fullFilePath = Path.Combine(filePath, fileName);
        using(var stream = new FileStream(fullFilePath, FileMode.Create))
        {
            await item.CopyToAsync(stream);
        }
    }
    return this.Ok();
}

这是我从中上传的表格

@using (Html.BeginForm("Save", @ViewContext.RouteData.Values["controller"].ToString(), FormMethod.Post, new { enctype = "multipart/form-data",id = "form" }))
{
    @Html.AntiForgeryToken()
    <div class="col-sm-12">
        <div class="row">
            <div class="col-sm-12">
                <div class="form-group">
                    @Html.LabelFor(m => m.Categories)
                    @Html.DropDownListFor(m => m.Categories, (SelectList)Model.Categories, "", new { @class = "form-control col-sm-12" })
                    @Html.ValidationMessageFor(m => m.Categories)
                </div>
            </div>
        </div>
        <div class="row">
            <div class="col-sm-12">
                <div class="form-group">
                    <input id="Files" type="file" name="Files" multiple />
                </div>
            </div>
        </div>
        <div class="row">
            <div class="col-sm-12">
                <hr />
            </div>
        </div>
        <div class="row">
            <div class="col-sm-12">
                <div class="form-group">
                    <div class="clearfix">
                        <div class="pull-right">
                            <input type="submit" id="submit" value="Save" class="btn btn-primary" />
                            @Html.ActionLink("Cancel", "Index", @ViewContext.RouteData.Values["controller"].ToString(), new { }, new { @class = "btn btn-outline-secondary" })
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
}

当我尝试上传文件时,我被转到404页面。但是,如果我从控制器中删除异步任务项,则可以很好地到达控制器。 我正在尝试按照此Microsoft教程进行操作,但似乎无法正常工作: https://docs.microsoft.com/en-us/aspnet/core/mvc/models/file-uploads?view=aspnetcore-2.1

1 个答案:

答案 0 :(得分:3)

您的表单正在尝试为"Save"动作生成路由,但是您的动作名称实际上是SaveAsync。当您删除异步内容时,它就起作用了,因为此时您也可能将方法名称也更改为Save

使用动作后缀Async命名动作是不传统的,即使它们是异步的(不同于其他类型的方法)。因此,我建议您只需删除方法名称的Async部分,就可以了。否则,您需要将表单中的引用从“保存”更改为“ SaveAsync”,以匹配操作的名称。

FWIW,您在这里使用HtmlHelper方法自杀。请改用标签助手。例如,您的from可以很简单:

<form method="post" asp-action="Save" enctype="multipart/form-data">
    ...
</form>