我在sharepoint 2007页面上有一个C#自定义webpart。在另一个页面上单击SSRS报告中的链接时,它会将用户发送到我的自定义webpart页面,其中包含如下查询字符串:
?tax4Elem=Docks%20&%20Chargers&ss=EU%20MOVEX&Phase=1&tax3Elem=Play%20IT&tax5Elem=Charger
注意“tax4Elem”的价值,这基本上是“码头和充电器”。 (&符号实际上可以出现在“tax4Elem”,“tax3Elem”和“tax5Elem”中。
我不能在该值中编码&符号,因此我将不得不使用它。
如何解析此查询字符串,使其无法识别“&”在“码头和充电器”中作为键/值对的开头?
提前致谢! 凯特
答案 0 :(得分:1)
我认为你无法正确解析该字符串 - 它编码错误。 “码头和充电器”中的&符号应编码为%26
而不是&
:
?tax4Elem=Docks%20%26%20Chargers&ss=EU%20MOVEX&Phase=1&tax3Elem=Play%20IT&tax5Elem=Charger
是否可以更改生成URL的代码?
答案 1 :(得分:1)
显然请求不正确。但是,要解决此问题,您可以获取原始URL,然后找到{0}的IndexOf。然后,在此之前找到&ss=
标志。解码(使用UrlDecode)然后重新编码(UrlEncode)=
和=
之间的部分(tax4Elem的值)。然后,重建查询字符串,如下所示:
&ss=
并将其正常解码(例如,使用ParseQueryString
)到correctQueryString = "?tax4Elem=" + reencodedTaxValue + remainderOfQueryString
。
答案 2 :(得分:1)
如果你真的无法更正网址,你仍然可以尝试解析它,但你必须做出一些决定。例如:
=
&\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"];
请注意,如果查询字符串根据我们的规则“无效”,则该模式可能无法捕获所有值。
答案 3 :(得分:-1)
或者您可以使用HttpServerUtility.HtmlDecode
方法将值解码为'&amp;' (&符号)签名