将查询参数绑定到ASP.NET Core中的模型

Car*_*mas 18 c# asp.net asp.net-mvc model-binding asp.net-core

我试图使用从查询参数到对象的模型绑定进行搜索.

我的搜索对象是

[DataContract]
public class Criteria 
{
  [DataMember(Name = "first_name")]
  public string FirstName { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

我的控制器有以下操作

[Route("users")]
public class UserController : Controller 
{
  [HttpGet("search")]
  public IActionResult Search([FromQuery] Criteria criteria)
  {
    ...
  }
}
Run Code Online (Sandbox Code Playgroud)

当我按如下方式调用端点.../users/search?first_name=dave时,控制器操作的criteria属性为null.但是,我可以将端点称为蛇案例.../users/search?firstName=dave,而criteria属性包含属性值.在这种情况下,模型绑定已经起作用,但是当我使用snake_case时却没有.

如何在模型绑定中使用snake_case?

Car*_*mas 32

您需要[FromQuery]单独向模型属性添加属性

public class Criteria
{
  [FromQuery(Name = "first_name")]
  public string FirstName { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

  • 我不能让这个工作,但它被标记为答案. (7认同)
  • 我只是想补充一点,我遇到了其他人也可能遇到的问题:我将参数命名为'model'.我的对象有一个属性,也被称为'模型'.数据绑定不起作用,直到我重命名我的参数. (3认同)
  • 如果我想与具有GET和POST端点的自定义名称的成员一起使用数据协定,那么在第一种情况下,它将是FromQuery,而FromBody用于POST请求? (2认同)
  • `FromQuery`坐在`Microsoft.AspNetCore.Mvc`包,这是一个有点伤心,这种依赖关系添加到项目中,你只存储您的POCO。 (2认同)
  • @sander 的解决方案对我有用 - 谢谢你,我花了一个多小时试图解决这个问题。学到的教训是检查所有参数名称。 (2认同)

pey*_*our 14

.net core 2.1、2.2和3.0的解决方案

或者没有属性,您可以做类似我认为更干净的事情(当然,如果模型属性与查询参数相同)。

同时,我在.net core 2.1、2.2和3.0预览版5&6中使用了它。

public async Task<IActionResult> Get([FromQuery]ReportQueryModel queryModel) 
{ 

}
Run Code Online (Sandbox Code Playgroud)

  • 这是NetCore 2.1及更高版本的正确答案,可接受的答案是过时的。 (3认同)
  • 我认为问题在于此答案未解决具体问题。OP专门为该属性要求一个不同的名称,正如给出此答案的人所述,这不支持该名称。 (2认同)

n.p*_*ski 7

对于像我这样从搜索引擎来到这里的人:

使其在 asp.net core 3.1+ 上运行

public async Task<IActionResult> Get([FromQuery] RequestDto request);

public class RequestDto
{
  [FromQuery(Name = "otherName")]
  public string Name { get; set; }
}

Run Code Online (Sandbox Code Playgroud)

将 json 属性读otherNameRequestDto.Name所以基本上你必须FromQuery在 2 个地方使用。以上答案恕我直言,对于asp.net框架中已经提供的这么简单的东西来说太复杂了。

  • @Max - 嗨,麦克斯。不,它不适用于 Newtonsoft [JsonPropery(Name = "otherName")] (2认同)