クエリパラメータからオブジェクトへのモデルバインドを使用して検索しようとしています。
私の検索オブジェクトは
[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を使用するにはどうすればよいですか?
モデルプロパティに[FromQuery]
属性を個別に追加する必要があります
public class Criteria
{
[FromQuery(Name = "first_name")]
public string FirstName { get; set; }
}
。netコア2.1、2.2、および3.0のソリューション
または、属性がなくても、このようなことができます(モデルのプロパティがクエリパラメーターと同じ場合)。
その間、.netコア2.1、2.2、および3.0プレビュー5&6で使用します。
public async Task<IActionResult> Get([FromQuery]ReportQueryModel queryModel)
{
}
@ 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; }
}