什么是在C#中重复删除查询字符串的最快方法(ASP.net)

时间:2009-02-03 10:27:24

标签: c# asp.net-2.0 query-string

我遇到一个问题,即该公司使用业务跟踪系统捕获用户首次访问并将其重定向到他们尝试访问的页面,但附加了一个refferer URL ... 现在,因为引用网址带有该人试图访问的网址(不要问为什么,我不知道)它会导致我重复每个值。

所以参观这个...

home.aspx测试=试验&安培; TEST2 = TEST2

成为

home.aspx测试=试验&安培; TEST2 = TEST2&安培; referrerurl = home.aspx测试=试验&安培; TEST2 = TEST2

现在,URL编码推荐人会对问题进行排序,但我更有机会受到大猩猩的骚扰;所以问题就在于此。 如何从.QueryString重复输出?

目前我正在使用这个...

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

}

(忽略try / catch我们有应用程序级别错误捕获,但我还在玩它。)

我正在使用C#.net 2

由于


[其他信息]

reffererURL将始终位于字符串的末尾,因此可以在此之后删除所有查询字符串?

我尝试过使用

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

和...

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

两者仍然产生重复


我可以使用Trim但是有更清洁/更快的方法来实现这一点。

4 个答案:

答案 0 :(得分:3)

这样的事情应该有效:

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

此代码将创建一个新的NameValueCollection,我们在其中重建查询字符串。然后我们检查a的每个值,这通常表示值重复多次。例如,url home.aspx?test = test&amp; test2 = test2&amp; referrerurl = home.aspx?test = test&amp; test2 = test2将为查询字符串值“test”生成值“test,test”。

答案 1 :(得分:2)

我认为你无法控制重定向,对吗?我自己去过那里,很抱歉。你的问题在理论上是无法解决的,但趋势似乎是没有URI编码参数的可爱人只是将它们附加到URL,所以你可以获得原始查询字符串(来自request.RawUrL属性)并忽略所有内容之后referrerUrl。这很丑陋,但基本上是:

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

ReplaceQuerystring现在接收查询字符串为“var1 = valA&amp; var2 = varB&amp;”。只需在&符号上删除它,将每个部分打上等号,URL解码并存储在某处(实际上,request.QueryString应该是可变的,所以这可能是一个选项)。至少,这几乎就是我做的方式。为了您的利益,我希望有人能提出更好的解决方案:)

答案 2 :(得分:0)

[示例网址]

Default2.aspx测试=试验&安培; TEST2 = TEST2&安培; referrerURL = http://www.test.com/home.aspx?test=test&test=test

[这将产生]

测试=测试
测试=测试
TEST2 = TEST2
referrerURL = http://www.test.com/home.aspx?test=test

[这是gustafc答案的编辑版本......]

    //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[] { '&' });

[运行测试会产生以下内容]

-0〜测试=测试

-1〜TEST2 = TEST2

[我希望收到的内容]

(为了完整性,这是简单的声明)

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

答案 3 :(得分:0)

以下示例读取所有“email”查询字符串参数,并仅通过读取“email”字符串并将内容添加到名为“email1”的新字符串中,直到找到逗号为止。新手使用非常简单易用。

string email = Request.QueryString["email"];
string email1 = "";
for(int i = 0; i < email.Length; i++)
{
    if (email[i] != ',')
    {
        email1 += email[i].ToString();
    }
    else
    {
        break;
    }
}
email = email1;