我应该在数据库中的URL中存储空格吗?如果是这样,如何将它们编入<a href="...">?</a>时对其进行编码

时间:2011-05-15 11:08:19

标签: asp.net-mvc razor data-annotations w3c-validation

在我的博客中,我将URI存储在实体上以允许它们被自定义(和友好)。最初,它们可以包含空格(例如“/tags/ASP.NET MVC”),但W3C验证表示空格无效。

System.Uri类占用空格,似乎按我的意愿对它们进行编码(例如。/tags/ASP.NET MVC变为/tags/ASP.NET%20MVC),但我不想创建Uri只是扔掉它,这感觉很脏!

注意:Html.EncodeHtml.AttributeEncodeUrl.Encode都不会将"/tags/ASP.NET MVC"编码为"/tags/ASP.NET%20MVC"


编辑:我编辑了DataType部分,因为事实证明DataType没有直接提供任何验证,也没有内置的URI验证。我在dataannotationsextensions.org找到了一些额外的验证器,但它只支持绝对URI,它看起来像空格我也有效。

4 个答案:

答案 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;
}