72 votes

Pourquoi StringValues est-il utilisé pour les valeurs Request.Query?

Disons que j'ai quelques url qui ressemble à ceci: www.myhost.com/mypage?color=blue

Dans Asp.Net de Base, je m'attends à obtenir la couleur valeur du paramètre de requête en procédant comme suit:

string color = Request.Query["color"];

Mais il s'avère que l' Request.Query["color"] retourne une valeur de type StringValues plutôt que d' string. Pourquoi est-ce?

Apparemment, l' StringValues type peut contenir un tableau de chaînes de caractères et inclut le support pour la conversion implicite d' string[] ce qui est cool, mais pourquoi est-ce nécessaire pour une requête param valeur?

D'avoir à obtenir la valeur comme cela semble étrange:

string color = Request.Query["color"].ToString();

Et pire, la vérification de la valeur pour voir si une requête paramètre est spécifié ne peut plus être fait comme

  if(Request.Query["color"] == null) { 
      //param was not specified
  }

mais au lieu de cela doit être vérifié comme

 if(Request.Query["color"].Count == 0) { 
      //param was not specified
 }

Depuis un seul paramètre de requête ne peut pas avoir plusieurs valeurs (autant que je sache) pourquoi est - Request.Query["color"] retourner un StringValues objet plutôt qu'une chaîne de caractères?

55voto

Jamiec Points 35773

Parce que votre requête peut ressembler à ceci:

www.myhost.com/mypage?color=blue&color=red&color=yellow

Et vous obtenez tous les color des valeurs de celle Request.Query["color"] paramètre

53voto

poke Points 64398

Comme déjà mentionné par d'autres, le type est un StringValues objet parce que techniquement, plusieurs valeurs sont autorisés. Alors que la pratique courante est de définir une valeur unique, l'URI de spécification de ne pas rejeter les valeurs de réglage à plusieurs reprises. Et c'est à la demande pour décider comment gérer cela.

Cela étant dit, StringValues a une conversion implicite en string, de sorte que vous n'avez pas réellement besoin d'appeler ToString() sur, vous pouvez simplement l'utiliser comme si c'était une chaîne de caractères. Donc, faire des choses comme Request.Query["color"] == "red", ou de passer à une méthode qui attend une chaîne tout fonctionne.

Et pire, la vérification de la valeur pour voir si une requête paramètre est spécifié ne peut plus être fait comme Request.Query["color"] == null mais au lieu de cela doit être vérifié comme Request.Query["color"].Count == 0

C'est seulement à moitié vrai. Oui, afin de vérifier si une StringValues objet est vide, vous pouvez vérifier sa Count de la propriété. Vous pouvez également vérifier à l' StringValues.Empty:

Request.Query["color"] == StringValues.Empty

Toutefois, le premier "problème" est qu' Request.Query[x] sera toujours retourner une valeur non null StringValues objet (il est donc prudent de vérifier pour n'importe quelle valeur). Si vous voulez vérifier si une clé existe dans la requête arguments, vous devez utiliser ContainsKey:

if (Request.Query.ContainsKey("color"))
{
    // only now actually retrieve the value
    string colorValue = Request.Query["color"];
}

Ou sinon, vous pouvez utiliser TryGetValue:

if (Request.Query.TryGetValue("color", out var colorValue))
{
    DoSomething(colorValue);
}

Cela étant dit, accéder Request.Query n'est pas vraiment nécessaire la plupart du temps. Vous devriez utiliser faire usage de la liaison de modèle à la place qui vous donnera automatiquement la requête arguments, vous avez besoin simplement de les avoir dans l'action de la signature:

public ActionResult MyAction(string color)
{
    DoSomething(color);
}

6voto

Amey Vaidya Points 281

Seulement l'affichage pour les curieux âmes et sans doute peu à voir avec la question. Juste à la prudence.

Je me suis retrouvé dans la même question. Il y a le couple d'autres questions de ce type.

  1. Si vous avez des paramètres de la requête avec aucune valeur. Par exemple: /products?pageNo=1&pageSize=

    Vous allez vous retrouver obtenir une exception pour pageSize paramètre Count bien sur StringValue va vous donner la valeur 1, mais sous-jacent _value est "" (vide ficelle) _values est null. Remarque - Exception se produit, vous tentez de convertir ou les valeurs de l'accès de IQueryCollection)

  2. À l'aide de TryGetValue , vous obtiendrez de valeur en toute sécurité hors de l' StringValue mais si c'est null (comme dans le cas d' pageSize paramètre ci-dessus), Vous aurez de la difficulté à comprendre pourquoi ne pouvez-vous pas convertir StringValue simples, en String ou pourquoi ne peut pas comparer avec null de effectuer d'autres opérations sur elle comme des validations etc.

  3. Faire aucune vérification sur StringValue type, l'utilisation de méthodes fournies par le type.

Pour vérifier la valeur null ou vide utilisation - StringValue.IsNullOrEmpty(StringValue value)

-3voto

lucky Points 10247

Vous ne devez pas utiliser Request.Query ,

 public ActionResult SaveColor(string color);
 

Laissez le Mvc s'en occuper.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X