为啥 asp-route 和 asp-action 互斥?

Posted

技术标签:

【中文标题】为啥 asp-route 和 asp-action 互斥?【英文标题】: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() 的操作方法 【参考方案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 感谢您回答“如何”,但我正在寻找的是“为什么”。我看不出他们为什么要这样设计。

以上是关于为啥 asp-route 和 asp-action 互斥?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 ASP.NET MVC 中使用 asp-controller 或 asp-action 访问我的 url 中的多个层

mvc和api项目的路由冲突

属性路由默认网址

根据验证结果切换元素可见性

Html.AntiForgeryToken() 仍然需要吗?

按钮提交前的Javascript函数