【问题标题】:Hyperlink relative to current URL not path of user control相对于当前 URL 的超链接不是用户控件的路径
【发布时间】:2010-08-25 15:34:34
【问题描述】:

我的网站上有一个页面,就本示例而言,假设为http://myhost/Pages/Default.aspx。在 Default.aspx 上,我有一个名为 MyControl.ascx 的用户控件,它位于 /Controls/MyControl.ascx 中。所以树看起来像这样

    • 页数
      • 默认.aspx
    • 控件
      • MyControl.ascx

每当我在 MyControl.ascx 上放置一个 HyperLink 控件并指定一个 NavigateUrl 时,此路径都是相对于控件的,而不是页面的 URL。例如,如果我在 NavigateUrl 中指定了“AboutMe.aspx”,则 URL 将呈现为 http://myhost/Controls/AboutMe.aspx 而不是 http://myhost/Pages/AboutMe.aspx。有什么办法可以使这个相对于页面 URL?我在这里尝试了解决方案:Relative path from an ASP.NET user control NavigateUrl,但它对我不起作用。

编辑

为了澄清,我希望它足够通用,以便如果我不知道解决方案的路径是什么,那么解决方案会起作用。所以我真的不想在 NavigateUrl 中硬编码“~/Pages/Default.aspx”

【问题讨论】:

标签: asp.net


【解决方案1】:

你有很多选择:

  1. 您可以使用~ 运算符对 URL 进行硬编码,该运算符为您提供根,然后从那里定义它,例如:~/Pages/AboutMe.aspx。请记住,~ 运算符仅在服务器控件和服务器代码中被识别。

  2. 您还可以使用.. 将您带到您想要的位置,因为它将导航到文件夹结构,例如:../Pages/AboutMe.aspx

  3. 您可以创建一个辅助方法来为您返回页面文件夹、图像、Javascript 等的有效根目录...

  4. HttpRequest.ApplicationPath 将获取您的虚拟应用程序在服务器上的根路径,您可以使用它来构建。

有关路径选项的更多信息,您应该阅读 MSDN 上的这篇文章:

ASP.NET Web Project Paths

编辑:根据您对问题的编辑,您应该通过属性将相对 URL 传递给您的用户控件。让使用该控件的页面定义所需资源的相对路径。

【讨论】:

  • @Kyle 您是否还有其他一些要求会使您无法传递您想要使用的相对网址?
  • 不,那对我来说可能是最好的解决方案。抱歉耽搁了。
【解决方案2】:

最好的方法是使用

 string.Format("{0}", Page.Request.Url.PathAndQuery);

在 NavigateUrl 属性中

【讨论】:

  • 这为您提供了非 url 重写版本,以及发布的数据。
【解决方案3】:

以防万一其他人像我一样偶然发现这个......

在后面的代码中,我将 NavigateUrl 设置为:

link.NavigateUrl = Page.ResolveUrl("aboutus.aspx");

【讨论】:

    【解决方案4】:

    如何设置超链接的NavigateUrl?如果我使用~ 字符设置它,那么它会按预期工作:

    MyControl.ascx

    <asp:HyperLink runat="server" NavigateUrl="~/Pages/Default.aspx" ... >
    

    【讨论】:

      【解决方案5】:

      比这更简单。只需将用户控件的 AppRelativeTemplateSourceDirectory 属性更改为父 Page 相同属性的值即可。

      protected override void OnInit(EventArgs e)
      {
          AppRelativeTemplateSourceDirectory = Page.AppRelativeTemplateSourceDirectory;
          base.OnInit(e);
      }
      

      如果页面中有,则用户控件中的所有相对路径都将是。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-01-06
        • 1970-01-01
        • 1970-01-01
        • 2012-07-26
        • 2019-03-08
        • 1970-01-01
        • 1970-01-01
        • 2019-09-07
        相关资源
        最近更新 更多