为啥 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 的视图来自 HomeController
的 Index
方法。
为什么不使用"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-controller
或asp-action
,则生成的路由可能不是您所期望的。
为避免路由冲突,asp-route
不应与 asp-controller
和 asp-action
属性一起使用。
顺便说一句,default route
和 area route
根据调用它们的顺序自动为它们的端点分配一个顺序值。
asp-route
和asp-controller
和asp-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
在一个<a>
标签中同时设置时出现。
【讨论】:
这很有趣,我不知道使用asp-area
实现了类似的功能。但是这个答案仍然不能解释 为什么 asp-route
和 asp-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-route
和 asp-action
,它将不会成功运行。我在答案末尾解释并测试了。
@Lightman 感谢您回答“如何”,但我正在寻找的是“为什么”。我看不出他们为什么要这样设计。以上是关于为啥 asp-route 和 asp-action 互斥?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 ASP.NET MVC 中使用 asp-controller 或 asp-action 访问我的 url 中的多个层