首页 > 解决方案 > ASP.NET Core 3.1 中的 asp-action 不适用于端点路由

问题描述

我创建了一个具有两个动作 Index 和 CustomVariable 的控制器

public class HomeController: Controller
{
    public IActionResult Index()
    {
        return View("Result", new Result { Controller = nameof(HomeController), Action = nameof(Index) });
    }

    public ViewResult CustomVariable(string id)
    {
        Result r = new Result { Controller = nameof(HomeController), Action = nameof(CustomVariable) };
        r.Data["id"] = /*RouteData.Values["id"];*/ id ?? "<noValue>";
        r.Data["catchall"] = RouteData.Values["catchall"];
        return View("Result", r);
    }
}

并创建了一个显示结果的视图:

<!DOCTYPE html>
<html>
<head>
    <meta name="viewport" content="width=device-width"/>
    <title>Routing </title>
    <link rel=" stylesheet" asp-href-include="lib/bootstrap/dist/css/*.min.css"/>

</head>
<body class="panel-body">
    <table class="table table-bordered  ">
        <tr><th>Controlle:</th><td>@Model.Controller</td></tr>
        <tr><th>Action:</th><td>@Model.Action</td></tr>
        @foreach (string key in Model.Data.Keys)
        {
            <tr><th>@key :</th><td>@Model.Data[key]</td></tr>
        }
    </table>
    <a asp-action="CustomVariable">this is an outgoing URL</a>
    
</body>
</html>

Startup我定义了两个端点,如下所示:

app.UseEndpoints(endpoints =>
{
   endpoints.MapControllerRoute(
        name:"NewRoute",
      pattern: "App/Do{action}",
     defaults: new {Controller="Home"}
    );
  
    endpoints.MapControllerRoute(
    name: "default",
    pattern :"{controller=Home}/{action=Index}/{id?}";
});

当我单击 URL 时,出现异常:

处理请求时发生未处理的异常。AmbiguousMatchException:请求匹配多个端点。

火柴:

UrlsAndRoutes.Controllers.HomeController.Index (UrlsAndRoutes)
UrlsAndRoutes.Controllers.HomeController.CustomVariable (UrlsAndRoutes)

但它适用于属性路由

标签: asp.net-core

解决方案


我能够重现您的问题。您的模式无效,因为使用“Do{action}”无法与中的任何操作匹配,HomeController以便保留您想要的模式,我建议改为执行以下操作:

endpoints.MapControllerRoute(
    name: "NewRoute",
    pattern: "App/Do/{action}",
    defaults: new { controller = "Home" });

推荐阅读