J'essaie d'utiliser la liaison de modèle des paramètres de requête à un objet pour la recherche.
Mon objet de recherche est
[DataContract]
public class Criteria
{
[DataMember(Name = "first_name")]
public string FirstName { get; set; }
}
Mon contrôleur a l'action suivante
[Route("users")]
public class UserController : Controller
{
[HttpGet("search")]
public IActionResult Search([FromQuery] Criteria criteria)
{
...
}
}
Lorsque j'appelle le point de terminaison comme suit .../users/search?first_name=dave
la propriété critère de l'action du contrôleur est nulle. Cependant, je peux appeler le point de terminaison pas comme un cas de serpent .../users/search?firstName=dave
et la propriété critère contient la valeur de la propriété. Dans ce cas, la liaison de modèle a fonctionné, mais pas lorsque j'utilise snake_case.
Comment puis-je utiliser snake_case avec Model Binding?
Vous devez ajouter [FromQuery]
attribut individuel aux propriétés du modèle
public class Criteria
{
[FromQuery(Name = "first_name")]
public string FirstName { get; set; }
}
Solution pour .net core 2.1, 2.2 et 3.
Ou sans attributs, vous pouvez faire quelque chose comme ça qui est plus propre je pense (bien sûr si les propriétés du modèle sont les mêmes que les paramètres de requête).
Pendant ce temps, je l'utilise dans .net core 2.1, 2.2 et 3.0 preview 5 & 6.
public async Task<IActionResult> Get([FromQuery]ReportQueryModel queryModel)
{
}
Selon @ Carl Thomas réponse, voici la manière la plus simple et la plus typée d'avoir un nom FromQuery de cas de serpent:
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();
}
Utilisation
public class Criteria
{
[CustomFromQuery(nameof(FirstName))]
public string FirstName { get; set; }
}