我正在将一个旧的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}";
}