2010-09-06 2 views
1

Я читаю в ряде строк, которые имеют / «эс через них, наиболее распространенный пример является дата/номер, как 05/06, 07/08 и т.д.Работы с «/» эс в связи

Я использую ASP.NET MVC2 и генерирую ссылки с этих строк, считываемых из БД, что в этом и есть проблема.

Очевидно, что ссылка:

www.mysite.com/yearperiod/05/06/detail

не будет работать так же, как ссылка на

www.mysite.com/yearperiod/2005/detail

Что является хорошим решением этой проблемы? Моя первая мысль состоит в том, чтобы преобразовать все / в -, но затем я столкнулся с проблемой/накладными расходами на необходимость отслеживать, какие из них были конвертированы, так что, когда вы возвращаетесь в БД, я не могу случайно включить действительный - в / (если это имеет смысл)

редактировать: задумайтесь об этом, я не знаю, как следить за каждый преобразованный / ... хммм .....

edit1: Данная строка: «2001/2 - Фрукты»

var encodedLinkText = HttpContext.Current.Server.UrlEncode(linkText); //result is "2001%2f2+-+Fruit" 

но если я называю это linkhelper с моей точкой зрения тонированной ссылка выходит как: источник вида: <li><a href="2001%2f2+-+Fruit">2001/2 - Fruit</a></li> оказали ссылка: http://localhost:XXXX/Period/2001/2+-+Fruit

в то время как мне это нужно, как:

http://localhost:XXXX/Period/2001%2f2+-+Fruit

edit2: Браузер (тестирование в хроме) автоматически преобразует %2f в /. Что теперь?

Edit3: Ой-ой ... выглядит как IE ведет себя должным образом (как это требуется) ... хммм ...

  • IE отображает ссылку правильно (кодируются), и после нажатия остается закодирован.
  • Firefox показывает, что ссылка декодирована и после нажатия закодирована.
  • Хром отображает ссылку, декодированную и после нажатия которой декодируется.
+0

интересный намек на путь так сделок с ним, просто извлекая слэш по ссылке полностью 'http://stackoverflow.com/questions/3648634/ – baron

+0

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

+0

если есть шанс, не могли бы вы разместить свой метод расширения здесь? –

ответ

1

Если объект в базе данных выводит строку '05/06' , что организация должна также имеют свой уникальный идентификатор, такой как целое число первичного ключа. Не могли бы вы включить, что, как часть URL, чтобы ваш пример выше становится:

www.mysite.com/yearperiod/123/05-06/detail 

Затем вы можете конвертировать ваши косые черты в тире на содержание сердца, не беспокоясь о преобразовании их обратно, так как фактические базы данных справочной выполняется в идентификационном номере (часть «123»), а не в строке даты.

Если посмотреть на URL, StackOverflow в них что-то подобное:

stackoverflow.com/questions/3648634/dealing-with-es-in-links 

3648634 является идентификатор базы данных для этого вопроса, который используется для выполнения просмотровые, тем «дилинг-с-е-в -links 'часть просто для удобных для пользователя описательных URL-адресов и поисковой оптимизации.

Вот метод ToFriendlyUrl(), который может генерировать эти приятные глазу, SO стиль, URL без необходимости прибегать к URL кодирования, который может сделать URL-адреса выглядят некрасиво:

public static class UrlEncoder 
{ 
    public static string ToFriendlyUrl (this UrlHelper helper, 
     string urlToEncode) 
    { 
     urlToEncode = (urlToEncode ?? "").Trim().ToLower(); 

     StringBuilder url = new StringBuilder(); 

     foreach (char ch in urlToEncode) 
     { 
      switch (ch) 
      { 
       case ' ': 
        url.Append('-'); 
        break; 
       case '&': 
        url.Append("and"); 
        break; 
       case '\'': 
        break; 
       default: 
        if ((ch >= '0' && ch <= '9') || 
         (ch >= 'a' && ch <= 'z')) 
        { 
         url.Append(ch); 
        } 
        else 
        { 
         url.Append('-'); 
        } 
        break; 
      } 
     } 

     return url.ToString(); 
    } 
} 

Вы можете настроить код для работы с другие специальные символы, такие как & амперсанды &, но вы должны получить общую идею. Вы можете использовать на ваш взгляд, как так:

<%= Url.ToFriendlyUrl(item.Title) %> 

Таким образом, в двух словах, не Релли на UrlEncoding, но использовать утилиту FriendlyUrl как показано выше, и включают в себя идентификатор базы данных для фактической базы данных справочной ,

Я написал сообщение в блоге в этой теме ее http://www.dominicpettifer.co.uk/Blog/34/asp-net-mvc-and-clean-seo-friendly-urls

+0

Вау, это гораздо лучшее решение ... Не могу поверить, что я не думал об использовании этого вместо этого, кажется таким очевидным сейчас! Обращение назад было тем, что меня беспокоило, но полагаться на id будет лучше, а затем я могу делать все, что захочу, без беспокойства о «уникальности». Спасибо за Ваш ответ! – baron

1

Почему бы не использовать Server.UrlEncode. Вы можете UrlEncode всю строку.

string strDatePeriod = Server.UrlEncode("05/06"); 

Чтобы преобразовать его обратно в исходную строку, вы просто должны использовать Server.UrlDecode

string origStr = Server.UrlDecode(strDatePeriod); 
+0

Могу ли я использовать этот код только в представлении? Я пытаюсь использовать его в моем классе помощника Pagelink. Какое пространство имен необходимо импортировать для 'Server.' Я думал, что это' System.Web' – baron

+0

, вы можете просто вызвать его напрямую через 'HttpContext.Current.Server.UrlEncode' и' HttpContext.Current.Server.UrlDecode' из пространства имен ' System.Web' –

+0

Пожалуйста, ознакомьтесь с моими изменениями, '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' Server.UrlEncode кажется работающим, но когда он отображается, – baron

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