在我的博客中,我将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,而且看起来我的空格在那里也是有效的。
似乎唯一明智的做法是不允许在 URL 中使用空格。对正确编码它们的支持在 .NET :(中似乎很不稳定
当我自动生成空格时,我将用破折号替换空格,并验证它们仅包含某些字符(字母数字、点、破折号、斜杠)。
我认为使用它们的最佳方法是将 %20 存储在数据库中,因为空间是"不安全的",然后以在 .NET 中传递 W3C 验证器的方式对它们进行编码似乎并不简单。
URI和URL是两个不同的东西,URL是URI的子集。因此,URL 对 URI 有不同的限制。
若要将路径字符串编码为正确的 W3C URL 编码标准,请使用 HttpUtility.UrlPathEncode(string)
。它将添加您要查找的编码空间。
您应该以对使用它们最有用的任何形式存储您的 URL。将它们称为 URI 可能很有用,直到将它们编码为 URL 兼容格式,但这只是语义,可帮助您的设计更清晰一些。
编辑:
如果您不喜欢编码斜杠,可以通过将编码的%2f
替换为更简单的/
来"解码"它们非常简单:
var path = "/tags/ASP.NET MVC";
var url = HttpUtility.UrlPathEncode(path).Replace("%2f", "/");
我没有用过它,但UrlPathEncode听起来可能会给出你想要的东西。
您可以使用 UrlEncode() 方法或 UrlPathEncode() 方法。然而, 方法返回不同的结果。这 UrlEncode() 方法转换每个空格 字符到加号字符 (+)。这 UrlPathEncode() 方法转换每个 空格字符转换为字符串"%20", 表示 中的空格 十六进制表示法。
编辑:javascript方法encodeURI将使用%20而不是+。 添加对 Microsoft.JScript 的引用并调用 GlobalObject.encodeURI。 在这里尝试了该方法,您得到了所需的结果:
我刚才问过这个类似的问题。简短的回答是用"-"替换空格,然后再次返回。这是我使用的来源:
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, @"[^wds-]", ""); // 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;
}