【问题标题】:View not finding action in controller in Asp.Net core 3在 Asp.Net core 3 的控制器中查看未找到操作
【发布时间】:2019-11-24 19:17:02
【问题描述】:

我正在尝试从视图中调用操作FileUploadAsync。仅调用 Index 操作的刷新按钮运行良好。视图上的上传按钮返回 404 not found...想不出原因。

控制器:

[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();
            });

所以这不应该是问题......

【问题讨论】:

标签: c# html asp.net-core


【解决方案1】:

这个已经在github讨论过:https://github.com/aspnet/AspNetCore/issues/8998

Async 控制器动作名称的后缀将在 asp.net core 3.0 中默认被修剪。

在 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 路由,并且链接生成不需要指定 Async 后缀。

一种解决方案是您可以将视图代码更改为以下:

 <a asp-area="Admin" asp-controller="Metric" asp-action="FileUpload" class="btn btn-outline-primary btn-sm">
    Upload
</a>

另一种解决方案是您可以禁用此行为,在启动 ConfigureServices 中添加以下代码:

services.AddMvc(options =>
{
   options.SuppressAsyncSuffixInActionNames = false; 
});

【讨论】:

    【解决方案2】:

    尝试将您的视图更改为:

    <a asp-area="Admin" asp-controller="Metric" asp-action="FileUpload" class="btn btn-outline-primary btn-sm">
        Upload
    </a>
    

    参考:Async suffix removal from controller action names

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多