Analyseur C # ASP.NET QuerySsortingng

Si vous avez cherché un moyen simple et propre d’parsingr les valeurs de votre chaîne de requête, voici ce que j’ai trouvé:

///  /// Parses the query ssortingng and returns a valid value. ///  ///  /// The query ssortingng key. /// The value. protected internal T ParseQuerySsortingngValue(ssortingng key, ssortingng value) { if (!ssortingng.IsNullOrEmpty(value)) { //TODO: Map other common QuerySsortingng parameters type ... if (typeof(T) == typeof(ssortingng)) { return (T)Convert.ChangeType(value, typeof(T)); } if (typeof(T) == typeof(int)) { int tempValue; if (!int.TryParse(value, out tempValue)) { throw new ApplicationException(ssortingng.Format("Invalid QuerySsortingng parameter {0}. The value " + "'{1}' is not a valid {2} type.", key, value, "int")); } return (T)Convert.ChangeType(tempValue, typeof(T)); } if (typeof(T) == typeof(DateTime)) { DateTime tempValue; if (!DateTime.TryParse(value, out tempValue)) { throw new ApplicationException(ssortingng.Format("Invalid QuerySsortingng parameter {0}. The value " + "'{1}' is not a valid {2} type.", key, value, "DateTime")); } return (T)Convert.ChangeType(tempValue, typeof(T)); } } return default(T); } 

J’ai toujours voulu avoir quelque chose comme ça et finalement j’ai bien compris … du moins je le pense …

Le code devrait être explicite …

Tous les commentaires ou suggestions pour le rendre meilleur sont appréciés.

Un moyen simple d’parsingr (si vous ne voulez pas faire de conversions de type) est

  HttpUtility.ParseQuerySsortingng(querySsortingng); 

Vous pouvez extraire une chaîne de requête à partir d’une URL avec

  new Uri(url).Query 

Étant donné que vous ne gérez que trois types différents, je suggérerais plutôt trois méthodes différentes. Les méthodes génériques sont préférables lorsqu’elles fonctionnent bien avec tous les arguments de type autorisés par les contraintes de type.

De plus, je vous recommande fortement de spécifier la culture à utiliser pour int et DateTime – cela ne dépend pas vraiment de la culture du serveur. (Si vous avez du code pour deviner la culture de l’utilisateur, vous pouvez utilisez plutôt cela.) Enfin, je suggérerais également de prendre en charge un ensemble bien spécifié de formats DateTime plutôt que tout ce que TryParse prend en charge par défaut. (J’utilise presque toujours ParseExact / TryParseExact au lieu de Parse / TryParse .)

Notez que la version de chaîne n’a pas vraiment besoin de faire quoi que ce soit, étant donné que la value est déjà une chaîne (bien que votre code actuel convertisse “” en null , ce qui peut être ou ne pas être ce que vous voulez).

J’ai écrit la méthode suivante pour parsingr le QuerySsortingng en valeurs fortement typées:

 public static bool TryGetValue(ssortingng key, out T value, IFormatProvider provider) { ssortingng querySsortingngValue = HttpContext.Current.Request.QuerySsortingng[key]; if (querySsortingngValue != null) { // Value is found, try to change the type try { value = (T)Convert.ChangeType(querySsortingngValue, typeof(T), provider); return true; } catch { // Type could not be changed } } // Value is not found, return default value = default(T); return false; } 

Exemple d’utilisation:

 int productId = 0; bool success = TryGetValue("ProductId", out productId, CultureInfo.CurrentCulture); 

Pour une chaîne de requête de ?productId=5 la valeur bool serait vraie et int productId serait égal à 5.

Pour une chaîne de requête de ?productId=hello la valeur bool serait fausse et int productId serait égal à 0.

Pour une chaîne de requête de ?noProductId=notIncluded la valeur bool serait fausse et int productId serait égal à 0.

Dans mon application, j’utilise la fonction suivante: –

 public static class WebUtil { public static T GetValue(ssortingng key, StateBag stateBag, T defaultValue) { object o = stateBag[key]; return o == null ? defaultValue : (T)o; } } 

La valeur par défaut requirejse est renvoyée si le paramètre n’a pas été fourni, que le type est déduit de defaultValue et que des exceptions de transtypage sont levées selon les besoins.

L’utilisation est la suivante: –

 var foo = WebUtil.GetValue("foo", ViewState, default(int?)); 

C’est une vieille réponse, mais j’ai fait ce qui suit:

  ssortingng querySsortingng = relayState.Split("?").ElementAt(1); NameValueCollection nvc = HttpUtility.ParseQuerySsortingng(querySsortingng); 

Il me semble que vous effectuez beaucoup de conversions de type non séculaires. Les variables tempValue sont du type que vous essayez de renvoyer. De même, dans le cas de la chaîne, la valeur est déjà une chaîne, vous devez donc la renvoyer.

Basé sur la réponse de Ronald, j’ai mis à jour ma propre méthode d’parsing syntaxique. La façon dont je l’utilise est de l’append en tant que méthode d’extension à l’object Page, ce qui me permet de vérifier les valeurs et les types de chaînes de requête et de les redirect si la demande de page n’est pas valide.

La méthode d’extension ressemble à ceci:

 public static class PageHelpers { public static void RequireOrPermanentRedirect(this System.Web.UI.Page page, ssortingng QuerySsortingngKey, ssortingng RedirectUrl) { ssortingng QuerySsortingngValue = page.Request.QuerySsortingng[QuerySsortingngKey]; if(Ssortingng.IsNullOrEmpty(QuerySsortingngValue)) { page.Response.RedirectPermanent(RedirectUrl); } try { T value = (T)Convert.ChangeType(QuerySsortingngValue, typeof(T)); } catch { page.Response.RedirectPermanent(RedirectUrl); } } } 

Cela me permet de faire les choses suivantes:

 protected void Page_Load(object sender, EventArgs e) { Page.RequireOrPermanentRedirect("CategoryId", "/"); } 

Je peux ensuite écrire le rest de mon code et m’appuyer sur l’existence et le format correct de l’élément de chaîne de requête afin de ne pas avoir à le tester à chaque fois que je souhaite y accéder.

Remarque: Si vous utilisez une version antérieure à .net 4, vous souhaiterez également la méthode d’extension RedirectPermanent suivante:

 public static class HttpResponseHelpers { public static void RedirectPermanent(this System.Web.HttpResponse response, ssortingng uri) { response.StatusCode = 301; response.StatusDescription = "Moved Permanently"; response.AddHeader("Location", uri); response.End(); } }