将链接明确地视为绝对链接?

7

我有一个控件在我的页面上,它需要用户输入URL并允许用户测试链接。

<asp:HyperLink ID="HyperLink1" runat="server" NavigateUrl='<%# Eval("URL") %>' Target="_blank">Click here to test link</asp:HyperLink>

问题在于如果用户输入URL“google.com”,则该链接将被视为“http://localhost/google.com”。我必须输入“http://www.google.com”才能到达正确的位置。
是否有可能在所有情况下将链接视为绝对链接?
4个回答

4

试试这个...

NavigateUrl='<%# Eval("URL", "http://{0}") %>'

编辑:如果您想要添加检查它是否已包含http://,那么应该像这样...

NavigateUrl=<%# Eval("URL").ToString().Contains("http://") == true ? Eval("URL") :
 "http://" + Eval("URL")  %>

这样行吗?如果输入已经有http怎么办?如果是安全的(https)网站或FTP网站呢? - Diskdrive
@Muhammed:+1 == true 是不必要的,对吧?@stickman 不要期望看到任何从原始URL中找到协议的算法。那完全是毫无意义和不可能的。 - naveen
没错,你说得对。我想那会帮助他理解 :) - Muhammad Akhtar
@naveen:我不是在尝试解决协议的问题。我希望DNS服务器像我在浏览器中输入完整URL一样解析协议。如果我在URL前面加上http://,而DNS通常会将其解析为https://,那么它是否仍然会解析为https地址? - Diskdrive
@Muhammad:最终我采用了你的解决方案,但是我按照colebrand所说的方式进行了修改,使其检查.Contains("://")。这样做是为了防止他们输入https地址时,它不会跳转到http://https/...。最好的情况是只发送URL给浏览器,让浏览器自行处理,但这可能是下一个最佳解决方案。谢谢。 - Diskdrive
@stickman:我写了一些作为答案的东西。它只是一个解释。我最初是在评论中开始的,但最终得写下来了。 - naveen

3
这个问题是学术性质还是需要解决的问题?首先,认为只有http://www.google.com 是正确的,而http://localhost/google.com 是不正确的,这种观念是非常错误的。我认为你的问题是这样的:当你从数据源中获取URL时,它们是原始的URL,ASP.NET Framework将其识别为相对URL。但你希望使用它们的绝对URI。但问题并不在框架上,因为http://localhost/google.com 可能是一个有效的URL。同样的例子是网站builtWith。它有像http://builtwith.com/facebook.com 这样的有效URL。所以,问题在于输入数据的地方。你为什么不能放置一个小组合框,让用户轻松添加协议,然后将URL附加到它上面,如下所示?希望这可以帮助你。

感谢您的解释。首先,是的,这是我必须解决的问题。http://localhost/google.com 是一个有效的 URL,事实上,我相信任何东西都可以成为一个有效的 URL,这取决于 DNS 如何处理它。然而,在这种情况下,用户被要求指定一个链接。大多数用户会认为它是绝对链接而不是相对链接,因此将它们带到 http://localhost/google.com 将不是他们想要的。我喜欢下拉框的想法,这可能是个好主意。 - Diskdrive
这个假设是无效的 - 我相信任何东西都可以作为有效的URL,这只取决于DNS如何处理 - Alex Aza
@Alex:好的,你能给我展示一个无效的URL吗?DNS将无法解析它。 - Diskdrive
google.com 是无效的 URL。您可以访问 http://urlvalidator.com/ 进行检查。 - Alex Aza

2

根据您的评论:

如果它是一个安全的(https)站点或FTP站点怎么办?

以及

这样行吗?如果输入中已经有了 http 呢?如果它是一个安全的(https)站点或FTP站点怎么办?

以及

问题在于,如果用户输入URL“google.com”,则链接将被视为“http://localhost/google.com”。我必须输入“http://www.google.com”才能到达正确的位置。

是否可能在所有情况下将链接视为绝对链接?

你要求的是魔法。我们这里不擅长魔法。您必须指定某些内容,以便知道它可以成为特定类型的域。告诉他们,如果他们没有指定协议,则会将其作为 http://,其余时间由他们指定协议。这是你所能做的。

至于确定它是否具有协议,请检查string.Contains("://"),因为这基本上是浏览器要做的。


为什么这是魔法?我只是想要求,不要在所有不以http开头的链接前面加上http://localhost,只需在新的浏览器窗口中输入用户指定的链接并让其自行解决。 - Diskdrive
我仍然不明白为什么这是“魔法”。 魔法意味着存在某些缺乏信息的情况,这会阻止我做到这一点。但实际上并没有 - 无论用户输入什么作为他们的URL,我都希望它表现出与他们在浏览器中输入该URL相同的行为。 - Diskdrive
错误。你错了。看,他们给你“google.com”,你怎么知道它是http、https还是ftp...协议与DNS无关。你认为协议是如何工作的?我很高兴你使用了我的答案,但接受了别人的答案。除了想让它神奇地知道如何使用协议外,你根本不确定自己想要做什么。我非常愿意把这件事当成教育,但你的固执不允许这样做,是吧? - jcolebrand
@jcolebrand:别那么激动,没必要这样。就像我说的,我正在尝试复制浏览器对URL的精确操作。我不知道它是如何做到的,也许是DNS或者浏览器 - 我所做的一些假设是关于协议的,但我仍然不确定它是否与浏览器使用的假设相同。如果这是“魔法”,在运行提示符中键入firefox“google.com”将会给我一个404。 - Diskdrive
@jcolebrand - 我选择了另一个答案,因为他提供了实际的代码,并且我认为他是最有帮助的。我决定根据您的建议调整他的代码,这就是为什么您得到了赞的原因。 - Diskdrive
显示剩余3条评论

1
在您的代码后台中,检查用户输入是否包含“http://”,如果没有,则追加它。您也可以使用JavaScript来实现这一点。

1
如果它是一个安全的(https)网站或FTP网站呢? - Diskdrive
你需要检查http和https两种协议。 - Kenny Ma
此外,应该使用“prepend”而不是“append”。 - Shibumi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接