2013-07-03 2 views
0

Попытка присоединиться к списку строк вместе с помощью string.join. Когда я использую строку Separator «ИЛИ», белые пробелы заменяются на «+», что нарушает мою строку targetUri. Ниже приведен код, используемый для соединения.Ошибка замены строки при использовании string.join

if (DocumentSearchListViewModel.Filter == null) 
     { 
      return "http://000.000.00.00:8080/value/value/search/json?terms=value%20OR%20value&target=TEST2&maxResults=5"; 
     } 

     var targetUri = "http://000.000.00.00:8080/value/value/search/json?"; 

     NameValueCollection termsString = System.Web.HttpUtility.ParseQueryString(string.Empty); 

     if (!string.IsNullOrWhiteSpace(DocumentSearchListViewModel.Filter.Keywords)) 
     { 
      if (!string.IsNullOrWhiteSpace(DocumentSearchListViewModel.Filter.Author)) 
      { 
       DocumentSearchListViewModel.Filter.Keywords += (" " + DocumentSearchListViewModel.Filter.Author); 
      } 

      IList<string> keywords = DocumentSearchListViewModel.Filter.Keywords.Split(); 

      termsString["terms"] = string.Join(" OR ", keywords);   
     }   

     targetUri += termsString.ToString(); 
     targetUri += "&target=TEST2&maxResults="; 
     targetUri += DocumentSearchListViewModel.Filter.MaxNumberOfResults ?? "5"; 

     return targetUri; 

Я выполнил множество поисковых запросов в Google, но не смог найти ничего, что говорит о замене символов string.join. И во время моей отладки я смог сузить ее до строки termsString, где возникла проблема.

Вот конкретный пример строки я получаю из: условия = value1 + или + значение2 + или + Value3

Как бы остановить белые пространства от заменяются + символов?

Cheers,

Джеймс

+2

'+' добавлен в URL-адрес. Вы кодируете URL-код в какой-либо другой части вашего кода? Если вы установили точку останова и проверили значение, возвращаемое строкой. Джой, держу пари, что он не содержит никаких символов «+» –

+0

, как вы используете 'termsString [" terms "]' значение? –

+1

Проблема не в 'string.Join', ваши ключевые слова должны содержать' + 'как-то, или заменяются после. –

ответ

-1

Для того, чтобы получить URL декодируется значение на стороне сервера, вы должны использовать:

var encoded = "terms=value1+OR+value2+OR+value3"; 
var decoded = System.Web.HttpUtility.UrlDecode(encoded); 

@PanagiotisKanavos, относительно моего предыдущего предложение использовать вместо %20 пространства, взгляните на это JS:

var uri1="terms=value1%20OR%20value2%20OR%20value3"; 
var uri2="terms=value1+OR+value+OR+value3"; 
document.write(decodeURIComponent(uri1)); 
document.write("<br/>"); 
document.write(decodeURIComponent(uri2)); 

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

+0

String.Join НЕ кодирует ничего. Замена пробелов на% 20 приведет к дополнительному кодированию «%», когда результат будет закодирован. Кроме того, «+» является допустимым URL-кодированием пространств тоже –

+0

Я знаю это, и я никогда этого не говорил, но поскольку контекст об использовании значения 'termsString [" terms "]' не указан, я сделал предложение, которое может помощь для отладки. Как вы узнали, что в нем не задействован настраиваемый URL-адрес? –

+0

@PanagiotisKanavos, поэтому я предложил использовать '% 20' в предыдущей версии моего ответа: [http://stackoverflow.com/a/1211249/674700](http://stackoverflow.com/a/ 1211249/674700) (просто чтобы исключить возможность такой _picky_ системы). Вот демонстрация [http://jsfiddle.net/a4TnE/](http://jsfiddle.net/a4TnE/). –

Смежные вопросы