一种为Web请求生成QueryString参数的简洁方法

时间:2008-12-17 16:59:12

标签: c# .net asp.net url

我遇到了当前应用程序中的一个问题,该问题需要摆弄基础Page类(我的所有页面都继承自此类)中的查询字符串来解决问题。由于我的一些页面使用查询字符串,我想知道是否有任何类提供简洁的查询字符串操作。

代码示例:

// What happens if I want to future manipulate the query string elsewhere
// (e.g. maybe rewrite when the request comes back in)
// Or maybe the URL already has a query string (and the ? is invalid)

Response.Redirect(Request.Path + "?ProductID=" + productId);

6 个答案:

答案 0 :(得分:4)

按照建议的人使用HttpUtility.ParseQueryString(然后删除)。

这样可行,因为该方法的返回值实际上是HttpValueCollection,它继承NameValueCollection(并且是内部的,您不能直接引用它)。然后,您可以正常设置集合中的名称/值(包括添加/删除),并调用ToString - 这将生成完成的查询字符串,因为HttpValueCollection会覆盖ToString以重现实际查询字符串。

答案 1 :(得分:4)

我希望找到一个内置于框架中的解决方案,但却没有。 (框架中的那些方法需要做很多工作才能使其变得简单和干净)

在尝试了几种替代方案后,我目前使用以下扩展方法:(发布更好的解决方案或评论,如果你有的话)

public static class UriExtensions
{
    public static Uri AddQuery(this Uri uri, string name, string value)
    {
        string newUrl = uri.OriginalString;

        if (newUrl.EndsWith("&") || newUrl.EndsWith("?"))
            newUrl = string.Format("{0}{1}={2}", newUrl, name, value);
        else if (newUrl.Contains("?"))
            newUrl = string.Format("{0}&{1}={2}", newUrl, name, value);
        else
            newUrl = string.Format("{0}?{1}={2}", newUrl, name, value);

        return new Uri(newUrl);
    }
}

这种扩展方法可以实现非常干净的重定向和uri操作:

Response.Redirect(Request.Url.AddQuery("ProductID", productId).ToString());

// Will generate a URL of www.google.com/search?q=asp.net
var url = new Uri("www.google.com/search").AddQuery("q", "asp.net")

将适用于以下网址:

"http://www.google.com/somepage"
"http://www.google.com/somepage?"
"http://www.google.com/somepage?OldQuery=Data"
"http://www.google.com/somepage?OldQuery=Data&"

答案 2 :(得分:2)

请注意,无论您使用何种路线,都应该对值进行编码 - Uri.EscapeDataString应该为您执行此操作:

string s = string.Format("http://somesite?foo={0}&bar={1}",
            Uri.EscapeDataString("&hehe"),
            Uri.EscapeDataString("#mwaha"));

答案 3 :(得分:0)

我通常做的只是重建查询字符串。 Request有一个QueryString集合。

你可以通过迭代来获取当前(未编码的)参数,然后将它们连接在一起(随时编码)与适当的分隔符。

优点是Asp.Net已经为您完成了原始解析,因此您无需担心边缘情况,例如尾随&和?s。

答案 4 :(得分:0)

检查这个!!!

// First Get The Method Used by Request i.e Get/POST from current Context
string method = context.Request.HttpMethod;

// Declare a NameValueCollection Pair to store QueryString parameters from Web Request
NameValueCollection queryStringNameValCollection = new NameValueCollection();

if (method.ToLower().Equals("post")) // Web Request Method is Post
{
   string contenttype = context.Request.ContentType;

   if (contenttype.ToLower().Equals("application/x-www-form-urlencoded"))
   {
      int data = context.Request.ContentLength;
      byte[] bytData = context.Request.BinaryRead(context.Request.ContentLength);
      queryStringNameValCollection = context.Request.Params;
   }
}
else // Web Request Method is Get
{
   queryStringNameValCollection = context.Request.QueryString;
}

// Now Finally if you want all the KEYS from QueryString in ArrayList
ArrayList arrListKeys = new ArrayList();

for (int index = 0; index < queryStringNameValCollection.Count; index++)
{
   string key = queryStringNameValCollection.GetKey(index);
   if (!string.IsNullOrEmpty(key))
   {
      arrListKeys.Add(key.ToLower());
   }
}

答案 5 :(得分:0)

我找到了使用get参数轻松操作的方法。

public static string UrlFormatParams(this string url, string paramsPattern, params object[] paramsValues)
{
    string[] s = url.Split(new string[] {"?"}, StringSplitOptions.RemoveEmptyEntries);
    string newQueryString = String.Format(paramsPattern, paramsValues);
    List<string> pairs = new List<string>();

    NameValueCollection urlQueryCol = null;
    NameValueCollection newQueryCol = HttpUtility.ParseQueryString(newQueryString);

    if (1 == s.Length)
    {
        urlQueryCol = new NameValueCollection();
    }
    else
    {
        urlQueryCol = HttpUtility.ParseQueryString(s[1]);
    }



    for (int i = 0; i < newQueryCol.Count; i++)
    {
        string key = newQueryCol.AllKeys[i];
        urlQueryCol[key] = newQueryCol[key];
    }

    for (int i = 0; i < urlQueryCol.Count; i++)
    {
        string key = urlQueryCol.AllKeys[i];
        string pair = String.Format("{0}={1}", key, urlQueryCol[key]);
        pairs.Add(pair);
    }

    newQueryString = String.Join("&", pairs.ToArray());

    return String.Format("{0}?{1}", s[0], newQueryString);
}

一样使用它
"~/SearchInHistory.aspx".UrlFormatParams("t={0}&s={1}", searchType, searchString)