首页 > 解决方案 > 为什么 asp-route 和 asp-action 互斥?

问题描述

我有以下路线:

routes.MapRoute(name: "default", template: "{controller=Home}/{action=Index}/{id?}");
routes.MapRoute(name: "out", template: "outbound/{controller=Home}/{action=Index}/{id?}");

为什么不允许这样做?此传出 URL 是从HomeController操作方法生成的 =Index

<a asp-route="out" asp-action="a" asp-route-id="someIdValue">This is an outoing URL.</a>

生成此传出 URL 的视图来自HomeController'Index方法。

为什么它不使用"out"路由模板而只"a"用于操作,并Home用作控制器来生成/outbound/Home/a/someIdValue

我能够为 提供一个值id,为什么我不能为操作提供一个值?

标签: c#asp.net-coreasp.net-core-2.1asp.net-core-routing

解决方案


您可以使用asp-area而不是asp-route.

在此处输入图像描述

启动.cs

    app.UseMvc(routes =>
        {
            routes.MapRoute(name: "out", template: "{area=Outbound}/{controller=Home}/{action=Index}");

            routes.MapRoute(
                name: "default",
                template: "{controller=Home}/{action=Index}/{id?}");
        });

控制器

[Area("Outbound")]
public class HomeController : Controller
{
    public IActionResult Index()
    {
        return View();
    }

}



    <a href="/outbound/home/index">Go to Outoing’ Home Page by href="/outbound/home/index"</a> <br>

    <a asp-area="Outbound" asp-controller="Home" asp-action="Index">Go to Outoing’ Home Page by asp-area</a><br>

    @Html.ActionLink("Go to Outoing’ Home Page by @Html.ActionLink", "Index", "Home", new { area = "Outbound" })

测试截图

在此处输入图像描述

asp 路由

asp-route属性用于创建直接链接到命名路由的 URL。使用路由属性,路由可以被命名,如所示SpeakerController并在其Evaluations操作中使用:

[Route("/Speaker/Evaluations", 
       Name = "speakerevals")]
public IActionResult Evaluations() => View();

在以下标记中,asp-route属性引用了命名路由:

<a asp-route="speakerevals">Speaker Evaluations</a>

Anchor Tag Helper 使用 URL 生成直接到该控制器操作的路由/Speaker/Evaluations。生成的 HTML:

<a href="/Speaker/Evaluations">Speaker Evaluations</a>

如果在 之外指定asp-controller或,则生成的路由可能不是您所期望的。asp-actionasp-route

为避免路由冲突,asp-route不应与asp-controllerandasp-action属性一起使用。


顺便说一句,default routearea route根据调用它们的顺序自动为它们的端点分配一个顺序值。





asp-routeasp-controller&之间的区别asp-action

Route names( asp-route) 可用于根据特定路由生成 URL。

同时,{controller}/{action}还生成到Home控制器和Test动作的 URL 映射。

    //works
    <a asp-controller="home" asp-action="test">asp-controller="home" asp-action="test"</a><br>

    //works
    <a asp-route="test">asp-route="test"</a><br>

    //InvalidOperationException
    <a asp-route="test" asp-controller="home" asp-action="test">asp-route="test" asp-controller="home" asp-action="test"</a>

InvalidOperationException在一个<a>标签中同时设置时发生。

在此处输入图像描述


推荐阅读