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



在我的博客中,我将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,而且看起来我的空格在那里也是有效的。

似乎唯一明智的做法是不允许在 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;
}

相关内容

最新更新