我遇到了当前应用程序中的一个问题,该问题需要摆弄基础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);
答案 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)