从 GET 方法的路由和查询字符串绑定到对象

use*_*072 1 asp.net-core-webapi asp.net-core-2.0

我一直在使用 2.2 中的 Web api,并且使用对象的 post 方法或使用基元的 get 方法没有任何问题。我的问题是我想同时从路由中的值和查询字符串值的 get 方法绑定到模型对象。

所以基本上从下面的代码我想绑定到一个简单的对象。如果您想象该网址是:

http://localhost:9999/api/Values/ {名字}?{姓氏}=鲍勃

我尝试装饰模型对象并收到 415 个响应,这看起来很奇怪

using Microsoft.AspNetCore.Mvc;

namespace apitest.Controllers
{
    [Route("api/[controller]")]
    [ApiController]
    public class ValuesController : ControllerBase
    {
        // GET api/values/5
        [HttpGet("{Firstname}")]
        public ActionResult<string> Get(Person person)
        {
            return "value";
        }
    }
}

namespace apitest
{
    public class Person
    {
        public string Firstname { get; set; }
        public string Surname { get; set; }
    }
}
Run Code Online (Sandbox Code Playgroud)

显然,这个示例是微不足道且无意义的,但基本上我只想将路由/查询字符串中的名字和姓氏映射到 Person 对象上的名字/姓氏属性。我必须编写自定义模型绑定程序吗?如果是这样,有什么好的例子吗?

小智 6

已经有一段时间了,但也许在 ASP.NET Core 3.1 中遇到同样问题的人会在这里结束,所以我会留下我的答案:)

使用 [FromQuery] 属性注释 person 参数,使用 [FromRoute] 属性注释 Firstname 属性就可以解决问题。

所以它应该看起来像这样:

namespace apitest.Controllers
{
    [Route("api/[controller]")]
    [ApiController]
    public class ValuesController : ControllerBase
    {
        // GET api/values/5
        [HttpGet("{Firstname}")]
        public ActionResult<string> Get([FromQuery] Person person)
        {
            return "value";
        }
    }
}

namespace apitest
{
    public class Person
    {
        [FromRoute]
        public string Firstname { get; set; }
        public string Surname { get; set; }
    }
}
Run Code Online (Sandbox Code Playgroud)