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