方法上有多条路由,参数在不同位置



我正在将一个旧的API转换为。net 7,同时为一些比旧的更有意义的方法创建一些新的路由,同时保持旧的兼容性。

在某些情况下,参数作为查询参数传递,但将其作为路由参数传递更有意义。我发现做这项工作的唯一方法是创建两个类似的方法,一个是用FromQuery属性声明参数,另一个是用FromRoute属性声明参数。这样的:

[Route("value")]
public IActionResult GetValue1([FromQuery(Name = "param")] int parameter)
{
...
}
[Route("value/{param}")]
public IActionResult GetValue2([FromRoute(Name = "param")] int parameter)
{
...
}

是否有可能声明该方法的一个实例,该实例将通过路由或查询接受参数,或者我必须为此使用两个单独的方法?

[编辑]

我创建了一个小项目来测试这一点,其中一个方法声明如下:

[HttpGet]
[Route("string")]
[Route("string/{str}")]
public string GetString(string str)
{
return $"abc + {str}";
}

如果我用route参数调用方法,像这样:

/string/123

然后我得到预期的回复abc + 123

但是如果我用查询参数调用这个方法,像这样:

/string?str=123

然后我得到一个错误:The str field is required.

如果我将方法参数更改为可空(string?),那么它不会返回错误,但它不会从查询中获取参数值,它只是返回abc +

下面的代码可以工作。

[HttpGet]
[Route("string/{str1?}")]
public string GetString([FromRoute]string? str1, [FromQuery]string? str)
{
if (str1 != null) { str = str1; }
return $"abc + {str}";
}