![](/img/trans.png)
[英]How do I correctly parse a URI query string into a name-value collection in C#?
[英]How do I parse a query string with “&” in the value using C#?
我在sharepoint 2007页面上有一个C#定制Webpart。 单击另一页上的SSRS报告中的链接时,它将使用查询字符串将用户发送到我的自定义Webpart页面,如下所示:
?tax4Elem=Docks%20&%20Chargers&ss=EU%20MOVEX&Phase=1&tax3Elem=Play%20IT&tax5Elem=Charger
注意“ tax4Elem”的值,它基本上是“ Docks&Chargers”。 (“&”号实际上可以出现在“ tax4Elem”,“ tax3Elem”和“ tax5Elem”中)。
我不能在该值中编码与号,因此我将不得不对此进行处理。
如何解析此查询字符串,以使它无法将“码头和充电器”中的“&”识别为键/值对的开头?
提前致谢! 凯特
我认为您无法正确解析该字符串-编码错误。 “基座和充电器”中的&字符应编码为%26
而不是&
:
?tax4Elem=Docks%20%26%20Chargers&ss=EU%20MOVEX&Phase=1&tax3Elem=Play%20IT&tax5Elem=Charger
是否可以更改生成URL的代码?
显然,该请求是不正确的。 但是,要解决此问题,可以采用原始URL,然后找到&ss=
的IndexOf。 然后,在此之前找到=
符号。 解码(使用UrlDecode ),然后重新编码(使用UrlEncode ) =
和&ss=
(tax4Elem的值)之间的部分。 然后,像这样重建查询字符串:
correctQueryString = "?tax4Elem=" + reencodedTaxValue + remainderOfQueryString
并将其正常解码(例如,使用ParseQueryString
)为NameValueCollection
。
如果您确实无法纠正该URL,则仍然可以尝试解析该URL,但是您必须做出一些决定。 例如:
=
&\\w+
) 捕获这些对的一种可能方法是:
MatchCollection matches = Regex.Matches(s, @"\G[?&](?<Key>\w+)=(?<Value>.*?(?=$|&\w+=))");
var values = matches.Cast<Match>()
.ToDictionary(m => m.Groups["Key"].Value,
m => HttpUtility.UrlDecode(m.Groups["Value"].Value),
StringComparer.OrdinalIgnoreCase);
然后,您可以获取值:
string tax4 = values["tax4Elem"];
请注意,如果根据我们的规则查询字符串为“无效”,则该模式可能不会捕获所有值。
或者,您可以使用HttpServerUtility.HtmlDecode
方法将值解码为'&'(与号)符号
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.