Работа с '/' в ссылках - PullRequest
       8

Работа с '/' в ссылках

1 голос
/ 06 сентября 2010

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

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

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

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

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

www.mysite.com/yearperiod/2005/detail

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

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

edit1: С учетом этой строки: "2001/2 - Fruit"

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: Браузер (тестирование в Chrome) автоматически конвертирует %2f в /.Что теперь?

edit3: э-э-э ... похоже, IE ведет себя правильно (как требуется) ... хммм ...

  • IE отображает ссылку правильно (в кодировке) и после нажатия она остается закодированной.
  • Firefox отображает ссылку в декодированном виде и после нажатия кодируется.
  • Chrome показывает расшифрованную ссылку и после нажатия расшифровывается.

Ответы [ 2 ]

1 голос
/ 07 сентября 2010

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

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

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

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

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

3648634 - это идентификатор базы данных для этого вопроса, который используется для поиска, часть " Работа с ссылками " предназначена только для удобных описательных 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(); 
    } 
}

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

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

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

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

1 голос
/ 06 сентября 2010

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

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

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

string origStr = Server.UrlDecode(strDatePeriod);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...