How do you test your Request.QueryString[] variables?

前端 未结 11 2136
梦如初夏
梦如初夏 2020-11-29 16:05

I frequently make use of Request.QueryString[] variables.

In my Page_load I often do things like:

       int id = -1;

             


        
相关标签:
11条回答
  • 2020-11-29 16:29

    I'm using a little helper method:

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

    This method allows me to read values from the query string in the following way:

    int id = QueryString("id", 0);
    
    0 讨论(0)
  • 2020-11-29 16:29

    Eeee this is a karma risk...

    I have a DRY unit-testable abstraction because, well, because there were too many querystring variables to keep on in a legacy conversion.

    The code below is from a utility class whose constructor requires a NameValueCollection input (this.source) and the string array "keys" is because the legacy app was rather organic and had developed the possibility for several different strings to be a potential input key. However I kind of like the extensibility. This method inspects the collection for the key and returns it in the datatype required.

    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;
    }
    
    0 讨论(0)
  • 2020-11-29 16:30

    Use int.TryParse instead to get rid of the try-catch block:

    if (!int.TryParse(Request.QueryString["id"], out id))
    {
      // error case
    }
    
    0 讨论(0)
  • 2020-11-29 16:30

    You can use the extension methods below as well and do like this

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

    // Extension methods

    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;
    }
    
    0 讨论(0)
  • 2020-11-29 16:32

    Try this dude...

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

    Then you will be able to search the guy for a string real easy via...

    keys.Contains("someKey")
    
    0 讨论(0)
  • 2020-11-29 16:38

    Well for one thing use int.TryParse instead...

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

    That assumes that "not present" should have the same result as "not an integer" of course.

    EDIT: In other cases, when you're going to use request parameters as strings anyway, I think it's definitely a good idea to validate that they're present.

    0 讨论(0)
提交回复
热议问题