我可以从 HttpGet 中的 Route 属性获取简单类型参数,从 uri 获取复杂类型参数吗?

Can I get simple type parameter from Route attribute and complex type from uri in HttpGet?

我将尝试在下面的示例中解释我的问题

如果我们有 url 比如这个:

localhost/api/person/5?FirstName=Adam&LastName=Smith&City=London

并尝试获取参数

[HttpGet]
[Route("person/{someId}")]
public ActionResult Location(string someId, PersonRequest request)

是否可以尝试将“someId”之类的东西绑定到“/5”以及“?”之后的所有内容?绑定到 PersonRequest?

public class PersonRequest
{
    public string? FirstName { get; set; }
    public string? LastName { get; set; }
    public string? City { get; set; }
}

我一直在尝试将它与 [FromUri] 等匹配,但我不知道如何做到这一点。仅当我在 Location 方法中列出所有参数时它才有效。

您可以使用 FromQuery 内联属性,如下所示:

[HttpGet]
[Route("person/{someId}")]
public ActionResult Location(string someId,[FromQuery] PersonRequest request)
{
    // TODO
}

顺便说一句,我认为一个好的做法是只绑定查询字符串中的搜索词、过滤器等。如果您的 use-case 是发布一个 rest API 那么从 body 绑定是正确的方法。

考虑检查 Parameter Binding in ASP.NET Web API,因为它可以帮助您更深入地了解绑定。