在我的 C# ASP.Net Core 应用程序中,我有这个端点:
public string Example(int? id = null)
有没有一种简单的方法来设置路由,以便所有这些路径都可以工作?
/Controller/Example/2
- 将 id
设置为 2
/Controller/Example?id=2
- 将 id
设置为 2
/Controller/Example
- 将 id
设置为 null
我正在处理一个包含粗略文档的大型历史代码库,并将项目从 .Net Framework 升级到 .Net Core。使用 .Net Framework,在 URL 中指定
id
的两种方式都会自动处理。目前尚不清楚客户端在调用此 API 时是否有其他应用程序使用这两种形式(是的,当然我正在努力找出答案),所以理想情况下我想继续支持这两种形式。
我已经很好地阅读了路由文档中的此页面,但我仍然一无所知。 :-) 这不是我的核心领域之一。
我尝试了多个
Route
属性,如下所示:
// (The controller's name differs from what we want on the endpoint [sigh] which is why it's given explicitly here)
[Route("Controller/[action]")]
[Route("Controller/[action]/{id?}")]
public string Example(int? id = null)
...但是
/Controller/Example?id=2
运行该方法而不将 id
设置为 2
。当其中一种样式是方法上的唯一属性时,每条路由都适用于其中一种样式,但是当它们都存在时,/Controller/Example?id=2
不起作用(id
是 null
)。
我可以编写代码来执行此操作,或者有两个端点,但是有更简单的方法吗?
可以通过在具有不同绑定源的操作方法中放置 2 个参数并使用具有值(优先)的参数来完成,请参见下文。
它利用了路由参数名称对外界不可见的事实。
[Route("Controller/[action]")]
[Route("Controller/[action]/{routeId?}")]
public IActionResult Example(int? routeId = null, [FromQuery] int? id = null)
{
return View(id ?? routeId); // Or `routeId ?? id` if you prefer
}
结果:
/Controller/Example --> null
/Controller/Example/3 --> 3
/Controller/Example/?id=5 --> 5
/Controller/Example/3?id=5 --> 5 // gave precedence to id=