web-dev-qa-db-fra.com

Lier des paramètres de requête à un modèle dans ASP.NET Core

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?

16
Carl Thomas

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; }
}
31
Carl Thomas

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) 
{ 

}
12
peyman gilmour

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; }
}
0
Soheil Alizadeh