相对于当前URL的超链接不是用户控件的路径

时间:2010-08-25 15:34:35

标签: asp.net

我的网站上有一个页面,为了这个例子,我们可以说http://myhost/Pages/Default.aspx。在Default.aspx上,我有一个名为MyControl.ascx的用户控件,它位于/Controls/MyControl.ascx中。所以树看起来像这样

      • Default.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”

5 个答案:

答案 0 :(得分:5)

你有很多选择:

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

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

  3. 您可以创建一个辅助方法,将有效的根返回到Pages文件夹,图像,Javascript等......

  4. HttpRequest.ApplicationPath将获取您可用于构建的服务器上的虚拟应用程序的根路径。

  5. 有关Pathing选项的更多信息,请阅读MSDN上的这篇文章:

    ASP.NET Web Project Paths

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

答案 1 :(得分:2)

实现这一目标的最佳方法是使用

 string.Format("{0}", Page.Request.Url.PathAndQuery);
NavigateUrl属性中的

答案 2 :(得分:1)

以防万一其他人偶然发现这件事......

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

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

答案 3 :(得分:0)

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

MyControl.ascx

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

答案 4 :(得分:0)

比这更简单。只需将usercontrol的AppRelativeTemplateSourceDirectory属性更改为父页面的相同属性的值。

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

然后用户控制中的所有相对路径都将在页面中。