Должен ли я хранить пробелы в моих URL в базе данных? Если да, то как мне их кодировать, помещая их в <a href="...">? - PullRequest
5 голосов
/ 15 мая 2011

В моем блоге я храню URI для сущностей, чтобы они могли быть настроены (и понятны). Первоначально они могли содержать пробелы (например, "/tags/ASP.NET MVC"), но проверка W3C говорит, что пробелы недопустимы.

Класс System.Uri занимает пробелы и, кажется, кодирует их так, как я хочу (например, /tags/ASP.NET MVC становится /tags/ASP.NET%20MVC), но я не хочу создавать Uri просто для того, чтобы выбросить его, это чувствует себя грязным!

Примечание. Ни один из Html.Encode, Html.AttributeEncode и Url.Encode не будет кодировать "/tags/ASP.NET MVC" до "/tags/ASP.NET%20MVC".


Редактировать: Я отредактировал часть DataType из своего вопроса, поскольку выясняется, что DataType напрямую не предоставляет никакой проверки, и нет встроенной проверки URI. Я нашел несколько дополнительных валидаторов на dataannotationsextensions.org , но он поддерживает только абсолютные URI и, похоже, пробелы могут быть там действительными.

Ответы [ 4 ]

2 голосов
/ 15 мая 2011

Кажется, что единственное разумное, что нужно сделать, это не допускать пробелов в URL.Поддержка их правильного кодирования кажется слабой в .NET: (

Я собираюсь вместо этого заменить пробелы тире, когда я их автоматически генерирую, и проверить, что они содержат только определенные символы (алфавитно-цифровые, точки, тире,косые черты).

Я думаю, что лучшим способом их использования было бы сохранение% 20 в БД, так как пространство «небезопасно», и кажется нетривиальным затем кодировать их таким образом, чтобы передатьвалидатор W3C в .NET.

0 голосов
/ 16 мая 2011

Я задал этот похожий вопрос некоторое время назад. Короткий ответ состоял в том, чтобы заменить пробелы на «-», а затем вернуться обратно. Это источник Я использовал:

private static string EncodeTitleInternal(string title)
{
        if (string.IsNullOrEmpty(title))
                return title;

        // Search engine friendly slug routine with help from http://www.intrepidstudios.com/blog/2009/2/10/function-to-generate-a-url-friendly-string.aspx

        // remove invalid characters
        title = Regex.Replace(title, @"[^\w\d\s-]", "");  // this is unicode safe, but may need to revert back to 'a-zA-Z0-9', need to check spec

        // convert multiple spaces/hyphens into one space       
        title = Regex.Replace(title, @"[\s-]+", " ").Trim(); 

        // If it's over 30 chars, take the first 30.
        title = title.Substring(0, title.Length <= 75 ? title.Length : 75).Trim(); 

        // hyphenate spaces
        title = Regex.Replace(title, @"\s", "-");

        return title;
}
0 голосов
/ 15 мая 2011

URI и URL - это две разные вещи, URL является подмножеством URI. Таким образом, URL-адрес имеет различные ограничения для URI.

Чтобы кодировать строку пути в соответствии со стандартами кодирования URL W3C, используйте HttpUtility.UrlPathEncode(string). Это добавит закодированные пробелы, которые вы ищете.

Вы должны хранить свои URL-адреса в любой форме, которая наиболее удобна для работы с ними. Может быть полезно ссылаться на них как на URI до тех пор, пока вы не закодируете их в формате, совместимом с URL, но это всего лишь семантика, которая поможет вашему проекту быть немного понятнее.

EDIT:

Если вам не нравятся кодируемые слэши, их довольно просто «декодировать», заменив кодированный %2f на более простой /:

var path = "/tags/ASP.NET MVC";
var url = HttpUtility.UrlPathEncode(path).Replace("%2f", "/");
0 голосов
/ 15 мая 2011

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

Вы можете закодировать URL с помощью метода UrlEncode () илиUrlPathEncode () метод.Однако методы возвращают разные результаты.Метод UrlEncode () преобразует каждый пробел в символ плюс (+).Метод UrlPathEncode () преобразует каждый символ пробела в строку «% 20», которая представляет пробел в шестнадцатеричной записи.

EDIT: метод javascript encodeURI будет использовать% 20 ​​вместо +.Добавьте ссылку на Microsoft.JScript и вызовите GlobalObject.encodeURI .Попробовал метод здесь и вы получите результат, который вы ищете:

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