Как мне разобрать строку запроса с «&» в значении, используя C #? - PullRequest
5 голосов
/ 03 октября 2011

У меня есть пользовательская веб-часть на C # на странице sharepoint 2007.При нажатии на ссылку в отчете SSRS на другой странице он отправляет пользователя на мою пользовательскую страницу веб-части со строкой запроса, подобной следующей:

?tax4Elem=Docks%20&%20Chargers&ss=EU%20MOVEX&Phase=1&tax3Elem=Play%20IT&tax5Elem=Charger

Обратите внимание на значение для "tax4Elem", котороев основном "Доки и зарядные устройства".(На самом деле амперсанд может встречаться в «tax4Elem», «tax3Elem» и «tax5Elem»).

Я не могу закодировать амперсанд в этом значении, поэтому мне придется работать с этим.

Как мне разобрать эту строку запроса, чтобы она не распознала "&" в "Док-станциях и зарядных устройствах" как начало пары ключ / значение?

Спасибо заранее!кейт

Ответы [ 4 ]

1 голос
/ 03 октября 2011

Если вы действительно не можете исправить 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"];

Обратите внимание, что если строка запроса "недействительна" согласно нашему правилу, шаблон может не охватить все значения.

1 голос
/ 03 октября 2011

Я думаю, что вы не можете правильно проанализировать эту строку - она ​​была неправильно закодирована. Амперсанд в «Docks & Chargers» должен был быть закодирован как %26 вместо &:

?tax4Elem=Docks%20%26%20Chargers&ss=EU%20MOVEX&Phase=1&tax3Elem=Play%20IT&tax5Elem=Charger

Можно ли изменить код, сгенерировавший URL?

1 голос
/ 03 октября 2011

Очевидно, что запрос неверен. Однако, чтобы обойти это, вы можете взять исходный URL, а затем найти IndexOf &ss=. Затем найдите знак = непосредственно перед этим. Декодируйте (с помощью UrlDecode ), затем перекодируйте (с помощью UrlEncode ) часть между = и &ss= (значение tax4Elem). Затем восстановите строку запроса следующим образом:

correctQueryString = "?tax4Elem=" + reencodedTaxValue + remainderOfQueryString

и декодируйте его как обычно (например, с помощью ParseQueryString) в NameValueCollection.

0 голосов
/ 03 октября 2011

Или вы можете использовать метод HttpServerUtility.HtmlDecode для декодирования значения в знак '&' (амперсанд)

...