我正在尝试从视图中调用FileUploadAsync
操作。仅调用 Index 操作的刷新按钮工作正常。视图上的上传按钮返回 404 未找到...想不出原因。
控制器:
[Area("Admin")]
public class MetricController : Controller
{
public async Task<IActionResult> Index()
{
var allBlobs = await _azureBlobService.ListAsync();
return View(allBlobs);
}
public async Task<IActionResult> FileUploadAsync()
{
var request = await HttpContext.Request.ReadFormAsync();
if (request.Files == null)
{
return BadRequest("files not uploaded");
}
var files = request.Files;
if (files.Count == 0)
{
return BadRequest("files empty");
}
await _azureBlobService.UploadAsync(files);
return RedirectToAction("Index");
}
}
视图:
<div class="container-fluid">
<div class="btn btn-primary btn-sm">
<span>Select Files</span><input type="file" id="file" name="selectFiles" class="upload" onchange="DisplayFilesToUpload()" multiple />
</div>
<p id="FilesToUpload"></p>
@if (Model != null && Model.Count > 0)
{
foreach (var item in Model)
{
<div>
<p class="text-secondary">@item</p>
</div>
}
}
<a asp-area="Admin" asp-controller="Metric" asp-action="Index" class="btn btn-outline-primary btn-sm">
Refresh
</a>
<a asp-area="Admin" asp-controller="Metric" asp-action="FileUploadAsync" class="btn btn-outline-primary btn-sm">
Upload
</a>
<a asp-action="DeleteAll" class="btn btn-outline-danger btn-sm">
Delete All
</a>
@section scripts{
<script type="text/javascript" src="~/js/metrics.js"></script>
}
</div>
编辑:在Startup.cs
路由定义如下
app.UseEndpoints(endpoints =>
{
endpoints.MapControllerRoute(
name: "default",
pattern: "{area=Agent}/{controller=Article}/{action=Index}/{id?}");
endpoints.MapRazorPages();
});
所以这个修行不是问题...
这已经在 github:https://github.com/aspnet/AspNetCore/issues/8998 中讨论过
默认情况下,Async
Core 3.0 中将修剪控制器操作名称 asp.net 后缀。
在 3.0 之前,操作可通过Admin/Metric/FileUploadAsync
路由。链接生成需要指定异步后缀,例如
<a asp-area="Admin" asp-controller="Metric" asp-action="FileUploadAsync" class="btn btn-outline-primary btn-sm">
Upload
</a>
在 3.0 中,操作可以通过Admin/Metric/FileUpload
路由,并且链接生成不需要指定异步后缀。
一种解决方案是您可以将视图代码更改为以下内容:
<a asp-area="Admin" asp-controller="Metric" asp-action="FileUpload" class="btn btn-outline-primary btn-sm">
Upload
</a>
另一种解决方案是您可以禁用此行为,在启动配置服务中添加以下代码:
services.AddMvc(options =>
{
options.SuppressAsyncSuffixInActionNames = false;
});
尝试将视图更改为以下内容:
<a asp-area="Admin" asp-controller="Metric" asp-action="FileUpload" class="btn btn-outline-primary btn-sm">
Upload
</a>
参考:从控制器操作名称中删除异步后缀