同一条路线支持两种风格的参数?

问题描述 投票:0回答:1

在我的 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
)。

我可以编写代码来执行此操作,或者有两个端点,但是有更简单的方法吗?

asp.net-core routes
1个回答
0
投票

可以通过在具有不同绑定源的操作方法中放置 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= 
© www.soinside.com 2019 - 2024. All rights reserved.