web-dev-qa-db-ja.com

ASP.NET Coreのモデルにクエリパラメーターをバインドする

クエリパラメータからオブジェクトへのモデルバインドを使用して検索しようとしています。

私の検索オブジェクトは

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

私のコントローラーには次のアクションがあります

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

次のようにエンドポイントを呼び出すと、.../users/search?first_name=daveコントローラーアクションの条件プロパティがnullです。ただし、スネークケースとしてではなく、エンドポイントを呼び出すことができます.../users/search?firstName=daveおよびcriteriaプロパティにはプロパティ値が含まれます。この場合、Model Bindingは機能しましたが、snake_caseを使用すると機能しませんでした。

Model Bindingでsnake_caseを使用するにはどうすればよいですか?

16
Carl Thomas

モデルプロパティに[FromQuery]属性を個別に追加する必要があります

public class Criteria
{
  [FromQuery(Name = "first_name")]
  public string FirstName { get; set; }
}
31
Carl Thomas

。netコア2.1、2.2、および3.0のソリューション

または、属性がなくても、このようなことができます(モデルのプロパティがクエリパラメーターと同じ場合)。

その間、.netコア2.1、2.2、および3.0プレビュー5&6で使用します。

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

}
12
peyman gilmour

@ Carl Thomas 回答によると、FromQueryの名前をスネークケースにするための、より簡単でtro型の方法があります。

CustomFromQuery

public class CustomFromQueryAttribute : FromQueryAttribute
{
    public CustomFromQuery(string name)
    {
        Name = name.ToSnakeCase();
    }
}

StringExtensions

public static class ObjectExtensions
{
  public static string ToSnakeCase(this string o) => Regex.Replace(o, @"(\w)([A-Z])", "$1_$2").ToLower();
}

使用法

public class Criteria
{
   [CustomFromQuery(nameof(FirstName))]
   public string FirstName { get; set; }
}
0
Soheil Alizadeh