这是我的控制人
[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
答案 0 :(得分:3)
您的表单正在尝试为"Save"
动作生成路由,但是您的动作名称实际上是SaveAsync
。当您删除异步内容时,它就起作用了,因为此时您也可能将方法名称也更改为Save
。
使用动作后缀Async
命名动作是不传统的,即使它们是异步的(不同于其他类型的方法)。因此,我建议您只需删除方法名称的Async
部分,就可以了。否则,您需要将表单中的引用从“保存”更改为“ SaveAsync”,以匹配操作的名称。
FWIW,您在这里使用HtmlHelper
方法自杀。请改用标签助手。例如,您的from可以很简单:
<form method="post" asp-action="Save" enctype="multipart/form-data">
...
</form>