【问题标题】:Explicitly treat link as an absolute link?明确将链接视为绝对链接?
【发布时间】:2011-09-05 23:49:28
【问题描述】:

我的一个页面上有一个控件,它接受一些用户输入 (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”放到正确的地方。

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

【问题讨论】:

    标签: c# asp.net html navigation


    【解决方案1】:

    试试这个...

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

    编辑:如果你想添加检查它是否已经包含http://那么它应该像..

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

    【讨论】:

    • 这行得通吗?如果输入中已经有 http 怎么办?如果它是安全 (https) 站点或 ftp 站点呢?
    • @Muhammed:+1 == true 是不必要的,对吧? @stickman 不希望看到任何从原始 url 中找到协议的算法。那是完全没有意义和不可能的。
    • 是的;你说的对。我想这会帮助他理解:)
    • @naveen :我不想解决协议。我希望 DNS 服务器解析协议,就像我在浏览器中输入确切的 URL 一样。如果我将 http:// 放在通常由 DNS 解析为 https:// 的 URL 前面,它还会解析为 https 地址吗?
    • @Muhammad :我最终使用了您的解决方案,但我像 colebrand 所说的那样检查了 .Contains("://") 。这是以防万一他们确实输入了 https 地址,它不会转到 https... 最好我希望它只将 url 发送到浏览器并让浏览器按照自己的条件处理它,但这是可能是下一个最佳解决方案。谢谢。
    【解决方案2】:

    在您的代码隐藏中,检查用户输入是否包含“http://”,如果不包含则附加它。您也可以使用 JavaScript 来执行此操作。

    【讨论】:

    • 如果它是安全 (https) 站点或 ftp 站点呢?
    • 你同时检查 http 和 https。
    • 另外,“前置”,而不是“附加”。
    【解决方案3】:

    根据您的 cmets:

    如果它是安全 (https) 站点或 FTP 站点呢?

    这行得通吗?如果输入中已经有http 怎么办?如果它是安全 (https) 站点或 FTP 站点怎么办?

    问题是如果用户输入 URL“google.com”,那么链接将被视为“http://localhost/google.com”。我必须把“http://www.google.com”放到正确的地方。

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

    你要求魔法。我们这里不专门研究魔法。您必须指定 something 让您知道它可以成为特定类型的域。告诉他们如果他们没有将您指定为 http:// 的协议,其余时间由他们指定协议。这是你所能做的。

    至于确定它是否有协议,请检查string.Contains("://"),因为无论如何浏览器都会这样做,或多或少。

    【讨论】:

    • 为什么这么神奇?我要问的是,不要将localhost放在所有不以http开头的链接的前面,只需输入用户在新浏览器窗口中指定的任何链接,让它自行解决。
    • 不,这不是你要问的。链接 url 的规范是,如果它们不以协议开头,它们会在执行时附加到页面的当前路径。
    • 我还是不明白它为什么这么神奇。魔术意味着缺少一些信息,阻止我这样做。但是没有 - 但是用户输入了他们的 URL,我希望它显示出与他们在浏览器中输入该 URL 相同的行为。
    • 错误。你大错特错了。看,根据他们给你的“google.com”,你怎么知道它是http、https还是ftp……协议与DNS无关。您认为协议如何运作?我喜欢你使用我的答案但接受了别人的答案。你根本不确定你想做什么,只是你想让它神奇地知道如何使用协议。我非常愿意为教育做这件事,但你的猪头不会允许这样做,是吗?
    • @jcolebrand : 好伙伴,没必要这么咄咄逼人。就像我说的那样,我试图准确地复制浏览器对 URL 所做的事情。我不知道它是如何做到的,也许是 DNS 或者是浏览器——我所做的对协议做了一些假设,但我仍然不确定它是否与浏览器使用的假设相同。如果它是“魔法”,在运行提示中输入 firefox“google.com”会给我一个 404。
    【解决方案4】:

    这是学术性质的问题还是您有问题要解决?

    首先,http://www.google.com 是正确的位置而http://localhost/google.com 是错误的概念是非常错误的。

    我看到的问题是这样的。
    当您从数据源中提取 url 时,会有原始 url 被 ASP.NET Framework 识别为相对 URL。但是你希望他们使用他们的绝对uri。

    但问题不在于框架,因为http://localhost/google.com 可能是一个有效的 URL。
    一个很好的例子是网站builtWith。它具有有效的 URL,例如 http://builtwith.com/facebook.com

    因此,问题出在您输入数据的地方。为什么不能放置一个小的组合,以便用户可以轻松添加协议,然后将 url 附加到它,如下所示?

    希望这会有所帮助。

    【讨论】:

    • 感谢您的解释。首先,是的,这是我必须解决的问题。 localhost/google.com 是一个有效的 url,事实上,我很确定任何东西都是一个有效的 URL,它只取决于 DNS 如何处理它。但是,在这种情况下,会要求用户指定一个链接。大多数用户会认为这是一个绝对链接而不是相对链接,因此将他们带到localhost/google.com 并不是他们想要的。我喜欢关于下拉框的想法,但它可能是一个想法。
    • 此假设无效 - I'm pretty sure anything is a valid URL, it just depends on how the DNS treats
    • @Alex : 好的,你能告诉我一个 DNS 无法解析的无效 URL 吗?
    • google.com 的网址无效。你可以去http://urlvalidator.com/查看。
    猜你喜欢
    • 2010-10-07
    • 2012-04-02
    • 2015-01-13
    • 1970-01-01
    • 2019-04-04
    • 1970-01-01
    • 2013-08-04
    • 2021-11-29
    • 1970-01-01
    相关资源
    最近更新 更多