查看在内核 3 Asp.Net 控制器中找不到操作



我正在尝试从视图中调用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 中讨论过

默认情况下,AsyncCore 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>

参考:从控制器操作名称中删除异步后缀

最新更新