Frage

ich häufig Gebrauch von Request.QueryString[] Variablen machen.

In meinem Page_load ich oft Dinge tun, wie:

       int id = -1;

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

        DoSomethingSpectacularNow(id);

Es scheint alles ein bisschen klobig und Müll. Wie gehen Sie mit Ihrem Request.QueryString[]s umgehen?

War es hilfreich?

Lösung

Im Folgenden ist eine Erweiterung Methode, die Sie Code wie folgt geschrieben werden kann:

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

Es nutzt TypeDescriptor die Umwandlung durchzuführen. Basierend auf Ihre Bedürfnisse, können Sie eine Überlastung hinzufügen, die stattdessen einen Standardwert nimmt eine Ausnahme zu werfen:

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);
}

Andere Tipps

Verwenden int.TryParse anstelle des Try-Catch-Block, um loszuwerden:

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

Mit dieser Geck Try ...

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

Dann werden Sie in der Lage sein, den Mann für einen String wirklich einfach über ...

suchen
keys.Contains("someKey")

Ich bin mit einer kleinen Hilfsmethode:

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

Diese Methode erlaubt es mir, Werte aus dem Abfrage-String in der folgenden Art und Weise zu lesen:

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

Gut für eine Sache Gebrauch int.TryParse statt ...

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

Das setzt voraus, dass „nicht vorhanden“ sollte das gleiche Ergebnis wie „nicht eine ganze Zahl“ natürlich hat.

EDIT: In anderen Fällen, wenn Sie Anforderungsparameter als Strings verwenden sowieso gehen, ich denke, es ist auf jeden Fall eine gute Idee zu überprüfen, ob sie vorhanden sind

.

Sie können die Erweiterungsmethoden unten als auch verwenden und wie dies tun

int? id = Request["id"].ToInt();
if(id.HasValue)
{

}

// Erweiterungsmethoden

public static int? ToInt(this string input) 
{
    int val;
    if (int.TryParse(input, out val))
        return val;
    return null;
}

public static DateTime? ToDate(this string input)
{
    DateTime val;
    if (DateTime.TryParse(input, out val))
        return val;
    return null;
}

public static decimal? ToDecimal(this string input)
{
    decimal val;
    if (decimal.TryParse(input, out val))
        return val;
    return null;
}
if(!string.IsNullOrEmpty(Request.QueryString["id"]))
{
//querystring contains id
}

Eeee dies ist ein Karma Risiko ...

Ich habe ein DRY Einheit testbare Abstraktion, weil, na ja, weil es zu viele Variablen Abfragezeichenfolgeflag waren in einer Legacy-Umwandlung zu behalten.

Der folgende Code ist aus einer Utility-Klasse, dessen Konstruktor erfordert einen Namevaluecollection-Eingang (this.source) und den String-Array „Schlüssel“ ist, weil der Legacy-App eher organisch war und hatte die Möglichkeit, mehr verschiedenen Saiten entwickelt, um ein Potential zu sein Eingabe-Taste. Jedoch habe ich ein bisschen wie die Dehnbarkeit. Dieses Verfahren prüft die Sammlung für den Schlüssel und gibt sie in den Datentyp erforderlich ist.

private T GetValue<T>(string[] keys)
{
    return GetValue<T>(keys, default(T));
}

private T GetValue<T>(string[] keys, T vDefault)
{
    T x = vDefault;

    string v = null;

    for (int i = 0; i < keys.Length && String.IsNullOrEmpty(v); i++)
    {
        v = this.source[keys[i]];
    }

    if (!String.IsNullOrEmpty(v))
    {
        try
        {
            x = (typeof(T).IsSubclassOf(typeof(Enum))) ? (T)Enum.Parse(typeof(T), v) : (T)Convert.ChangeType(v, typeof(T));
        }
        catch(Exception e)
        {
            //do whatever you want here
        }
    }

    return x;
}

Ich habe eigentlich eine Utility-Klasse, die Generics verwendet, um „wrap“ Sitzung, die alle „Grunzen Arbeit“ für mich tut, ich habe auch etwas fast identisch mit Abfrage-Zeichenfolge-Werten zu arbeiten.

Dies hilft, den Code Betrogene für die (oft zahlreichen) prüft entfernen ..

Zum Beispiel:

public class QueryString
{
    static NameValueCollection QS
    {
        get
        {
            if (HttpContext.Current == null)
                throw new ApplicationException("No HttpContext!");

            return HttpContext.Current.Request.QueryString;
        }
    }

    public static int Int(string key)
    {
        int i; 
        if (!int.TryParse(QS[key], out i))
            i = -1; // Obviously Change as you see fit.
        return i;
    }

    // ... Other types omitted.
}

// And to Use..
void Test()
{
    int i = QueryString.Int("test");
}

Hinweis:

Dies macht offensichtlich Verwendung der Statik, die einige Leute mögen es nicht, wegen der Art und Weise kann es Testcode auswirken .. Sie leicht in etwas umgestalten können, die auf Instanzen und alle Schnittstellen auf Basis arbeitet Sie benötigen .. Ich denke, nur die Statik Beispiel ist das leichteste.

Hope, das hilft / gibt zu denken.

I-Funktionen zu tun haben für jeden (eigentlich ist es eine kleine Klasse, mit vieler Statik):

  • GetIntegerFromQuerystring(val)
  • GetIntegerFromPost(val)
  • ....

Es gibt -1, wenn nicht (, die für mich fast immer in Ordnung ist, ich habe einige andere Funktionen für negative Zahlen als auch ).

Dim X as Integer = GetIntegerFromQuerystring("id")
If x = -1 Then Exit Sub

I modifizierte Antwort Bryan Watts' so, dass, wenn die param Ihre fragen nicht existiert, und Sie haben einen Nullable-Typ angegeben wird null zurück:

public static T GetValue<T>(this NameValueCollection collection, string key)
    {
        if (collection == null)
        {
            return default(T);
        }

        var value = collection[key];

        if (value == null)
        {
           return default(T);
        }

        var type = typeof(T);

        if (type.IsGenericType && type.GetGenericTypeDefinition() == typeof(Nullable<>))
        {
            type = Nullable.GetUnderlyingType(type);
        }

        var converter = TypeDescriptor.GetConverter(type);

        if (!converter.CanConvertTo(value.GetType()))
        {
            return default(T);
        }

        return (T)converter.ConvertTo(value, type);
    }

Sie können dies jetzt tun:

Request.QueryString.GetValue<int?>(paramName) ?? 10;
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top