【问题标题】:Why are asp-route and asp-action mutually exclusive?为什么 asp-route 和 asp-action 互斥?
【发布时间】:2020-11-26 18:03:07
【问题描述】:

我有以下路线:

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

为什么不允许这样做?此传出 URL 由 HomeController 和 action method = Index 生成

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

生成此传出 URL 的视图来自 HomeControllerIndex 方法。

为什么不使用"out"路由模板,只使用"a"作为动作,使用Home作为控制器生成/outbound/Home/a/someIdValue

我可以为id 提供值,为什么我不能为操作提供值?

【问题讨论】:

  • 能不能把实际生成的链接加进去?或者你得到一个错误?
  • @janw 是的,/outbound/Home/A 有效,因为我有一个 HomeController 和一个名为 a() 的操作方法

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


【解决方案1】:

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

Startup.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-route

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-route 之外还指定了asp-controllerasp-action,则生成的路由可能不是您所期望的。

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


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





asp-routeasp-controllerasp-action 之间的区别

路由名称(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 在一个&lt;a&gt; 标签中同时设置时出现。

【讨论】:

  • 这很有趣,我不知道使用asp-area 实现了类似的功能。但是这个答案仍然不能解释 为什么 asp-routeasp-action 是互斥的,尽管这个问题可能更适合作为 GitHub 问题,无论如何。此外,您的答案中的asp-route 段落似乎是文档中的直接引用;最好让这一点更清楚by using a block quote
  • 嗨,@janw,谢谢你的建议。我会检查并学习它。
  • "如果除了 asp-route 之外还指定了 asp-controller 或 asp-action,生成的路由可能不是你所期望的。".为什么会这样?你能举个例子吗?在我的问题中,如果它允许您同时指定 asp-route 和 asp-action,我希望它生成 /outbound/Home/a,如果它能够编译,我认为它会生成。
  • 嗨,@David Klempfner,如果您同时指定 asp-routeasp-action,它将不会成功运行。我在答案末尾解释并测试了。
  • @Lightman 感谢您回答“如何”,但我正在寻找的是“为什么”。我看不出他们为什么要这样设计。
猜你喜欢
  • 2023-03-08
  • 1970-01-01
  • 2022-01-26
  • 1970-01-01
  • 1970-01-01
  • 2018-05-13
  • 1970-01-01
  • 2017-08-19
  • 2021-08-06
相关资源
最近更新 更多