50 votes

Comment testez-vous vos variables Request.QueryString []?

J'utilise fréquemment des variables Request.QueryString[] .

Dans mon Page_load je fais souvent des choses comme:

        int id = -1;

        if (Request.QueryString["id"] != null) {
            try
            {
                id = int.Parse(Request.QueryString["id"]);
            }
            catch
            {
                // deal with it
            }
        }

        DoSomethingSpectacularNow(id);
 

Tout cela semble un peu maladroit et nul. Comment gérez-vous vos Request.QueryString[] s?

52voto

Bryan Watts Points 22810

Ci-dessous une méthode d'extension qui vous permettra d'écrire du code comme celui-ci:

 int id = request.QueryString.GetValue<int>("id");
DateTime date = request.QueryString.GetValue<DateTime>("date");
 

Il utilise TypeDescriptor pour effectuer la conversion. En fonction de vos besoins, vous pouvez ajouter une surcharge qui prend une valeur par défaut au lieu de lancer une exception:

 public static T GetValue<T>(this NameValueCollection collection, string key)
{
    if(collection == null)
    {
        throw new ArgumentNullException("collection");
    }

    var value = collection[key];

    if(value == null)
    {
        throw new ArgumentOutOfRangeException("key");
    }

    var converter = TypeDescriptor.GetConverter(typeof(T));

    if(!converter.CanConvertFrom(typeof(string)))
    {
        throw new ArgumentException(String.Format("Cannot convert '{0}' to {1}", value, typeof(T)));
    }

    return (T) converter.ConvertFrom(value);
}
 

34voto

VVS Points 11528

Utilisez plutôt int.TryParse pour vous débarrasser du bloc try-catch:

 if (!int.TryParse(Request.QueryString["id"], out id))
{
  // error case
}
 

19voto

AutomationNation Points 217

Essayez ce mec ...

 List<string> keys = new List<string>(Request.QueryString.AllKeys);
 

Ensuite, vous serez en mesure de rechercher le gars pour une chaîne très facile via ...

 keys.Contains("someKey")
 

17voto

M4N Points 48758

J'utilise une petite méthode d'assistance:

 public static int QueryString(string paramName, int defaultValue)
{
    int value;
    if (!int.TryParse(Request.QueryString[paramName], out value))
    	return defaultValue;
    return value;
}
 

Cette méthode me permet de lire les valeurs de la chaîne de requête de la manière suivante:

 int id = QueryString("id", 0);
 

10voto

Jon Skeet Points 692016

Pour une chose, utilisez plutôt int.TryParse ...

 int id;
if (!int.TryParse(Request.QueryString["id"], out id))
{
    id = -1;
}
 

Cela suppose que "non présent" devrait avoir le même résultat que "pas un entier" bien sûr.

EDIT: Dans d’autres cas, quand vous utiliserez des paramètres de requête comme des chaînes, je pense que c’est une bonne idée de valider leur présence.

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