views:

2548

answers:

4

I have an issue whereby the company uses a business tracking system that captures a users first visit and redirects them to the page they were trying to visit but with a refferer URL attached... Now as the referer URL carries the url that the person was trying to visit (dont ask why, Ive no idea) it causes me to have a duplicate of every value.

So visiting this...

home.aspx?test=test&test2=test2

becomes

home.aspx?test=test&test2=test2&referrerurl=home.aspx?test=test&test2=test2

Now, URL Encoding the referrer would sort the issue but i've more chance of being molested by a gorilla; so the question stands. How do I dedupe the output from .QueryString ?

Currently I'm using this ...

private string queryClean(string entity)
{
    try
    {
        if(Request.QueryString["referrerUrl"] != null){
        string[] Split = entity.Split(new Char[] { ',' });
        string tmpValue = Convert.ToString(Split[0]);

        return tmpValue;
        }else{ return entity; }
    }
    catch (Exception cleanError) 
    { 
        errors.Text += "-clean-" + cleanError + "-endclean-";
        return entity;
    }

}

(ignore the try/catch we have app level error catching, but I'm still playing with it).

I'm using C# .net 2

Thanks


[Additional Info]

The reffererURL will always be on the end of the string so it could be possible to delete all of the query string after this point?

I've tried using

string test = Convert.ToString(Request.QueryString);
string[] tRSplit = Regex.Split(test, "&referrerUrl");
Response.Write(tRSplit[0]);

and...

System.Collections.Generic.List<string> testb = new System.Collections.Generic.List<string>(Convert.ToString(Request.QueryString).Split('&'));
            for (int i = 0; i < testb.Count; i++)
            {

                Response.Write(i +": "+ testb[i].ToString()+"<br><br>");
            }

Both still produce the duplicates


I could use Trim But is there a cleaner/faster way of achieving this.

+1  A: 

I assume you have no control of the redirecting, right? Been there myself, I'm sorry to say. Your problem is theoretically unsolvable, but the tendency seems to be that the lovely people who don't URI encode parameters just append them to the URL, so you could get the raw querystring (from the request.RawUrL property) and just ignore everything after referrerUrl. It's butt-ugly, but basically:

if(Request.QueryString["referrerUrl"] != null)
{
    string qs = request.RawUrl.Substring(request.RawUrl.IndexOf("?") + 1);
    qs = qs.Substring(0, qs.IndexOf("referrerUrl"));
    ReplaceQuerystring(qs);
}

ReplaceQuerystring now receives the querystring as "var1=valA&var2=varB&". Just chop it up on the ampersands, chop every part up on the equals signs, URL decode and store somewhere (actually, request.QueryString should be mutable, so that's probably an option). At least, this is pretty much the way I did it. For your sake, I hope someone comes up with a better solution :)

gustafc
Thanks, and yes your right I can't change it; and even if they agree to change it the release cycle would be to far away.
Chris M
+1  A: 

Something like this should work:

NameValueCollection fixedQueryString = new NameValueCollection();
foreach (string key in Request.QueryString.Keys)
{
  string value = Request.QueryString[key];
  if(value.Contains(","))
  {
     value = value.Split(',')[0];
  }
  fixedQueryString.Add(key, value);
}

This code will create a new NameValueCollection where we rebuild the query string. We then check each value for a , which usually indicates that a value is repeated more than once. For instance the url home.aspx?test=test&test2=test2&referrerurl=home.aspx?test=test&test2=test2 will generate the value "test, test" for the query string value "test".

Rune Grimstad
Nice solution but a but the code will be in a class library so I'll have no access to the querystring beyond passing it as a string to the class.
Chris M
You can create a NameValueCollection from the query string itself by using the HttpUtility.ParseQueryString method. Then you might be able to use this method
Rune Grimstad
A: 

[Example URL]

Default2.aspx?test=test&test2=test2&referrerURL=http://www.test.com/home.aspx?test=test&amp;test=test

[This Would Produce]

test=test
test=test
test2=test2
referrerURL=http://www.test.com/home.aspx?test=test

[So an edited version of gustafc's answer...]

    //Capture the raw url
    test = Request.RawUrl.ToString();
    //Set the start index as 1 after the query ?
    int startTxt = (test.IndexOf("?") + 1);
    //Find the number of characters between ? and &referrerURL
    int countTxt = ((test.IndexOf("&referrerURL")-1) - test.IndexOf("?"));
    //Capture the substring and split into a string array using &
    string[] aTest = test.Substring(startTxt, countTxt).Split(new Char[] { '&' });

[Running a test produces the following]

-0~test=test

-1~test2=test2

[Which is what I expected to recieve]

(for completeness heres the simple for statement)

    for (int i = 0; i < aTest.Length; i++)
    {
        Response.Write("<br>-" + i + "~" + Convert.ToString(aTest[i]) + "<br>");
    }
Chris M
A: 

How do i convert a Request.Quesry string to an integer value. I've tried all the Convert.ToInt32 and Int32.Parse but it says Input string is not in the correct format. Im using the string value as an input to a stored procedure which takes in only integer types for that field.. Pls help. Its urgent. Thanks in advance..

<script runat="server"> private void Page_Load(object sender, System.EventArgs e){ string test = Request.QueryString[0].ToString(); int intTest = Convert.ToInt32(test); Response.Write(intTest.GetType() + "<br>" + intTest); }</script>You have to convert it
Chris M